<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2172604997001934264</atom:id><lastBuildDate>Mon, 07 Oct 2024 06:29:54 +0000</lastBuildDate><category>AppEngine</category><category>Google</category><category>Nethrone</category><title>More of A Blog</title><description></description><link>http://xccv.blogspot.com/</link><managingEditor>noreply@blogger.com (habeanf)</managingEditor><generator>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2172604997001934264.post-7693638923337935251</guid><pubDate>Wed, 02 Nov 2011 21:07:00 +0000</pubDate><atom:updated>2011-11-02T23:51:51.602+02:00</atom:updated><title>Some Data Analysis of Nike Night Run Tel Aviv 2011</title><description>I was playing around with google fusion tables and came across the &lt;a href=&quot;http://www.google.com/fusiontables/DataSource?snapid=S306809ChVr&quot;&gt;publicized database of the nike night run tel aviv 2011 results.&lt;/a&gt;  Playing with data is a nice way to spend an evening while my leg muscles recover from last night&#39;s run so I figured I might as well blog it.
&lt;br /&gt;
We&#39;ll start with a visualization of the two starting groups on a timeline:&lt;br /&gt;
&lt;center&gt;&lt;iframe frameborder=&quot;no&quot; height=&quot;300px&quot; scrolling=&quot;no&quot; src=&quot;http://www.google.com/fusiontables/embedviz?gco_allowHtml=true&amp;amp;gco_displayAnnotations=true&amp;amp;gco_wmode=opaque&amp;amp;gco_chartArea=%7B%22top%22%3A%2230%22%7D&amp;amp;containerId=gviz_canvas&amp;amp;rmax=250&amp;amp;q=select+col0%2C+col4+from+2044200+&amp;amp;qrs=where+col0+%3E%3D+&amp;amp;qre=+and+col0+%3C%3D+&amp;amp;qe=+order+by+col0+asc&amp;amp;viz=GVIZ&amp;amp;t=TIMELINE&amp;amp;width=500&amp;amp;height=300&quot; width=&quot;500px&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;center&gt;x axis - finish time&lt;/center&gt;&lt;center&gt;y axis - place in starting group&lt;/center&gt;
&lt;br /&gt;
You&#39;ll notice an area where the graph bounces between the two data sets - I think this is due to a constraint in the visualization itself requiring a single data point on the y axis for each point on the timeline / x axis. &amp;nbsp;The visualization emphasizes the bulk of the runners clocking in at 50 to 60 minutes, with some late sprinters in the second group and a handful of runners that overestimated their times from the first group.&lt;br /&gt;
&lt;br /&gt;
We can also see visualize fun facts about the demographics of the runners:&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
Sex Distribution of Runners in the first group
&lt;iframe frameborder=&quot;no&quot; height=&quot;300px&quot; scrolling=&quot;no&quot; src=&quot;http://www.google.com/fusiontables/embedviz?gco_chartArea=%7B%22top%22%3A%2230%22%7D&amp;amp;containerId=gviz_canvas&amp;amp;q=select+col2%2C+count()+from+2044200+where+col13+%3D+&#39;group1&#39;&amp;amp;qrs=+and+col2+%3E%3D+&amp;amp;qre=+and+col2+%3C%3D+&amp;amp;qe=+group+by++col2+limit+2&amp;amp;viz=GVIZ&amp;amp;t=PIE&amp;amp;width=500&amp;amp;height=300&quot; width=&quot;500px&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
Sex Distribution of Runners in the second group
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;300px&quot; scrolling=&quot;no&quot; src=&quot;http://www.google.com/fusiontables/embedviz?gco_chartArea=%7B%22top%22%3A%2230%22%7D&amp;amp;containerId=gviz_canvas&amp;amp;q=select+col2%2C+count()+from+2044200+where+col13+%3D+&#39;group2&#39;&amp;amp;qrs=+and+col2+%3E%3D+&amp;amp;qre=+and+col2+%3C%3D+&amp;amp;qe=+group+by++col2+limit+2&amp;amp;viz=GVIZ&amp;amp;t=PIE&amp;amp;width=500&amp;amp;height=300&quot; width=&quot;500px&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;
Sex Distribution of All Runners&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;300px&quot; scrolling=&quot;no&quot; src=&quot;http://www.google.com/fusiontables/embedviz?gco_chartArea=%7B%22top%22%3A%2230%22%7D&amp;amp;containerId=gviz_canvas&amp;amp;q=select+col2%2C+count()+from+2044200+&amp;amp;qrs=where+col2+%3E%3D+&amp;amp;qre=+and+col2+%3C%3D+&amp;amp;qe=+group+by++col2+limit+4&amp;amp;viz=GVIZ&amp;amp;t=PIE&amp;amp;width=500&amp;amp;height=300&quot; width=&quot;500px&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;br /&gt;
Since we have the names of our runners, we can do some &lt;a href=&quot;https://docs.google.com/spreadsheet/pub?hl=en_US&amp;amp;hl=en_US&amp;amp;key=0AuSXPqFXp_XzdGNVUTlPNzVyY2RZczVKV0RJTUtfRnc&amp;amp;single=true&amp;amp;gid=1&amp;amp;output=html&quot;&gt;name analysis&lt;/a&gt;.&lt;br /&gt;
Popular male names are: גיא, שי, טל, אורי ואבי ,&lt;br /&gt;
While popular female names are מיכל, יעל, עדי, קרן וענת&lt;br /&gt;
An interesting use of this table is a view of gender-specific vs gender neutral names.  Names like טל, שרון, עדי ורותם seem to be gender neutral whereas others are very gender specific.  Makes you wonder if you can build a gender classifier based on just the first name?  Perhaps further analysis of birth year will provide more accuracy.&lt;br /&gt;
&lt;br /&gt;
Looking at &lt;a href=&quot;https://docs.google.com/spreadsheet/pub?hl=en_US&amp;amp;hl=en_US&amp;amp;key=0AuSXPqFXp_XzdGNVUTlPNzVyY2RZczVKV0RJTUtfRnc&amp;amp;single=true&amp;amp;gid=2&amp;amp;output=html&quot;&gt;age vs starting group distribution&lt;/a&gt;, we can see that starting at age 16 most runners sign up for the first starting group, up to around the ages 26-27 where the majority shifts to the second group.  I&#39;ll leave it to the reader to find out if their finish times correlate accordingly.
&lt;br /&gt;
&lt;br /&gt;
However, one thing really strikes me when looking at the first graph of runner times - there appears to be a constraint on the gradient.  When I got the to the finish area there were a bunch of people blocking the actual finish line.. I suspect a substantial set of runners have skewed results due to the traffic jam that ensued at the time. I was actually there so I know for a fact there was a traffic jam, but I&#39;ll try to convince readers who weren&#39;t using just the data.&lt;br /&gt;
&lt;br /&gt;
First, we&#39;ll need to make a few assumptions:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The runners did not start at exactly the same time but the difference is limited to about 5 minutes. &amp;nbsp;I observed that the launch lane was mostly empty after just 3-4 minutes from the start of the race.&lt;/li&gt;
&lt;li&gt;Also, we will only run calculations within a starting group, since the first group took off a full 15 minutes before the second group.&lt;/li&gt;
&lt;li&gt;The traffic jam occurred over a timespan of around 15 minutes.&lt;/li&gt;
&lt;/ol&gt;
Using these these assumptions we will use the aggregate of runners per finish time as a basis for rate of entry to the finish area. &amp;nbsp;Since the finish time resolution is one second, the number of runners per finish time will be considered the rate of runners entering the finish area. &amp;nbsp;The resulting table can be found &lt;a href=&quot;https://docs.google.com/spreadsheet/pub?hl=en_US&amp;amp;hl=en_US&amp;amp;key=0AuSXPqFXp_XzdGNVUTlPNzVyY2RZczVKV0RJTUtfRnc&amp;amp;single=true&amp;amp;gid=3&amp;amp;output=html&quot;&gt;here.&lt;/a&gt;
&lt;br /&gt;
You&#39;ll notice I&#39;ve added two fields, measuring the moving average of the previous 10 seconds. This is because the data is too noisy when looking at per-second rates.  Graphing this data, we can see some evidence of the traffic jam:
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;img src=&quot;https://docs.google.com/spreadsheet/oimg?key=0AuSXPqFXp_XzdGNVUTlPNzVyY2RZczVKV0RJTUtfRnc&amp;amp;oid=5&amp;amp;zx=51s6lrn576d6&quot; /&gt;
&lt;/center&gt;
&lt;br /&gt;
Now remember, the x-axis is a 10-second moving average.  So when we look at the mass of runners in group 2 between 0:52:00 and 1:17 we can see huge variations in the rate of runners crossing the finish line.  Compare these rates with before and after periods, where the variation seems to be more tame.  Also, notice how the variation grows as the rate itself grows, both in group 1 and group 2.  If Google Docs charts would support &lt;a href=&quot;http://en.wikipedia.org/wiki/Bollinger_Bands&quot;&gt;Bollinger Bands&lt;/a&gt; I suspect it would be a bit more obvious.&lt;br /&gt;
It seems that right in the range of 1:00:03 to 1:04:09 you can really see the waves of progression that characterize traffic jams.
&lt;br /&gt;
&lt;br /&gt;
In conclusion, I think that for 2012 Nike Israel should build a wider, rather than longer, finish area after the finish line.  The rate of people leaving the finish area was far lower than the rate entering the area, which lead to the buffer zone in the finish area overflowing and crowding the finish line.  The correct solution to this problem would be a very wide finish line with plenty of room for people to dispense in every direction possible.

That&#39;s it for today, see you again after next year&#39;s run!</description><link>http://xccv.blogspot.com/2011/11/some-data-analysis-of-nike-night-run.html</link><author>noreply@blogger.com (habeanf)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2172604997001934264.post-3535221940023401381</guid><pubDate>Fri, 08 Oct 2010 15:18:00 +0000</pubDate><atom:updated>2010-10-09T03:36:36.750+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AppEngine</category><category domain="http://www.blogger.com/atom/ns#">Google</category><title>A suggestion for Google App Engine - a state service</title><description>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial, sans-serif; font-size: 15px; border-collapse: collapse; &quot;&gt;&lt;div&gt;&lt;u&gt;Background&lt;/u&gt;&lt;/div&gt;&lt;div&gt;A few months ago I met a googler at the Google I/O 2010 conference during office hours at the App Engine booth.  We discussed App Engine at length, including my own development of an App Engine app.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As part of our discussion I had brought up the possibility of an ACID-compliant, fast read/write storage service (i.e in-memory database - fast [low latency] read/write relative to disk-based storage). While discussing this, a main argument he had brought up against such a service was that essentially this is an irrelevant option for a technical reason.  If I remember correctly, he had stated:&lt;/div&gt;&lt;div&gt;If a storage service is durable (can withstand data center/system failures), it must write to two geographically distinct locations.  However, if an application requests a write at one datacenter, then the latency of the two-way communication for each write to a second data center would be long enough to marginalize the gains of a memory-based database.  Our &quot;back of the envelope&quot; calculation was that it would take at least 10-20 ms for the full round-trip of a write with it&#39;s acknowledgment to travel between data centers - even if they are performed in-memory only and are not bound by the inherent latencies of mechanical storage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Therefore, we would be back to where we are now regarding data storage - either use memcached for non-dependable but fast storage or use the datastore for durable and dependable but comparably slower storage (even if using eventual consistency - datastore writes are noticeably slower than memcached writes, regardless of the datastore&#39;s recent performance issues).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since our discussion back then I had thought and rethought this argument, and I would like to present an idea for a new type of storage service: a state service.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before I describe this service I would like to get back to the previous debate.  I think I had made a mistake by not giving a reason/use-case for such a service and had excluded a part of ACID that can be relaxed (specifically, Durability).&lt;/div&gt;&lt;div&gt;The best reason I could find for such a service is applications that have a temporary state which changes often.  Putting myself in Google&#39;s AppEngine team shoes (big as they are, i&#39;m putting myself in the position of an evangelist) - I would want any application to be written in AppEngine.  The googler I talked to had pretty much said the same thing.  Moreover, I would want AppEngine to be the foundation of a new class of applications, applications where the foundation itself is key to applications&#39; features and capabilities.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;An Example&lt;/u&gt;&lt;/div&gt;&lt;div&gt;A good example of such an application is a browser-based multiplayer game.&lt;/div&gt;&lt;div&gt;A fundamental capability of such an application is the game&#39;s state, constantly updated by players and at the same time constantly updating gamers (and likely passive viewers) of this state.  Given App Engine&#39;s current array of services, it would be impossible to build such an application.  At first glance, one is tempted to view this as a simple publish/subscribe scenario - players send events to a queue and both active and passive players subscribe to it to get the updates.  However, a new player introduced would need more than just changes to the game - the current state would need to be sent too.  To this end, this is an important difference when compared to google&#39;s pubsubhubbub or solutions like it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Practically speaking, there are many other examples where state cannot depend on one single memcached key to store a critical part of the state, but on the other hand cannot consider using the datastore since it would be very costly and would be functionally inefficient - there&#39;s no reason to persist the state to disk for every change.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;The State Service&lt;/u&gt;&lt;/div&gt;&lt;div&gt;The proposed state service, while not being ACID compliant, would be a RAIDed version of a memcached service (like an in-memory GFS, but with a smaller block size).  The key feature of this service would be that a key-value pair stored in the state service would be guaranteed to have multiple in-memory copies, written to simultaneously.  If any one memcached node fails (the probability of which is not negligible), no harm is done.. as is with GFS a new redundant copy would be created automatically.  However, if an entire data center fails then that state is accepted to be lost and reset. In other words, I&#39;m banking on the probability of an unexpected complete data center failure happening to be significantly less than the probability of a single computer failing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A number of useful API features for a state service could be:&lt;/div&gt;&lt;div&gt;- A &quot;timeout&quot; API: removes a state when no changes have been made to it for longer than the timeout.&lt;/div&gt;&lt;div&gt;- A notification API: for changes to the state, possibly with or without the state itself.  The notification could be specific, such as changed, removed, timed-out etc.&lt;/div&gt;&lt;div&gt;- A quiesce API: An API for an application initiated snapshot/backup of a state, either to a different data center for in-memory storage or to the datastore/persisted to disk.  During this time the state is read-only.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Similar to the quiesce API, an acquiesce API - In order to meet maintenance needs of whole data centers, yet another part of the API could be a required implementation of a &quot;transport&quot; mechanism, which would allow data center maintainers to initiate the freeze of a state and transfer it to another data center.  The API could notify the app of an immediate delay in the responsiveness in the serving of state queries while it is being transferred.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I assume Google would need a way to make sure users of app engine won&#39;t rely on the state service for anything other than a proper use of state (i.e. as persistent storage or cache).  While I can&#39;t guarantee that won&#39;t happen, you can mitigate the risk of it happening using quota economics - make it an order of magnitude more expensive to store data in than the data store, but an order of magnitude less expensive to make changes in.  In addition, make sure the state service is more expensive for read-only operations than the memcached service.  As google probably does with the other services available, the actual prices and free quotas would be based on google&#39;s marginal cost for operating the service on a per block size basis (say, 32 K with three copies on computers at one data center with low latencies between themselves).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think this would especially be a huge advantage to google app engine when compared to Amazon EC2 (I don&#39;t have anything against EC2, i&#39;m just looking at it from a marketing perspective). Having a state service would be a key differentiator because the cost of building one on EC2 is quite high. While most of the GAE services are perceived to be relatively easy to implement (datastore, memcached, blobstore, image serving, static file serving, web app serving, mail and task queue), for most of the aforementioned examples there probably is a major difference between the perceived simplicity of a do-it-yourself service and the true complexity of google&#39;s implementation.  However, a state service is usually not conceived in the first place - it is mimicked by implementations of in-memory storage on souped-up redundancy-laden servers.  Since these solutions simply rely on the stability of a single server (redundant as it may be), they are marginally inefficient because available memory on one server cannot serve application in need on a different server - which leads to complex infrastructure software that tries to move processes around with their memory in order to fix inbalances.  On EC2 these models fall apart because servers can and do fail.  There are fixes (what I call architectural patches) such as multiple processes executing the same job in parallel but IMHO they are inefficient because of unnecessary redundant execution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;Conclusion and TL;DR&lt;/u&gt;&lt;/div&gt;&lt;div&gt;I propose a state service which is a hybrid memcached and datastore - data is only stored in memory, on multiple computers local to a data center.  The state service is not fully ACID compliant in that a full data center outage would mean loss of data (not durable) - which is considered acceptable because full data center outages are rare.&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15.2778px; &quot;&gt;  By letting go of durability, it would support highly frequent changes and would be resilient in the face of single computer failure.  Financial incentives would make sure the state service is not misused.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15.2778px; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15.2778px; &quot;&gt;Although I have been thinking about this idea since Google I/O 2010, notice that Google Instant is a hint that Google itself needs to store and change state efficiently.  I believe that in the near future whatever infrastructure Google built to enable state for Google Instant will find itself useful in other Google products - hopefully Google App Engine will be one of them.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;------------------------------------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had contacted the aforementioned googler with an email similar to above part of this post (in fact, it served as the basis for the post).  I won&#39;t name the googler, if he likes he will identify himself.  As you might conclude from the background section, the googler is a member of the Google App Engine team.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The googler&#39;s response was that he thought I had redesigned Cassandra/MongoDB.  However, I don&#39;t think I did.  Cassandra and MongoDB are designed for durability, a feature the state service would not require:&lt;/div&gt;&lt;div&gt;1. MongoDB - &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Caching&quot;&gt;Uses memory-mapped files&lt;/a&gt; so any changes in memory to the data would soon be performed on disk.&lt;/div&gt;&lt;div&gt;2. Cassandra - &lt;a href=&quot;http://wiki.apache.org/cassandra/Durability&quot;&gt;Persists changes to disk&lt;/a&gt; using a common mechanism found in most RDBMSs - frequent fsync()s of a change/commit log, while writes to the actual data files representing data objects are fsync()ed infrequently and are (supposedly) optimized for I/O performance.&lt;/div&gt;&lt;div&gt;Both methods introduce a mechanical burden which is unnecessary for a service that does not require durability, since the disks have a random seek throughput rate much smaller than that of a cpu talking only to memory.&lt;/div&gt;&lt;/span&gt;</description><link>http://xccv.blogspot.com/2010/10/suggestion-for-google-app-engine-state.html</link><author>noreply@blogger.com (habeanf)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2172604997001934264.post-4821258204982485349</guid><pubDate>Wed, 03 Jun 2009 18:55:00 +0000</pubDate><atom:updated>2009-06-04T00:36:09.644+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Nethrone</category><title>Enthroned: Part 1 - Installation</title><description>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; font-size: 13px; &quot;&gt;There&#39;s a good chance that there&#39;s a difference between you (as you&#39;re reading this), and I (as I wrote this).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;You&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; are probably in one of the following positions:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- Sitting in a chair, hunched forward over an inadequately sized screen.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- Sitting in a chair, neck protruding forward.  Optionally your feet might be up on a makeshift footstool.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- On a couch/bed/beanbag; laptop sitting where it&#39;s name suggests.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;However, &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;I&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; was sitting upon a throne.  A &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;http://www.nethrone.com/&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;nethrone&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; that is.  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;So I thought I&#39;d blog about my experience, but &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;http://nethrone.blogspot.com/&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;I&#39;m not alone&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: underline;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Step 1: Delivery&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4dIBZfWhShxzit3OH7Vrs6psxWFdnjGIcI2GvmoxZ0tWWkEuTL6LmnmakHI30ubSjUpB3ERizPLsOOl48pZGtZtyA-wQLvG7zh4lQQbyBu9y8e4rQ-59B9GVjAV_92LyV7YrVbvnD4Rvr/s320/CIMG1486.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5343208938443602338&quot; style=&quot;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 240px; height: 320px; &quot; /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The box&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;  -webkit-text-decorations-in-effect: none; &quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUNAHPydqKne5qVT4yzwDvRzNoDngjtV7H2u4kNGk4lXKdFwx3eVJUkpvHJ31age2LNdmseeOFJYoGQPTDgviKpGdYgvDiixzUazTp9j0tWoCPu8f6Sc8GypruAYF0I4BHesaNTuom6N_l/s1600-h/CIMG1489.JPG&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUNAHPydqKne5qVT4yzwDvRzNoDngjtV7H2u4kNGk4lXKdFwx3eVJUkpvHJ31age2LNdmseeOFJYoGQPTDgviKpGdYgvDiixzUazTp9j0tWoCPu8f6Sc8GypruAYF0I4BHesaNTuom6N_l/s320/CIMG1489.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5343209568110613858&quot; style=&quot;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; &quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Classic ninja tactics - disinformation meant to thwart evil fiends&lt;br /&gt;Do not be mislead, this box contains more than your standard office chair&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;font-family:arial;font-size:100%;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;You can see the rest of the pictures &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://picasaweb.google.com/habeanf/Nethrone?feat=directlink&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;here&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot; text-decoration: underline;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: underline;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Step 2: ...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikJXrbvUrGtKddfwSu1lDzXGlHgPzC9fLFJ5zmzKsWdHSL62HvA4KnOfuHkB_las9V7_YqBJ8fnaTfsal9m8z-pk1Kk89q8cop8P9rb_nozQP7fmPlLy4ihvCpBjW62EojoxQleMBsaqj_/s1600-h/CIMG1499.JPG&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikJXrbvUrGtKddfwSu1lDzXGlHgPzC9fLFJ5zmzKsWdHSL62HvA4KnOfuHkB_las9V7_YqBJ8fnaTfsal9m8z-pk1Kk89q8cop8P9rb_nozQP7fmPlLy4ihvCpBjW62EojoxQleMBsaqj_/s320/CIMG1499.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5343211605846026514&quot; style=&quot;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; &quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Oh &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;hai&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;! &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Nethrone&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; can &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;haz&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;cheezeburger&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEingkjWACQD3sOZztpGw0SVGGG5Nvs8Fd_HrSGbKy6edItxqbp2ffta04ZtzxD2XwW34wsXeLK86D2mdI-5zw15p_HbUdNxokS4OEXwVJ3094x5pAPWypJPk-guSd3lz3DeOwgjoZ66lxUe/s1600-h/CIMG1500.JPG&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEingkjWACQD3sOZztpGw0SVGGG5Nvs8Fd_HrSGbKy6edItxqbp2ffta04ZtzxD2XwW34wsXeLK86D2mdI-5zw15p_HbUdNxokS4OEXwVJ3094x5pAPWypJPk-guSd3lz3DeOwgjoZ66lxUe/s320/CIMG1500.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5343212534832155122&quot; style=&quot;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 240px; height: 320px; &quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Connecting the main structures&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;font-family:arial;font-size:100%;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;As you can see from the pictures, most of the structure comes connected.  The technician only had to connect two main structures and a few appendages to the seat.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;A word of warning - Although it looks easy to set up, I strongly recommend paying for the technician installation service - there&#39;s just too many ways to get it wrong (more on that in a later post).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Mechanically and functionally everything works out of the box; however beware that this is not an &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;IKEA&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; closet.  Some stuff was done crudely on the spot - for &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;example:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; the &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;mousepad&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; wrist pad had to be glued with silicone to the circular raw metal plate that was attached to the armrest.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: underline;&quot;&gt;Step 3: Profit!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCymfRwYDBAZALWxR1lIb_TGB-675GFvW6ShXaiXMsAF4ZHyBWlLETTg_-uEiVUAIFtbj1fuomi3-1LSk7-_FDVHgWHQj4aouLfJFl6KA6AxaBdjyTcNjjkMZvrDm65ZcF8jtpsoFe9Hdu/s1600-h/CIMG1515.JPG&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCymfRwYDBAZALWxR1lIb_TGB-675GFvW6ShXaiXMsAF4ZHyBWlLETTg_-uEiVUAIFtbj1fuomi3-1LSk7-_FDVHgWHQj4aouLfJFl6KA6AxaBdjyTcNjjkMZvrDm65ZcF8jtpsoFe9Hdu/s320/CIMG1515.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5343217560880722482&quot; style=&quot;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; &quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;font-family:arial;font-size:100%;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px;&quot;&gt;C&#39;est magnifique!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;font-family:arial;font-size:100%;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;All in all, I&#39;m quite happy with my shiny new toy :)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;font-family:arial;font-size:100%;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;font-family:arial;font-size:100%;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px;&quot;&gt;To be continued...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://xccv.blogspot.com/2009/06/enthroned-part-1-installation.html</link><author>noreply@blogger.com (habeanf)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4dIBZfWhShxzit3OH7Vrs6psxWFdnjGIcI2GvmoxZ0tWWkEuTL6LmnmakHI30ubSjUpB3ERizPLsOOl48pZGtZtyA-wQLvG7zh4lQQbyBu9y8e4rQ-59B9GVjAV_92LyV7YrVbvnD4Rvr/s72-c/CIMG1486.JPG" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2172604997001934264.post-3961100422476273258</guid><pubDate>Mon, 25 May 2009 18:55:00 +0000</pubDate><atom:updated>2009-06-05T15:20:24.496+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AppEngine</category><category domain="http://www.blogger.com/atom/ns#">Google</category><title>App Engine: Google&#39;s Faster Horses</title><description>&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;In case you hadn&#39;t noticed, &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://googleappengine.blogspot.com/2009/02/new-grow-your-app-beyond-free-quotas.html&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Google unleashed App Engine to the masses&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;One can prescribe a plethora of hi-tech buzzword/dashed-phrase adjectives to App Engine, for example: super-cool, cutting-edge, evolutionary, revolutionary, and the all-mighty disruptive technology.  Sarcasm aside, App Engine really is a disruptive technology.  I will be dedicating a number of posts to sharing my thoughts on the disruptive-ness of App Engine.  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;With respect to Google&#39;s future directions, there is more than meets the eye to App Engine.  I&#39;ll be sharing my humble opinions on what&#39;s going on at higher levels: the economical and technological disruptions, Google&#39;s reasons for launching App Engine and it&#39;s relation to MapReduce.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;In this post, I&#39;ll be talking about the data storage back end that contributes significantly to making all this disruption possible.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The Horses&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;It is usually the case that the workhorse of a web application is the database.  One can imagine web/app servers as efficient gateways of incoming requests that are translated into action items for the database (a.k.a. SQL DML).  For this (and other esoteric) reasons, it is quite simple to scale web servers linearly.  All too often it is evident that the Achilles heel of web application scaling is the database.  I will cover the underlying scaling issue of traditional RDBMSs in a later post.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Currently, consider the problem a DBA faces when scaling the RDBMS layer of a web application after he&#39;s maxed out the performance he can get from his current hardware.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Faster Horses&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;At this point, the DBA and dev team want a faster (work) horse. They want a solution that will continue to work with their existing code and architecture, only &quot;faster&quot;.  There are a few solutions that appear to be available:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;1. &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Scalability#Scale_vertically_.28scale_up.29&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Scale-up&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;  (i.e. more cpus, new cpus, more ram, more disks/controllers in the storage device, etc.)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;2. RDBMS based solutions: Clusters of computers with shared storage (i.e. Oracle RAC)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;3. Software infrastructure solutions: &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Shard_(database_architecture)&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;sharding&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; or similar types of indirection - db proxy (i.e. MySQL Proxy), &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: underline;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Not so fast:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The first solution is extremely limited in range - cpus only double in speed every 18 months (Moore&#39;s law) and the marginal cost of doubling the amount of cpus on a motherboard could eclipse the cost of rewriting the web app from scratch (look up the marginal cost difference between 32, 64 and 128 cpu machines).  One could say that scaling-up is a form of procrastination: &quot;I don&#39;t want to solve this problem right now, let&#39;s get a bigger/faster computer.&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The second solution delegates the problem to network and storage subsystems: Since traditional RDBMSs need redo/undo logs and serial commit numbers to support ACID requirements, these must be synchronized between the computers accessing the shared storage.  This inhibits scalability because synchronization tasks will eventually choke the system by starving shared network and I/O resources. Also, the performance of I/O bound tasks is not improved, since the amount of disk read/write heads has not been increased (in fact, the performance might be degraded due to contention).  Additionally, scalability costs are compounded by the combination of software and hardware costs (as opposed to software-only or hardware-only costs, as in option #1 or option #3).  Worst of all, when adding a computer to the shared-cluster, one must add additional I/O channels to the shared disks (and this is quite expensive).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;It appears that the whole shared-storage solution was an effort to support hot fail over servers without a doubling of the storage subsystem.  Somewhere along the line someone thought to themselves &quot;this must mean we can scale&quot;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The third solution is interesting.  The same &quot;interesting&quot; you might apply to a home-cooked dish gone wrong (not cooked by you, and you better like it or else).  The intention is honorable, but the solution is a patch to a fundamental flaw.  Sharding shifts the burden of scalability up the technology stack to the programmer, where at best a sharding configuration can be centrally managed.  Sharding introduces another conscientious dimension to the dev team - shard management.  Since the abstract data storage layer (usually a standard database) is managed by a library/server (i.e. hibernate, MySQL Proxy), the parameters for data storage are now a part of the dev process.  For example, in dev and qa environments, custom sharding parameters must be configured for the small environments mimicking production.  Worst of all, in-flight scaling becomes a cumbersome task (due to the configuration nightmare of resharding) eating up human resources.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Google&#39;s Faster Horses - BigTable&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;It appears that at some point in recent history, someone (or a bunch of someones) at Google sat back and started asking: &quot;What if?&quot;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;What if we could store objects directly?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Can we change the data storage layer paradigm?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Can we spare the object-relation mapping (ORM) and literally GET/PUT objects from/to storage?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;What if we dealt away with connection strings and cursors?  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;What if a modification to the definition of stored-object attributes won&#39;t require a DBA and down time?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Can we do all this, and still support transactional modification of data?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;In short, the answer to all the questions above is: yes.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;This day and age, a link is worth a thousand words.  So instead of writing about Google&#39;s faster horses, I&#39;ll point you in the right direction:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The App Engine blog - &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://googleappengine.blogspot.com/2009/02/back-to-future-for-data-storage.html&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Google App Engine Blog: Back to the Future for Data Storage&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Google&#39;s research paper on &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://labs.google.com/papers/bigtable.html&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Bigtable&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;I have mentioned an Achilles heel and fundamental flaw earlier in this post, and I will blog about it in my own words another time.  For those who want a more in-depth and academic take on the issue, I suggest reading:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Prof. Mike Stonebraker &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;et al&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; on &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://cs.brown.edu/people/ugur/fits_all.pdf&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The End of One-Size-Fits-All&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt; for databases.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;From the same group - &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/vldb07hstore.pdf&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The End of an Architectural Era&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Please note that in terms of object-oriented databases, &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Object_database#History&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Google did not invent the wheel&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;.  Minute differences aside, they are the first to use it on a massive scale, and the first to use it for effortless scaling of web applications.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Conclusion&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;In this post, I focused on the back end tool that makes App Engine (and most of Google) feasible.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;In this sense, the disruption is in the public world-wide availability of this technology.  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;App Engine is a factory for web-based applications/services/products, now available to anyone with reasonable means.  This is the modern-day disruption akin to the technology that enabled entrepreneurs to establish factories in the late 18th century.  The same entrepreneurs that stood behind the &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://video.google.com/videoplay?docid=8953172273825999151&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;industrial revolution that was eventually the driving force behind consumerism&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;.  In my very humble opinion, App Engine is the beginning of a new revolution (yet to be named).  I&#39;ll be talking about this concept (and my name for it) in-depth in a later, off-subject post, which leans on the availability of technologies like App Engine.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Whats Next&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;In my next posts, I&#39;ll be talking about other aspects of the disruptions caused by App Engine:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- The economics behind App Engine. Barriers of entry, marginal cost of production&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- Google&#39;s reasoning for App Engine&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- A fundamental concept of the cloud development paradigm:  I call this: code once, run copies (as many as you like)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- The revolution marked by the general availability of App Engine&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;- Likely directions in the future of App Engine&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;What&#39;s all this got to do with horses?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;font-family:arial;font-size:100%;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:13px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;  ;font-family:Georgia;font-size:16px;&quot;&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&quot;If I had asked people what they wanted, they would have said: &#39;faster horses&#39;.&quot;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Henry_Ford&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Henry Ford&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://xccv.blogspot.com/2009/05/app-engine-googles-faster-horses.html</link><author>noreply@blogger.com (habeanf)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2172604997001934264.post-75745004059395010</guid><pubDate>Sat, 02 May 2009 19:54:00 +0000</pubDate><atom:updated>2009-05-02T23:28:05.430+03:00</atom:updated><title>Initiation</title><description>&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;Welcome to my blog.  I&#39;ve been planning on blogging my musings for quite a while now but never really found the time.  Recent changes in my schedule lead to an open time slot, so I thought I&#39;d give it a go.&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;I will be blogging on a number of subjects, mainly focusing on my infatuation with Google products and services such as:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;&lt;a href=&quot;http://code.google.com/appengine&quot;&gt;App Engine&lt;/a&gt; (Python)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;&lt;a href=&quot;http://www.google.com/chrome&quot;&gt;Chrome&lt;/a&gt; (which I evangelize endlessly to friends, family, associates and customers)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;Experiences with &lt;a href=&quot;http://code.google.com/p/unladen-swallow/&quot;&gt;unladen sallow&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;General thoughts on Google&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;I&#39;ll also be blogging about stuff from my work as a freelance BI consultant. Specifically I&#39;ll give my humble opinion on: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;&lt;a href=&quot;http://hadoop.apache.org/core/&quot;&gt;Hadoop/MapReduce&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;&lt;a href=&quot;http://hadoop.apache.org/core/&quot;&gt;&lt;/a&gt;Column-based storage (i.e. &lt;a href=&quot;http://www.vertica.com&quot;&gt;Vertica&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;&lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: arial; &quot;&gt;Experiences with &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;ubuntu&lt;/a&gt; (linux)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;Cheers,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:arial;&quot;&gt;habeans&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://xccv.blogspot.com/2009/05/initiation.html</link><author>noreply@blogger.com (habeanf)</author><thr:total>2</thr:total></item></channel></rss>