<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4478245028379356028</id><updated>2011-09-04T11:24:15.466-07:00</updated><title type='text'>Scratch Paper</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/15876941956452053853</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-1775771112789509470</id><published>2009-10-15T09:51:00.000-07:00</published><updated>2009-10-15T09:51:10.378-07:00</updated><title type='text'>Azure: Fabric Controller</title><content type='html'>In Azure, the Fabric Controller's view of a deployed service is a bit like this:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZBDg7C2Kjko/Stc9euuPFZI/AAAAAAAAAI8/-QjxUBEcHWo/s1600-h/FC_data_structures.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_ZBDg7C2Kjko/Stc9euuPFZI/AAAAAAAAAI8/-QjxUBEcHWo/s400/FC_data_structures.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a logical service, which consists of several logical roles (e.g., &lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#MotivApp"&gt;for our example application&lt;/a&gt;, the service was the overall application and the roles included a Web and two Worker roles). There may be multiple instances of any single Logical Role, each of which is a &lt;i&gt;Logical Role Instance&lt;/i&gt; (LRI). In the above picture, there are three instances of the Logical Role R_2. Each LRI is mapped to a single Logical Node, which is a hosting environment (e.g., &amp;nbsp;VM). There may be multiple Logical Nodes (VMs) running on any given Physical Node or computer.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The purple ovals correspond to information provided by the application developer. That is, in the configuration (service model) for this app, the developer provides the Service Description, a Role Description for each role (which provides attributes of that role, such as, what hosting environment is required, how many resources are needed, and so on), and a Role Instance Description. The Fabric Controller maps each Role Instance Descriptor to its corresponding Logical Role Instance. Similarly, each Role Descriptor is mapped to the appropriate Logical Role. (Note that not all of these connections are shown in the above picture.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this way, &lt;i&gt;deploying a service&lt;/i&gt;&amp;nbsp;consists of mapping the graph describing an application's topology (as provided in that app's service model) TO the graph describing the inventory managed by the FC.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Driving the logical nodes&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;When an LRI is bound to a logical node (VM), that logical node's goal state is set to be whatever the LRI's goal state is. For example, Logical Node LN_22 in the above has a goal state which corresponds to LRI_22's goal state. The logical node also has a &lt;i&gt;current state&lt;/i&gt;, which is obtained from the physical node on which this VM is running. The current state is kept up-to-date by communicating with the underlying physical hardware.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;They don't say how it's constructed but evidently&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;in addition to knowing the current state and the goal state for each VM (OK)&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;the &lt;i&gt;state machine&lt;/i&gt;&amp;nbsp;for the corresponding LRI is also known. A state machine identifies all the possible states an instance can be in as well as what events cause transitions between what states. There is a stream of events&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;obtained via polling or interrupts&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;which provide updates on the physical hardware. These events are used&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;along with the state machine&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;to determine the current state. Periodically, the FC figures out what the appropriate next steps are given: the current state, the state machine, and the goal state. Then those actions are performed.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Identifying when there is a problem and handling it (automatically)&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The FC maintains a cache of what it believes is the current state of each node. The Fabric Agent (which lives on each node) communicates with the FC to help the FC keep this cache updated. The FC detects when a Role dies. Multiple sources participate in monitoring Role health (and notifying the FC when a Role is not healthy): the Load Balancer issues probes to machines (i.e., pings them), a Role can also notify the FC that it (the Role) is unhealthy. When the FC learns (through whatever channel) that some Role is not healthy, the FC updates the current state for that node. Then the appropriate next steps to take&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;to get that node closer to its goal state&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;are determined and undertaken.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When a node goes offline, an attempt is made to recover that node. If the reason was a hardware failure (or, generally, something which cannot be remediated automatically) the role is migrated to another node.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From:&amp;nbsp;&lt;a href="http://channel9.msdn.com/pdc2008/ES19/"&gt;http://channel9.msdn.com/pdc2008/ES19/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Note that the above exposition would have benefited&amp;nbsp;&lt;i&gt;greatly&lt;/i&gt;&amp;nbsp;from a few concrete examples&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;as far as what a typical goal state is, what a typical current state is, how the state machine (which identifies what's needed to transition between states) for a logical role instance is created, and so on.)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-1775771112789509470?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/1775771112789509470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/10/azure-fabric-controller.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/1775771112789509470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/1775771112789509470'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/10/azure-fabric-controller.html' title='Azure: Fabric Controller'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZBDg7C2Kjko/Stc9euuPFZI/AAAAAAAAAI8/-QjxUBEcHWo/s72-c/FC_data_structures.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-2093910210209896260</id><published>2009-10-14T15:42:00.000-07:00</published><updated>2009-10-15T14:58:20.203-07:00</updated><title type='text'>More detailed notes on Azure architecture</title><content type='html'>Below we have some notes from: "Introducing the Windows Azure Platform" (by David Chappell)&lt;br /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=158011" target="_blank"&gt;http://go.microsoft.com/fwlink/?LinkId=158011&lt;/a&gt;&amp;nbsp;as well as from the video presentation (from PDC 2008) by Erick Smith and Chuck Lenzmeier, "Under the Hood: Inside the Windows Azure Hosting Environment&amp;nbsp;"&amp;nbsp;&lt;a href="http://channel9.msdn.com/pdc2008/ES19/" target="_blank"&gt;http://channel9.msdn.com/pdc2008/ES19/&lt;/a&gt;. The PPNT slides associated with that video lecture can be found here:&amp;nbsp;&lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/PPTX/ES19.pptx" target="_blank"&gt;http://mschnlnine.vo.llnwd.net/d1/pdc08/PPTX/ES19.pptx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;On:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="background-color: lime;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#GenComments"&gt;General comments&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: yellow;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#MotivApp"&gt;A motivating app&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: cyan;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#AzureCompute"&gt;Azure OS Compute&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;Roles, Agents, What an app consists of&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: magenta;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#AzureStorage"&gt;Azure OS Storage&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;Blobs, Tables, and Queues. How one can store, access, and update data using the Azure OS.&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: #9fc5e8;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#FabricController"&gt;The Fabric Controller&lt;/a&gt;:&lt;/span&gt; manages application provisioning (resource allocation), deployment, monitoring, and maintenance (including identifying when an app instance has gone down and needs to be restarted, when other hardware needed for the app has failed, when an app needs to scaled up or down in response to demand).&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: #f4cccc;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#ServiceModel"&gt;The service model&lt;/a&gt;&lt;/span&gt;: a contract between the application creator and the Azure platform. A way for the app creator to define how he wants his app to be managed. The FC enforces the Azure-side of this contract&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;ensuring the app stays "healthy," according to the definition of health provided by the app's creator.&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: #a2c4c9;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#ServiceLifecycle"&gt;The service lifecycle&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;and its constituent parts.&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: #6aa84f;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#Misc"&gt;Miscellaneous Other&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;&amp;nbsp;including security&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="background-color: lime;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="GenComments"&gt;&lt;/a&gt;General comments&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;At a high level of abstraction, think of the Azure Platform as a gigantic computer&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;though in actuality it consists of many physical computers, switches, routers, load balancers, and so on. A single logical OS runs over all of these different pieces of hardware and manages them. So in the same way that a user adds a physical device (such as a NIC) to his PC&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;by installing the driver for that device&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;the Azure OS adds switches, computers, and so on via installing the driver for the device. The driver in this case may not necessarily be the software that ships with the hardware (as would be the case when a user installs some hardware on his PC) but instead some Azure-specific code which lets the Azure OS monitor and fully manage the given machine, whatever it may be.&lt;br /&gt;&lt;br /&gt;As noted, a user can run an app on Azure OS or store data using Azure OS or both.&amp;nbsp;If he runs an app on Azure OS, he can perform &lt;i&gt;horizontal scaling&lt;/i&gt;&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;that is, run more than one instance of the same app on different machines. In effect the app is replicated across different resources so that the overall app &lt;i&gt;bandwidth&lt;/i&gt; (e.g., ability to perform a distributed computation or serve clients) is increased.&lt;br /&gt;&lt;br /&gt;An app itself can consist of more than one "role," where there are &lt;b&gt;front-end roles&lt;/b&gt; (those which receive HTTP/S connections) and &lt;b&gt;back-end roles&lt;/b&gt; (those which do not accept incoming network connections; they are more processing or computation focused). So there can be replication of a particular role (e.g., create a new instance of the front-end "Web" role for every 1500 new client connections I receive) or &lt;i&gt;of the entire app itself&lt;/i&gt;&amp;nbsp;(e.g., create another instance of this entire web application, where that instance will include some number of instances of front-end and back-end roles). (CONFIRM THIS: it is certainly the case that one can replicate instances of particular roles; unclear whether replication can also be done at the level of an entire app, i.e., at &lt;i&gt;app-granularity&lt;/i&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="background-color: yellow;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="MotivApp"&gt;&lt;/a&gt;A motivating app&amp;nbsp;&lt;span style="-webkit-text-decorations-in-effect: none; color: black; font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px; font-weight: normal;"&gt;—&lt;/span&gt;&amp;nbsp;for concreteness&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;I think our exploration of Azure would benefit greatly from considering some particular example app. So let's imagine the following app (that I just made up right this second): a credit-checking app used by landlords to determine whether or not to rent to some would-be tenant. The front-end of the app accepts a connection from a landlord who does two main things (via filling out a Web form): (1) provides all of the information about the would-be tenant (name, age, birthdate, SSN, previous addresses, previous landlords, references, ...); (2) provides order-fulfillment information (identifying where the finished report should be sent, how the landlord is going to pay for use of the service, and so on).&lt;br /&gt;&lt;br /&gt;Let's assume we can use a &lt;b&gt;single front-end role&lt;/b&gt; to accept this information. Depending upon the design of the app, the landlord may need to submit more than one form (e.g., one form for info about the would-be tenant and a second form for order fulfillment info). For simplicity, let's assume there's a single form and a single front-end role. Naturally, the number of instances of that front-end role should depend upon the level of demand for the service at any given instant of time. (Note that an app can increase the number of front-end instances, back-end instances, or both. Similarly, an app can "shed load" by killing instances of front- or back-end roles.)&lt;br /&gt;&lt;br /&gt;Then there are at least two &lt;b&gt;back-end roles&lt;/b&gt;: one for payment processing and a second for generating and supplying the report. The back-end roles can make outbound network connections, as necessary, to process the credit card payment or to retrieve info on the would-be tenant (even to invoke &lt;i&gt;other Web services&lt;/i&gt;&amp;nbsp;to perform some part of the due diligence involved in report generation), and so on.&lt;br /&gt;&lt;br /&gt;Clearly there must be some information sharing across these roles; the info gathered by the front-end role needs to be made available to the back-end roles. Further, if there are multiple instances of each back-end role, those instances need to cooperate so that they don't duplicate one another's work. There are a number of different ways to structure this workflow; an obvious approach is for the front-end role to populate a record or document with the info it has gathered then to add that record/document to a queue&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;where the back-end roles take from this queue. So there's the familiar producer/consumer relationship there. Clearly, we want some kind of notification to be sent to idle Workers whenever a new job is available.&lt;br /&gt;&lt;br /&gt;I'm not sure whether it's even possible for the Web role to create a network connection directly to the Worker role. We know that &lt;i&gt;the outside world&lt;/i&gt;&amp;nbsp;cannot connect to the Worker role; not sure whether that prohibition also extends to internal network connections. Depending upon the support for real-time notification of Workers that work is available, it might be appealing to be able to directly poke a worker. Some tradeoffs in polling versus interrupt-based notification but no obvious new twists on those tradeoffs presented here.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="AzureCompute"&gt;&lt;/a&gt;Azure OS Compute&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;True of both a Front-End Role and a Back-End Role:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Runs in a VM.&lt;/li&gt;&lt;li&gt;Can interact with Azure Storage:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Read/write messages from/to a queue.&lt;/li&gt;&lt;li&gt;Read/write data from/to a table.&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Interacts with an Agent, which runs in the same VM.&lt;/li&gt;&lt;li&gt;Can write to / read from the local filesystem (within the VM); such changes will not persist across reboot though.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;A Front-End Role&lt;/span&gt;&lt;/b&gt;&lt;span style="background-color: cyan;"&gt;&amp;nbsp;(referred to in MSFT literature as a "Web Role")&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Receives HTTP/S connections.&lt;/li&gt;&lt;li&gt;Runs on IIS7 (in a VM).&lt;/li&gt;&lt;li&gt;Is&amp;nbsp;&lt;i&gt;stateless with respect to clients&lt;/i&gt;. What does that mean? Each separate "request" from a client (e.g., HTTP GET or POST message) could be routed to a different front-end role. Hence, all important client state must either be returned to the client (so that he can present that info with each request he makes) or put in the database (where all front-end roles can access the info).&amp;nbsp;Clients can retain and re-present state via maintaining it in a URL parameter or cookie.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;A Back-End Role&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="background-color: cyan;"&gt;&amp;nbsp;(referred to in MSFT literature as a "Worker Role")&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does NOT receive any incoming network connections.&lt;/li&gt;&lt;li&gt;Can make outbound network connections.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;A Windows Azure Agent&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Runs in the same VM as the front- or back-end role.&lt;/li&gt;&lt;li&gt;Exposes an API which the Roles can invoke in order to:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Write to the log&lt;/li&gt;&lt;li&gt;Send an alert to the application owner&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Is the way that an app can interact with the Fabric Controller.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;An app consists of:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;N instances of Front-end Roles (can be zero)&lt;/li&gt;&lt;li&gt;M instances of Back-end Roles (can be zero)&lt;/li&gt;&lt;li&gt;A "hardware" load balancer (only necessary if have &amp;gt;1 Web or front-end role)&lt;/li&gt;&lt;li&gt;A config file&lt;/li&gt;&lt;ul&gt;&lt;li&gt;How many Web role (front-end) instances&lt;/li&gt;&lt;li&gt;How many Worker role (back-end) instances&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;A model: which defines what it means for this app to be healthy, the ways in which the app can be unhealthy (i.e., constraints which, when violated, indicate unhealthiness), remedial actions to take when an app is unhealthy (e.g., healthy means 1500 or fewer client connections per Web role; if all Web roles are currently managing 1500 client connections and the app receives another client connection, create a new instance of the Web role and send the new client to that instance).&amp;nbsp;&lt;/li&gt;&lt;li&gt;A unified log which contains messages received both from Web and Worker instances.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;span style="background-color: magenta;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="AzureStorage"&gt;&lt;/a&gt;Azure Storage&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;"All info held in Azure Storage is replicated three times." Provides strong consistency.&lt;br /&gt;&lt;br /&gt;Every blob, table, and queue is named using URIs and accessed via standard HTTP operations. So these objects can be accessed locally (by Worker and Web Roles running in the same data center, for example) or they can be accessed across the WWW. Can use REST services to identify and access each Azure Storage data object. There are libraries which encapsulate the REST protocol operations (e.g., ADO.NET Data Services or Language Integrated Query (LINQ)) or one can make "raw HTTP calls" to achieve the same effect. If query a table stored in Azure Storage and that query has lots of results, can obtain a &lt;i&gt;continuation &lt;/i&gt;object which lets you process some results then get the next set of results, and so on. So a continuation object is like a list iterator.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span style="background-color: #cccccc;"&gt;Blobs&lt;/span&gt;&lt;/b&gt;: a blob consists of binary data. Can be upto 50GB each. Can have associated metadata.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;A storage account can have multiple containers; a container cannot contain another container (i.e., containers can't be nested). A blob name can contain slashes though&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;so can create the illusion of hierarchical blob storage.&lt;/li&gt;&lt;li&gt;Each container (akin to a file folder) holds blobs.&lt;/li&gt;&lt;li&gt;Can subdivide a blob into blocks then if there is a network failure while that blob is being downloaded, don't have to re-download the entire blob&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;just the blocks that weren't successfully delivered the first time.&lt;/li&gt;&lt;li&gt;Each container can be marked public or private.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Public blobs: can be read by anyone; writing requires a signed token.  &lt;/li&gt;&lt;li&gt;Private blobs: both read and write operations require a signed token.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;A blob can be reached by:&lt;br /&gt;http://&amp;lt;StorageAcct&amp;gt;.blob.core.windows.net/&amp;lt;Container&amp;gt;/&amp;lt;BlobName&amp;gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="background-color: #cccccc;"&gt;Table&lt;/span&gt;&lt;/b&gt;: actually a set of entities, each of which has a set of properties (and values for those properties).&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Access table via conventions defined in ADO.NET Data Services.&amp;nbsp;Cannot query a table in Azure Storage using SQL. And a table cannot be required to conform to a particular schema.&lt;/li&gt;&lt;li&gt;The reason for this non-relational representation is that it makes it easier to "scale out storage," i.e., to spread the data in the table across machines. Harder to do this if the data is stored in a relational table (what's hard is probably performing aggregate functions over the entire table, which is not allowed for tables Azure OS Storage).&lt;/li&gt;&lt;li&gt;An Azure table can contain billions of entities holding terabytes of data.&lt;/li&gt;&lt;li&gt;A table consists of some set of &lt;i&gt;entities&lt;/i&gt;.&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Each entity consists of some set of &lt;i&gt;properties&lt;/i&gt;.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Each property consists of a Name, Type, and Value.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;So in a way, we can think of a table as a nested structure: every property conceptually consists of a table which holds three tuples, in particular those which give the property's name (&amp;lt;Name, NameVal&amp;gt;), value (&amp;lt;Value, ValueVal&amp;gt;.), and the &lt;i&gt;type&lt;/i&gt; of that value&amp;nbsp;(&amp;lt;Type, TypeVal&amp;gt;). Supported types include Binary, Bool, DateTime, Double, GUID, Int, Int64, String. A property's type can change over that property's lifetime, depending upon what value is currently stored for the property.&lt;br /&gt;&lt;br /&gt;For example, some property p_12 might be represented by tuples: &amp;lt;Name, "CreationTime"&amp;gt;, &amp;lt;Type, "DateTime"&amp;gt;, and &amp;lt;Value, "12-01-2009&amp;nbsp;05:43:22 GMT"&amp;gt;. So this property (p_12) says that the entity that it describes was created on December 1st, 2009, early in the morning (which is interesting since that date has not yet arrived but no mind!).&lt;br /&gt;&lt;br /&gt;The next layer of nesting is that an entity contains a table consisting of all of that entity's properties. The final layer of nesting is that an actual Azure Storage Table consists of some set of entities and each entity's associated properties table.&lt;/li&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZBDg7C2Kjko/StYYWngKKZI/AAAAAAAAAI0/aLQjjgDDJ_Q/s1600-h/Picture7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_ZBDg7C2Kjko/StYYWngKKZI/AAAAAAAAAI0/aLQjjgDDJ_Q/s400/Picture7.jpg" /&gt;&lt;/a&gt;                                            &lt;/div&gt;&lt;li&gt;Each entity can be upto 1MB in size. Accessing any part of an entity results in accessing the entire entity.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="background-color: #cccccc;"&gt;Queue&lt;/span&gt;&lt;/b&gt;: the primary purpose of a queue is to provide a way for Web roles and Worker roles to communicate with one another. A queue contains messages, the format of which can be application-defined. Each message can be upto 8KB. A Worker role reads a message from the queue&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;which does not result in the message being deleted. Rather, after a message is &lt;i&gt;read&lt;/i&gt;, that message is not shown to anyone else for 30 seconds. Within that 30 seconds, the Worker who read the message could have handled the task and &lt;i&gt;deleted the message&lt;/i&gt;. Or that Worker might have died before completing the task, in which case, the message would be shown to other Workers after 30 seconds have elapsed. This 30-second period is referred to as the &lt;i&gt;visibility timeout&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Note that a message might be delivered multiple times. Also, there is no guarantee on the order in which messages are delivered. Presumably this means that a particular message on the queue might get "starved," i.e., never delivered to any Worker (in contrast to traditional FIFO queue semantics).&lt;/li&gt;&lt;/ol&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span style="background-color: magenta;"&gt;Azure Storage&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px; font-weight: normal;"&gt;—&lt;/span&gt;&amp;nbsp;Access control:&lt;/span&gt;&lt;/b&gt;&amp;nbsp;it sounds like they use a token-based system in order to control who can access what data. In particular, when a user creates a storage account, she's given a secret key. Every request made to the storage account (to modify account settings, to access some blob stored as part of this account, to edit a table, and so on) carries a signature which is signed by this secret key (like a token). Having such a token means that you can access&amp;nbsp;&lt;i&gt;all the data&lt;/i&gt;&amp;nbsp;stored in that account (as well as the account settings themselves?); i.e., the&amp;nbsp;&lt;i&gt;granularity&amp;nbsp;&lt;/i&gt;at which access control decisions are made is&amp;nbsp;&lt;b&gt;account-level&lt;/b&gt;. Presumably, a user Alice who owns an account can provide a signed token to other users whom Alice wants to allow to read/modify stored data (CONFIRM.) Regrettably, it appears that Alice has to let these other users have all types of access (create, modify, delete) to everything (all data as well as account settings?). That said, part of the Windows .NET Cloud Services is access control so perhaps this could be layered on top of storage in order to achieve a more fine-grained access control system? (CHECK.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;: there is evidently now a way to provide container-level or blob-level access (rather than only being able to give account-wide access). See:&amp;nbsp;&lt;a href="http://blog.smarx.com/posts/new-storage-feature-signed-access-signatures"&gt;http://blog.smarx.com/posts/new-storage-feature-signed-access-signatures&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;Windows Azure storage operates with “shared key authentication.” &amp;nbsp;In other words, there’s a password for your entire storage account, and anyone who has that password essentially owns the account. &amp;nbsp;It’s an all-or-nothing permission model. &amp;nbsp;That means you can never give out your shared key. &amp;nbsp;The only exception to the all-or-nothing rule is that blob containers can be marked public, in which case anyone may read what’s inside the container (but not write to it).&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Signed access signatures give us a new mechanism for giving permission while retaining security. &amp;nbsp;With signed access signatures, my application can produce a URL with built-in permissions, including a time window in which the signature is valid. &amp;nbsp;It also allows for the creation of container-level access policies which can be referenced in signatures and then modified or revoked later. &amp;nbsp;This new functionality enables a number of interesting scenarios...&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span style="background-color: magenta;"&gt;Azure Storage&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px; font-weight: normal;"&gt;—&lt;/span&gt;&amp;nbsp;Concurrency:&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: normal;"&gt;The basic model appears to be that a user or app would download a blob or entity then modify that blob/entity locally. After that, the user/app would attempt to commit those local changes&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;by writing the updated version back to storage. So, what happens if more than one app attempts to modify the same storage object (e.g., blob or table) at the same time? The first writer wins. Subsequent writes (of the same version) will fail. This is a form of &lt;i&gt;optimistic concurrency&lt;/i&gt;&amp;nbsp;and is achieved via maintaining version numbers. Note that an app can force his changes to stick by unconditionally updating an entity or blob.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;/ol&gt;&lt;b&gt;&lt;span style="background-color: #9fc5e8;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="FabricController"&gt;&lt;/a&gt;The Fabric Controller (FC)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal;"&gt;One per datacenter. Is replicated across several machines (maybe 5&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;7). Owns all of the resources in the fabric (including computers, switches, load balancers). Communicates with each machine's Fabric Agent. Every physical machine has a Fabric Agent running on it which keeps track of how many VMs are running on this machine, how each Azure app in each VM is doing, and so on. The FA reports this info back to the FC which uses it (along with the app's configuration file or model) to manage the app so that the app remains healthy (as defined in the app's configuration file).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: normal;"&gt;The FC monitors all running apps, manages its own infrastructure (e.g., keeps VMs patched, keeps OSs patched, ...), and performs resource allocation using its global view of the entire fabric along with the configuration file for the app that needs to be deployed. &lt;/span&gt;All of this is done &lt;i&gt;automatically&lt;/i&gt;&lt;span style="font-weight: normal;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;The FC presently (i.e., in the CTP) allocates VMs to processor cores in a one-to-one manner (that is, no core will have more than one VM running on it).&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The FC maintains a graph which describes its hardware inventory. A node in the graph is a computer, load balancer, switch, router, or network management device. An edge is a networking cable (e.g., connecting a computer to a switch), power cable, or serial cable. When an app needs to be deployed, the FC may allocate an entire physical machine or, more commonly, may subpartition that machine into VMs and allocate one or more VMs to the given role. The size of the allocation depends upon the configuration settings for that role.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="background-color: #f4cccc;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="ServiceModel"&gt;&lt;/a&gt;The service model&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Is "declarative," which means rule-based. So the model or specification consists of a set of rules. Those rules are used by the Fabric Controller in initially allocating/provisioning resources for your service &lt;i&gt;and&lt;/i&gt;&amp;nbsp;to manage the service over its lifetime (i.e., maintain its health). The model contains info that you might otherwise communicate to the IT department that was going to deploy and run/manage your service in-house. This technique/setup is referred to as &lt;i&gt;model-driven service management&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;What it looks like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Contains the topology of your service (which comprises a graph):&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Which roles? How many instances of each?&lt;/li&gt;&lt;li&gt;How are the roles linked (i.e., which roles communicate with which other roles)?&lt;/li&gt;&lt;li&gt;What interfaces exposed to the Internet?&lt;/li&gt;&lt;li&gt;What interfaces exposed to other services?&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;For each role, defines attributes of that role, e.g.,&lt;/li&gt;&lt;ul&gt;&lt;li&gt;What hosting environment does that role require? (E.g., IIS7, ASP.NET, CLR, ...)&lt;/li&gt;&lt;li&gt;How many resources does that role need? (e.g., CPU, disk, network latency, network bandwidth, ...)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Configuration settings: all are accessible at run-time. Can register to be notified when the value of a particular setting changes.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Application configuration settings&lt;/b&gt;: defined by the developer. Can think of these as being akin to command-line arguments that one would pass to a program. The app will behave differently depending upon the values of these arguments. Can use these to create different versions of your app where the versions differ on the basis of their values for these configuration settings.&lt;/li&gt;&lt;li&gt;&lt;b&gt;System-defined configuration settings&lt;/b&gt;: predefined by the system.&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;How many fault domains?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How many update domains?&lt;/li&gt;&lt;li&gt;How many instances of each role?&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;In the CTP, don't get to use entire service-model language. Instead, will be provided with various templates; can choose one and customize it for your particular app. Eventually, more flexibility (a higher level of control over service model configuration) will be exposed.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="background-color: #a2c4c9;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="ServiceLifecycle"&gt;&lt;/a&gt;The service lifecycle&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;[Developer] Develop code. Build/construct service model.&lt;/li&gt;&lt;li&gt;[Developer/Deployer] Specify desired config.&lt;/li&gt;&lt;li&gt;[FC] Deploy app; FC maps app to hardware in the way specified in the config/model.&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Resource allocation: choose hardware to allocate to the app based on the app's service model. Is basically a ginormous constraint satisfaction problem. Performed as a transaction: all resources allocated for an app or none are. Example constraints include:&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Question&lt;/b&gt;: Are there both system constraints and application-defined constraints? Then both sets are combined? For example, some of the sample constraints seem like something that the system would specify, such as "Node must have enough resources to be considered" or "Nod must have a compatible hosting environment" whereas others seem more app-specific, as in "Each node should have at most a single instance of any given role assigned to it."&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Provisioning: Each item of allocated hardware is assigned a new "goal state." The FC will drive each piece of hardware to its goal state.&lt;/li&gt;&lt;li&gt;Upgrades:&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;[FC] Monitor app state and maintain app health, according to the service model and the SLA.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Handle software faults, hardware failures, need to scale up/down.&lt;/li&gt;&lt;li&gt;Logging infrastructure gathers the data needed to diagnose an app as unhealthy (where "health" is application-defined and provided in the app's service model).&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;ul&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;b&gt;&lt;span style="background-color: #6aa84f;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4478245028379356028&amp;amp;postID=2093910210209896260" name="Misc"&gt;&lt;/a&gt;Miscellaneous Other&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Development environment allows desktop simulation of the entire Azure cloud experience. Can run your app locally and debug that way.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Can specify which data centers your app runs in and stores its data in.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Two-stage deployment to the cloud (which can also be used to achieve zero-downtime upgrades):&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Upload application, access via &lt;guid&gt;.cloudapp.net, where &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cloudapp.net&lt;/span&gt; points to a load balancer (i.e., the DNS entry contains the load balancer's &lt;i&gt;virtual IP&lt;/i&gt;&amp;nbsp;(VIP)). Then connections to the app will be routed through this load balancer.&lt;/guid&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Presumably anyone can connect to the app (i.e., it's world reachable) but not everyone knows the particular globally unique ID associated with this app?&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;To make the app run live, DNS entry created which ties the application's domain name (e.g., myazureservice.net) to the load balancer's VIP.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Can layer any desired HTTP-based authentication mechanism on this. Or can use Windows Cloud Services (the Live Service in particular) which provides authentication.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Machines are grouped into fault domains, where a fault domain is a collection of systems with some common dependency, which means that this entire set of machines could go down at the same time. For example, all machines that sit behind a single switch are in the same fault domain as are all machines that rely on the same power supply.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;In configuring the settings for your Azure app and storage, you might specify that two instances of the same thing (e.g., two identical Web roles or two instances of Azure Storage) should not be located within the same fault domain.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;And actually, for the case of Azure Storage, the Storage app takes care of making sure that it has more than one version of itself and is spread across different fault domains (rather than the Fabric Controller doing this).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Easy to determine&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;given the FC's graph of all inventory (i.e., hardware)&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;what the fault domains are. Can determine statistically what the likelihood of failure is for each such domain.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Update domains: if you're doing a rolling upgrade of your service, a certain percentage of your service will be taken offline at any time (and upgraded). That percentage is the size of your update domain.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Security/Isolation&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Use VMs to isolate one role from others&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;For PDC, app can only be managed code, which can be easily sandboxed&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Run app code at a reduced privilege level&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Network-based isolation&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;IP filtering&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Firewalls: each machine configured to only allow traffic that machine expects&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Automatically apply Windows security patches (heh).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MIX 2009 introduced the ability to run Web or worker roles with more privileges than previously was allowed. In particular, there are Code Access Security (CAS) levels, such as Partial Trust and Full Trust. In order to be able to run non-.NET (a.k.a., non-managed or native) code, the Web or Worker role needs to be able to spawn a process or to issue the Platform Invoke command. Apparently, one can only do those things with Full Trust. Hence, this is how MSFT will support non-managed code: you will configure your Web or Worker role to execute your non-managed code. So the Web or Worker role bootstraps your code.&lt;br /&gt;&lt;a href="http://blogs.msdn.com/windowsazure/archive/2009/03/18/hosting-roles-under-net-full-trust.aspx"&gt;http://blogs.msdn.com/windowsazure/archive/2009/03/18/hosting-roles-under-net-full-trust.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thus, in order for this to work, the code you execute has to be &lt;i&gt;copy-deploy&lt;/i&gt;, which means that you don't have to install the code (since even Full Trust &lt;/span&gt;does not include&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;administrative or install privileges)&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;instead, you can merely copy the code to the VM and run it.&lt;br /&gt;&lt;a href="http://blog.smarx.com/posts/does-windows-azure-support-java"&gt;http://blog.smarx.com/posts/does-windows-azure-support-java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;The MSFT VMM is based on their Hyper-V Hypervisor, which was released in June 2008.&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt; &lt;/span&gt; TODO&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Read up on REST.&lt;/li&gt;&lt;li&gt;Get more details on fabric controller and data-center architecture etc.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Can see more about the FC&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;as far as redundancy goes&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;&lt;a href="http://channel9.msdn.com/pdc2008/ES19/" target="_blank"&gt;here&lt;/a&gt;&amp;nbsp;(starting at about 30:00).&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Get more details &lt;a href="http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#ServiceModel" target="_blank"&gt;on the "service model,"&lt;/a&gt; which is how the app developer communicates with the Azure OS Compute platform about how to manage his app.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lizstinson.blogspot.com/2009/10/azure-fabric-controller.html" target="_blank"&gt;More details on how the FC drives nodes into the goal state&lt;/a&gt; (i.e., monitors and maintains app health).&lt;/li&gt;&lt;li&gt;How do these virtual IPs and dedicated IPs (where the latter make up a pool that "back" the virtual IPs)&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;how does all of this work? Presumably there is some address translation at some point (mapping a connection to a virtual IP to instead be to a real IP)&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;like NAT&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;but at which point? At the load balancer?&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Maybe just means an internal IP address, such as 192.168.1.1?&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-2093910210209896260?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/2093910210209896260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/2093910210209896260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/2093910210209896260'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/10/more-detailed-notes-on-azure.html' title='More detailed notes on Azure architecture'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZBDg7C2Kjko/StYYWngKKZI/AAAAAAAAAI0/aLQjjgDDJ_Q/s72-c/Picture7.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-6484072270710390119</id><published>2009-10-14T13:04:00.000-07:00</published><updated>2009-10-14T15:42:25.961-07:00</updated><title type='text'>More on Azure</title><content type='html'>Below is some basic data on Windows Azure as well as brief exploration into relevant background topics (such as managed code and dynamically generated Web page content). The below contains no details on the various Azure Services (such as Live Services and .NET Services) and few details about the Azure OS run-time. It's all pretty high-level and gauzy.&lt;br /&gt;&lt;br /&gt;Future posts may fill in more details such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What does execution look like on the cloud (what kind of isolation between web apps and so on)? Each machine in the fabric runs one instance of Azure OS? And each instance of Azure OS runs an instance of IIS7? And is there a one-to-one mapping between apps and instances of Azure OS (surely not)? Etc.&lt;/li&gt;&lt;li&gt;How exactly can one specify the health constraints of his app (where the Fabric Controller uses these conditions to automatically manage the app/service&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;including scaling the app up or down (creating/deleting instances) or restarting the app)?&lt;/li&gt;&lt;li&gt;What do the various Service APIs look like? (E.g., for SQL Data Services, Live Services, .NET Services, and so on) What operations are available?&lt;/li&gt;&lt;li&gt;How will MSFT support web apps written in non-MSFT languages (e.g., python), i.e., how will incorporate support for non-managed code?&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;Notes from&amp;nbsp;&lt;a href="http://channel9.msdn.com/pdc2008/ES16/"&gt;Manuvir Das, "A Lap Around Azure"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.readwriteweb.com/images/azure.jpg" /&gt;&lt;br /&gt;Windows Azure == OS for the cloud.&lt;br /&gt;It's the lowest layer. Services are layered on top of this foundation, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Live services&lt;/li&gt;&lt;li&gt;.NET services&lt;/li&gt;&lt;li&gt;SQL services (a.k.a. "Data Services")&lt;/li&gt;&lt;li&gt;SharePoint services&lt;/li&gt;&lt;li&gt;MSFT Dynamics CRM services&lt;/li&gt;&lt;/ul&gt;These services are implemented using REST, HTTP, and XML.&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;What's a cloud?&lt;/span&gt;&lt;/b&gt; A set of connected servers.&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;What can you do on the cloud &lt;/span&gt;&lt;/b&gt;(i.e., on those servers)? Install and run services; store and retrieve data.&lt;br /&gt;A client can access Azure services via calling into a "managed class library" (presumably some code that contains RPC-like stubs which&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;at run-time&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;invoke the appropriate code).&lt;br /&gt;&lt;br /&gt;In the desktop computing world, an OS provides:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An environment in which to run an app (abstracts away the particular underlying hardware config)&lt;/li&gt;&lt;li&gt;Access to a shared file system, which provides isolation via access control&lt;/li&gt;&lt;li&gt;Resource allocation from a shared pool&lt;/li&gt;&lt;li&gt;Support for different programming environments&lt;/li&gt;&lt;/ul&gt;In a cloud computing OS, you want all of the above plus 24/7 operation, pay-as-you-consume, transparent administration (i.e., which hides the complexity of remote mgmt as much as possible).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What features does Azure provide?&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Automated service management.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The developer defines rules about which code should be executed under which conditions (where a condition might be, "URL x was visited") as well as the code itself. The platform follows these rules in deploying, monitoring, and managing the developer's service.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;A powerful hosting environment. All of the hardware for actually running and serving your code (servers, load balancers, firewalls?). Two possible execution modes: direct and virtualized (where the latter is via a hypervisor).&lt;/li&gt;&lt;li&gt;Scalable and available storage in the cloud. Provides abstractions such as: blobs, tables, and queues.&lt;/li&gt;&lt;li&gt;A rich familiar developer experience. Includes a local testing/debugging environment which provides a complete simulation of the cloud. So that developers can test their app in an environment as close to the real thing as possible. The simulated enviro lets the application do everything it would be able to do if it were actually running on the Azure OS in the cloud.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;More on Automated Service Management&lt;/b&gt;&amp;nbsp;(Is this the so-called &lt;i&gt;Fabric Controller&lt;/i&gt;? Yes, I think so.)&lt;br /&gt;The developer writes his code as before. But he also now creates a &lt;i&gt;model&lt;/i&gt;, which specifies:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What should the service topology look like? How big? Use cloud storage? How many front-end roles? How many back-end roles? Should the front- and back-end roles be able to talk to one another? If so, how? (Note that these various roles can connect to the outside world, which enables the developer to communicate with a particular role directly.) A common idiom is for the different roles (e.g., Web Role, Worker Role) communicate via shared storage&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;i.e., one adds to a queue (is a producer) and the other takes from that queue (is a consumer).&lt;/li&gt;&lt;li&gt;How to define health of my service (i.e., conditions under which I should be alerted because such conditions indicate that the service needs attention of some sort).&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MS detects failures (of hardware, software, bugs, ...)&lt;/li&gt;&lt;li&gt;MS detects violation of health constraints (i.e. detects when your app's execution is outside of the definition of healthy)&lt;/li&gt;&lt;li&gt;MS needs a way to transparently fix stuff (ideally w/o a human in the loop). Maybe by rebooting your service, moving it to another server.&lt;/li&gt;&lt;li&gt;Achieve this via abstraction. Application code refers to logical resources (rather than to particular IP addresses or underlying CPUs). If need to obtain the actual hardware addresses at run-time, can invoke APIs which provide physical values (e.g., addresses) corresponding to specified logical resources.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Configuration settings: what particular values or parameters do I want to be able to change at run-time without having to reploy the entire service?&lt;/li&gt;&lt;/ul&gt;Note that you don't *have to use* their automated, abstracted thing. They provide a so-called "escape hatch" or Raw mode, which lets the developer build a VM from the ground up and run his service within that VM (where the developer would be responsible for managing that service as well). So this offering much more closely resembles Amazon's EC2 service except even with this the developer doesn't actually supply his own VM (as he would with EC2) but rather configures one of their VMs.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;More on Azure Storage&lt;/b&gt;: massive scale, availability, durability. Geo-distribution. Geo-replication. This is NOT to be confused with SQL Services because Azure Storage does not expose the full database-management interface (which would include querying, insertion, schema creation, and so on). Only can upload data (and presumably delete it?). And available ways to structure data are very simple.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Large items of unstructured data: Blobs, file streams&lt;/li&gt;&lt;li&gt;Structured data (referred to as "service state"): Tables, caches&lt;/li&gt;&lt;li&gt;Service communication: queues, locks&lt;/li&gt;&lt;/ul&gt;Cloud Storage is accessible from anywhere on the Internet. Has REST APIs on it.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;More on Developer Experience&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Support for a variety of programming languages: ASP.net, .NET, native code, PHP&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bunch of tools and support, including for logging, alerts, tracing, ...&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Including the much touted "desktop SDK for full simulation of the cloud"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My own look at things&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px; font-weight: normal;"&gt;—&lt;/span&gt;&amp;nbsp;questions and comments&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Can I only run a &lt;i&gt;web&lt;/i&gt;&amp;nbsp;application on Azure? E.g., if I wanted to run a mail server on Azure, could I do that or not? If not, what mechanisms are actually &amp;nbsp;used to prevent this? Restrict traffic that's not on a standard HTTP/HTTPS port?&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Yes&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;according to&amp;nbsp;&lt;a href="http://channel9.msdn.com/pdc2008/ES01/"&gt;this PDC 2008 session&lt;/a&gt;, an input endpoint (which is an app's externally-reachable interface to the world) must use either port 80 or port 443 (note that an app doesn't have to have an input endpoint). Hence, you couldn't define an app to run on Azure which had an input endpoint of port 25 (for SMTP), for example.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;For the non-MSFT languages which can run on Azure (e.g., PHP, Python, Ruby), what run-time environment does a program in such a language run? Does the user choose the particular run-time environment?&lt;/li&gt;&lt;li&gt;And then what about sandboxing? What kind of isolation among various apps running on the Azure Fabric?&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;Since someone will ask, what are the benefits of moving an app to the cloud?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you have a customer-facing web application and you have customers scattered across the globe then can use Azure to run an instance of your app at various geographic locations. This will have the effect of reducing latency for customers accessing your application from India, for example.&lt;/li&gt;&lt;li&gt;Availability: Relieves the user from having to maintain redundant servers (and infrastructure for fault tolerance); let MSFT handle that.&lt;/li&gt;&lt;li&gt;Scalability: Let MS also handle scaling of your application automatically.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Frees app-provider up from responsibility of maintaining a number of machines for the service that corresponds to the expected peak load for that service (despite the fact that normal use might be well below peak).&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Zero-downtime upgrades.&lt;/li&gt;&lt;li&gt;If you need huge amounts of storage or the ability to do batch processing or the ability to run an application on a very large data set (for example, as with MapReduce), you can achieve this by running your app / doing your processing in the cloud. Frees you up from having to purchase and maintain physical resources, especially since the job may only be a temporary thing (and hence the physical resources would be idle most of the time).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;At some point, will look in more detail at each Azure Service being offered&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;to understand what can do with that service, who uses it, and so on. But for starters here they are:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Compute on Azure OS.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Store using Azure OS.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Cheap, efficient, not necessarily very expressive.&lt;/li&gt;&lt;li&gt;That is, this is NOT a full-service relational database interface that enables SELECT, INSERT, and so on. This is a very simple interface that only exposes a couple different storage formats (blob, queue, simple [non-relational] table) and presumably only a couple ways to manage (operate on) the stored data.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Access Live services for...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Access .NET services for...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Access SQL services for...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Access SharePoint services for...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Access MSFT Dynamics CRM services for...&lt;/li&gt;&lt;ul&gt;&lt;li&gt;CRM: Customer Relationship Management; software and/or processes/strategies. Includes all methods by which a company responds to (or reaches out to) its customers. So call center, sales force, marketing, tech support, field services. Players in this area: Oracle (Siebel, PeopleSoft), SAP, salesforce.com, Amdocs, MSFT, Epiphany, and others.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;The so-called "Fabric Controller"&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Windows Azure Fabric is a "scalable hosting environment" that is "built on distributed MS data centers." The Fabric Controller manages resources, performs load balancing, observes developer-provided constraints/requirements for an app as well as the real-time conditions for that app/service and responds accordingly (by, for example, automatically provisioning additional resources, restarting the service, taking away some unneeded resources, and so on). The FC scales app resources automatically as demand rises and falls. Used to deploy service and manage upgrades.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Azure OS performs advanced tracing and logging on apps that run on it&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;so that developers can monitor the status of their apps as far as compute, storage, and bandwidth. Presumably, the constraints that developers specify are in terms of the type of things that can be observed using this tracing. Note that since MS is allowing apps written in non-MS languages, the types of "signals" that can be used to monitor the health of an app are likely OS-level (rather than language-level) things. For example, easy to identify the # of open sockets and heap size. More difficult for an OS to have visibility into language-level resource usage such as the number of locks created/acquired and so on. Hence, the types of things that one can specify in the application model must be rather generic and observable from the OS-level. &lt;span style="background-color: yellow;"&gt;I wonder whether&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;for apps written in MS languages and which will run in an MS environment (such as .NET framework)&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;one can specify a different (richer) set of constraints in the application model.&lt;/span&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="background-color: lime;"&gt;Notes from &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="background-color: lime;"&gt;&lt;a href="http://channel9.msdn.com/pdc2008/ES01/"&gt;Steve Marx, Developing and Deploying Your First Cloud Service&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Managed code == code written using an MSFT language and which executes on MSFT run-time; e.g., .NET, IIS7, WCF&lt;/li&gt;&lt;li&gt;Can only run a web application on Azure OS, not an arbitrary network app.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Enforced via only allowing an app to have an input endpoint whose port is 80 or 443; this means that the app can only receive traffic on the port for HTTP or the port associated with HTTPS.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;The cloud on your desktop: complete offline cloud simulation. Actual cloud == set of connected servers or machines, also referred to as the fabric; it's what your app will run on. The "cloud on your desktop" is a set of processes (all of which run locally), where each process simulates a server. So the set of local processes are your "cloud on the desktop"; also referred to as "development fabric."&lt;/li&gt;&lt;li&gt;There's a UI for playing with / seeing this development fabric; can see each service deployment. For each service deployment, can see all the roles that this service has defined and, for each role, all of the &lt;i&gt;instances&lt;/i&gt; of that role.&lt;/li&gt;&lt;li&gt;When create a new project, two associated files are created: the service definition file (ends in *.csdef) and the service configuration file (ends in *.cscfg). These are XML files which contain metadata about your service. The service definition file defines all of the roles and, for each role, defines the input endpoints for that role (where an endpoint consists of a name, protocol (e.g., HTTP or HTTPS), and port (80 or 443, respectively). If there are any configuration-specific settings or parameters, those parameters are &lt;i&gt;declared &lt;/i&gt;here (but given values elsewhere). The service configuration file identifies for each role the number of instances of that role (that should be created) and&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;for any configuration settings declared in the service definition file&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;provides values for those settings/parameters.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Horizontal scaling&lt;/b&gt;: have code running on a single server; to scale == add more servers&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But what about state? How to share state across various instances? (Why need to share state? Because a user could interact with a different instance each time and the fact that there are multiple instances needs to be transparent to that user&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;i.e., the user can begin a transaction on one server and continue that transaction on another) Solution: Use a single centralized database (a "durable store") to store all state; no server stores any state locally. All servers access state from this store == all servers have same view of state.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have this available in Azure as the Azure OS storage: blobs, simple tables, queues. Access this storage via REST and ADO.NET Data Services.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b&gt;&lt;span style="background-color: cyan;"&gt;A brief detour&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px; font-weight: normal;"&gt;—&lt;/span&gt;&amp;nbsp;some background on Microsoft languages and run-time environments&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Evidently Microsoft has developed an infrastructure which enables code to be written in any one of several different languages then run on a variety of platforms. Parts of their infrastructure are reminiscent of Java with its bytecode and platform-specific JVMs. In particular, MSFT created various languages (e.g., C#, J#, VB.NET). Each of these languages has its own compiler which takes a program in the language and produces code in an intermediate language. This code is platform-agnostic (much the same as Java bytecode); the intermediate language is CIL&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;Common Intermediate Language. Then for each different hardware/OS platform, there is a Common Language Runtime (much the same as there are different JVMs for each hw/OS platform). CIL code is executed on the CLR. The CLR compiles and caches the CIL code just-in-time to the appropriate hardware instructions given the underlying CPU architecture (e.g., x86).&lt;br /&gt;&lt;br /&gt;So the Microsoft languages for which a compiler exists (which converts a program in that language into a program in the intermediate language, CIL) are referred to as &lt;i&gt;managed&lt;/i&gt;; so a program written in C#, J#, or VB.NET is managed code. Such code (after being compiled into CIL) executes on the CLR, which is a &lt;i&gt;managed environment&lt;/i&gt;. Unmanaged code by contrast is that which is not compiled into CIL and does not run within the CLR. So when we say that something is a &lt;i&gt;CLI Language&lt;/i&gt;, we mean that there is a compiler that takes a program in that language and produces the corresponding CIL code. (Fyi, CIL was "previously known as MSIL&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px;"&gt;—&lt;/span&gt;&amp;nbsp;Microsoft Intermediate Language.") &lt;b&gt;Actually, "managed code" is a general term which covers any code that runs within a VM (rather than executing directly on the underlying hardware).&lt;/b&gt;&amp;nbsp;A C++ program written with Microsoft Visual C++ could be compiled into managed code (to run in the .NET CLR) &lt;i&gt;or&lt;/i&gt;&amp;nbsp;unmanaged code (using the old MFC framework). But in general all code written in a particular language will be compiled into managed or unmanaged code (rather than being able to be compiled at will into one form or the other).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Overview_of_the_Common_Language_Infrastructure.png/280px-Overview_of_the_Common_Language_Infrastructure.png" /&gt;&lt;br /&gt;&lt;br /&gt;The CLR evidently exports an API that offers a lot of functionality that is usually provided by an OS. In particular, the CLR provides functions for: memory management, thread management, exception handling, garbage collection, and "security." This functionality is provided in the Class Libraries. The class libraries implement common functions such as: read/write, render graphics, interact w/DB, manipulate XML documents. The .NET Framework Class library consists of two libraries:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Base Class Library (BCL)&lt;/b&gt;: small subset of entire class library. Core set of classes that serve as the basic API of the CLR. Many of the functions provided by MSCORLIB.DLL and some of those provided in System.DLL and System.core.DLL. Akin to the standard libraries that come with Java.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Framework Class Library (FCL)&lt;/b&gt;: superset of BCL classes. Entire class library that ships with .NET Framework. Includes expanded set of libraries: WinForms, ADO.NET, ASP.NET, and others.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;img alt="CLR diag.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/CLR_diag.svg/400px-CLR_diag.svg.png" /&gt;&lt;br /&gt;&lt;br /&gt;So, as portrayed above, the Common Language Infrastructure (CLI) consists of the intermediate language (CIL) and the environment within which that intermediate language executes (the CLR). Together the CIL and the CLR comprise the CLI.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What kind of benefits do you get by using a CLI?&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Can have a program which combines components written in different high-level languages.&lt;/li&gt;&lt;li&gt;Can compile once (into CIL) and run anywhere (for which there exists a CLR).&amp;nbsp;&lt;/li&gt;&lt;li&gt;There are also some benefits of managed code generally: the ability to provide stronger type safety (since can do run-time type checking), garbage collection&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Another brief foray away from the main topic here: Web Page Content&lt;/b&gt;&lt;br /&gt;A web page can have only static content (the web page's content doesn't change) or it can have dynamic content. In the latter case, where does the dynamism come from? Two possibilities.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There might be client-side scripting which changes the way the page is presented depending upon mouse movements, keyboard input, or timing events. So the dynamism is in how the content is &lt;i&gt;presented&lt;/i&gt;. Languages used to achieve this include JavaScript (part of Dynamic HTML) and Action Script (part of Flash). These scripts might inject sound, animation or change the text. One can also perform remote scripting using these languages; &lt;i&gt;remote scripting&lt;/i&gt;&amp;nbsp;entails a Web page asking for more information from the server &lt;i&gt;without having to reload the page&lt;/i&gt;. We see this in XMLHttpRequest, for example.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Secondly, server-side scripts might dynamically generate different web page content depending upon the data provided by the user in an HTML form (e.g., the user enters his name (John) and the generated page says, "Hi John! Welcome to..."), URL parameters, the browser type, or DB/server state. The server-side languages used for this type of dynamic content generation include: PHP, Perl, ASP, ASP.NET, JSP, ColdFusion, and so on. These languages use the Common Gateway Interface (CGI) to produce dynamic web pages.&lt;/li&gt;&lt;/ol&gt;Suffice it to say, we could explore these topics much more carefully and thoroughly. But the above suffices for our purposes, which are to understand what ASP or ASP.NET are (answer: server-side scripting languages, like PHP).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;References&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.readwriteweb.com/archives/windows_azure.php"&gt;http://www.readwriteweb.com/archives/windows_azure.php&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.readwriteweb.com/archives/microsoft_azure_redefine_os.php"&gt;http://www.readwriteweb.com/archives/microsoft_azure_redefine_os.php&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/azure/faq.mspx"&gt;http://www.microsoft.com/azure/faq.mspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ASP.NET"&gt;http://en.wikipedia.org/wiki/ASP.NET&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/.NET_Languages"&gt;http://en.wikipedia.org/wiki/.NET_Languages&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure"&gt;http://en.wikipedia.org/wiki/Common_Language_Infrastructure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Common_Language_Runtime"&gt;http://en.wikipedia.org/wiki/Common_Language_Runtime&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Managed_code"&gt;http://en.wikipedia.org/wiki/Managed_code&lt;/a&gt;&lt;/li&gt;&lt;li&gt;More on the CLR from MSFT:&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ddk909ch(VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/ddk909ch(VS.71).aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/.NET_Framework"&gt;http://en.wikipedia.org/wiki/.NET_Framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Base_Class_Library"&gt;http://en.wikipedia.org/wiki/Base_Class_Library&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;http://en.wikipedia.org/wiki/Representational_State_Transfer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;On the topic of Model-View-Control&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;MSDN's&amp;nbsp;Model-View-Controller:&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms978748.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms978748.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Especially what Dean Helman wrote here:&amp;nbsp;&lt;a href="http://ootips.org/mvc-pattern.html"&gt;http://ootips.org/mvc-pattern.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;http://en.wikipedia.org/wiki/Model–view–controller&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-6484072270710390119?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/6484072270710390119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/10/more-on-azure.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/6484072270710390119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/6484072270710390119'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/10/more-on-azure.html' title='More on Azure'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-6060197800080295343</id><published>2009-10-09T13:00:00.000-07:00</published><updated>2009-10-10T10:01:59.116-07:00</updated><title type='text'>Ad networks, exchanges, and auctions</title><content type='html'>&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: yellow; background-image: initial; background-repeat: initial;"&gt;Definitions&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Display advertising&lt;/b&gt;: ad formats – videos, images and interactive ads&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Reach&lt;/b&gt;: of all unique Internet users, the percent that an ad network encounters. Pay attention to whether this is reported in terms of US or globally when comparing one network's reach to another's.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Maximum yield&lt;/b&gt;: from the publisher’s perspective, the highest price he can get for each impression.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Direct sales&lt;/b&gt;: the publisher sells his ad space directly to the advertiser, in contrast to an ad network, which serves as an intermediary between publishers and advertisers. Note that direct sales has been the prevailing model for selling &lt;i&gt;premium&lt;/i&gt; publisher space – e.g., the front page the NYT etc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Ad slot&lt;/b&gt;: defines the size of an ad and the specific location where the ad will appear on a particular page or on a group of similar pages. The name of an ad slot might incorporate: the site name (ESPN), the section within that site (Football), the subsection within that section (e.g., NCAA College Football), page position (e.g., Top, Middle, Center combined with Left, Right, Center), and dimensions (728x90).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Placement&lt;/b&gt;: a set of ad slots. It lets you group together slots that a single advertiser (or ad network) might want to simultaneously target.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;An insertion order (IO)&lt;/b&gt;: an agreement between an ad seller and a buyer that specifies the details of the campaign. Contains one or more line items. Serves as the purchase order and contract between the parties. Often includes info such as pricing, impression goals, delivery options, and targeting details.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Line item&lt;/b&gt;: an advertiser’s commitment to purchase a specified # of impressions, clicks, or time (CPD) on certain dates at the specified price.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l1 level1 lfo9; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Ad trafficking&lt;/b&gt;: done by an ad server; entails providing the code – which downloads and tracks an ad – to the publisher to embed in his site (so that when a user executes that code, the ad will be served to him). I.e., delivery of the ad.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Forecasting&lt;/b&gt;: a challenge for publishers. The act of predicting what inventory – in which ads can be placed –&amp;nbsp;you will have&amp;nbsp;in the future.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l6 level1 lfo2; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Ad operations&lt;/b&gt;: handles fulfillment of online ad sales. Entails trafficking (the day-to-day execution of campaigns; including ad delivery), inventory management (inventory forecasting), sales, web development (produce and develop the advertising activity).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;See also&lt;/b&gt;: Google’s “Introduction to Ad Operations”&lt;br /&gt;&lt;a href="http://services.google.com/training/gamtutorials/Intro_to_Ad_Operations/"&gt;http://services.google.com/training/gamtutorials/Intro_to_Ad_Operations/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: yellow; background-image: initial; background-repeat: initial;"&gt;What’s an ad server?&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;Ad serving refers to the tasks involved in storing an ad and delivering it on-demand to the specified user. It also entails keeping track of how many times each ad was served, where an ad was served to, how many times the ad was clicked on, and so on. These are all &lt;i&gt;reporting&lt;/i&gt;-related activities. An ad server may also perform &lt;i&gt;targeting&lt;/i&gt; – wherein the server decides which ad to serve based on the user who will view the ad. In this case, the ad server might store a cookie on every user’s computer (for users who interact with this ad server at some point) and use that cookie to figure out stuff about the user – age, sex, marital status, education level, household income, and so on. That info – along with more mundane facts, such as what operating system a user is running, which browser he’s using and so on – is used as input into the decision about what ad to serve the user.&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;What are some more specific features involved at the various stages of ad serving?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l3 level1 lfo8; tab-stops: list 0in left .25in 246.0pt; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;To make the size of a bid depend on an ad’s past performance.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l3 level1 lfo8; tab-stops: list 0in left .25in 246.0pt; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;To cap the frequency with which an ad is served, the pace at which it’s served, the targeting (to whom it’s served).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l3 level1 lfo8; tab-stops: list 0in left .25in 246.0pt; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Dynamic selection: target only the impressions you want&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l3 level1 lfo8; tab-stops: list 0in left .25in 246.0pt; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;A centralized clearing system – don’t have to interface directly with each publisher.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l3 level1 lfo8; tab-stops: list 0in left .25in 246.0pt; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Provide &lt;i&gt;&lt;u&gt;targeting&lt;/u&gt;&lt;/i&gt;, which in this context means: advise the advertiser on which sites he might like to display his graphical ad on. So the ad server doesn’t necessarily facilitate this transaction but he provides guidance into identifying placements that make sense, given the advertiser’s target audience segment, geography, time of day, website content, browser, OS, keywords, …&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: cyan; background-image: initial; background-repeat: initial;"&gt;There are a number of ways for a publisher to access this functionality:&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l4 level1 lfo1; tab-stops: list .25in left 246.0pt; text-indent: -.25in;"&gt;1.&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="LTR"&gt;Run his own ad server (machine) on his own site premises; e.g., OpenX is an open-source ad server implementation (in the same way that Apache is an implementation of a web server) that a user can download, install, run, and manage in-house. The publisher controls every aspect of ad sales, storage, delivery, and reporting – as well as manages the physical hardware used to perform these tasks.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l4 level1 lfo1; tab-stops: list .25in left 246.0pt; text-indent: -.25in;"&gt;2.&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="LTR"&gt;Run an instance of OpenX in the cloud. In this case, the publisher retains total control over all aspects of ad serving (sales, storage, delivery, reporting) but doesn’t have to run and maintain the actual physical ad server in his own equipment room.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l4 level1 lfo1; tab-stops: list .25in left 246.0pt; text-indent: -.25in;"&gt;3.&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="LTR"&gt;Contract with an ad server who provides everything &lt;b&gt;but sales&lt;/b&gt; for a fee. That is, the ad server does storage, delivery, and reporting; the publisher takes care of sales. The ad server may provide info about the type of users that a publisher attracts. This info can be used by the publisher in identifying advertisers that are a good fit for his visitors.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l4 level1 lfo1; tab-stops: list .25in left 246.0pt; text-indent: -.25in;"&gt;4.&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="LTR"&gt;Finally, a publisher can contract with an ad network. In this case, the ad network runs its own ad server (which does storage, delivery, and reporting) as well as handles ad sales. Ad networks were developed to enable an advertiser to simultaneously have his ads shown on various Web sites without having to contract individually with each such site. Google, Yahoo, Microsoft, AOL, Fox Interactive Media, AdBrite, ValueClick and so on are all examples of ad networks. Note that when people talk about ad networks, they generally mean display-ad networks. That is, an ad network is an interface between people who want to show display ads to users and sites who have space available for rent for just that reason.&lt;br /&gt;&lt;br /&gt;This is probably the most common model – in terms of what the highest number of publishers do. It may not be the most common model in terms of revenues; that is, high profile publishers together command the lion’s share of display advertising revenues. And these high profile (or premium) publishers have historically done &lt;b&gt;direct sales&lt;/b&gt; of their advertising space – rather than relying on an ad network.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;References&lt;/b&gt;:&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Ad_serving"&gt;http://en.wikipedia.org/wiki/Ad_serving&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;a href="http://www.openx.org/ad-server"&gt;http://www.openx.org/ad-server&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Advertising_network"&gt;http://en.wikipedia.org/wiki/Advertising_network&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.clickz.com/3626556"&gt;http://www.clickz.com/3626556&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: yellow; background-image: initial; background-repeat: initial;"&gt;Background on Ad Networks&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l5 level1 lfo3; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Definition&lt;/b&gt;: an intermediary between publishers and advertisers. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l5 level1 lfo3; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Primarily associated with the graphical or display advertising space, rather than the search advertising market.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l5 level1 lfo3; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Ad Networks provide a way for an advertiser’s content to run across the Web – i.e., on lots of websites that are not necessarily under the control of the same administrative domain.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l5 level3 lfo3; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Provide a way to mitigate the effects of evermore audience fragmentation.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l5 level1 lfo3; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;An ad network may also serve or host the actual ads that run on these publisher pages; that is, visiting the publisher page causes a request to be sent to the ad network and the ad content to be downloaded from (i.e., served by) that ad network. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l5 level3 lfo3; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Tracks ads.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l5 level3 lfo3; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Reports on the distribution of ads.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l5 level3 lfo3; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Handles the transaction between advertiser and publisher.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l5 level1 lfo3; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Frees publisher up from having to maintain a sales organization (in order to monetize his inventory).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l5 level1 lfo3; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Gets paid on a revenue-sharing basis.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: lime; background-image: initial; background-repeat: initial;"&gt;How do ad networks vary?&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l8 level1 lfo4; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;What audience they reach: size, demographics, …&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l8 level1 lfo4; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;The ways in which they can target: vertical, contextual, behavioral, demographic, re-targeting, geographic, site-specific&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l8 level1 lfo4; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Type of compensation they accept: CPM, CPC, CPL (Lead), CPA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l8 level1 lfo4; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Ad formats they support: display, text, in-text, video, mobile, in-game, blog, RSS, email, audio/podcast, widgets&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l8 level1 lfo4; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Their business model: revenue share, arbitrage, rep firm&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l8 level1 lfo4; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;The extent to which they provide related services to publishers and advertisers.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l8 level1 lfo4; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;The amount and quality of user information they possess. &lt;br /&gt;To the extent that behavioral marketing takes off, someone like Google has reams of information that they can deploy to better perform such targeted marketing. This is in contrast to an entity such as Microsoft that doesn’t have as much of this kind of info.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: yellow; background-image: initial; background-repeat: initial;"&gt;Background on Ad Exchanges&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l0 level1 lfo7; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;What’s an ad exchange?&lt;/b&gt; A trading exchange for display advertising in which website owners and advertisers can reach deals on prices and placement of ads.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l0 level1 lfo7; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;A stock exchange for online display&lt;i&gt; &lt;/i&gt;ads; i.e., a real-time marketplace with an auction-based system and open bidding process – sells impressions &lt;i&gt;in real-time&lt;/i&gt; or &lt;b&gt;on-the-spot&lt;/b&gt; (auction platforms are associated with impression-by-impression purchasing).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 45.0pt; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -27.0pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;They can also be used as a futures market – to acquire reserved inventory.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 45.0pt; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -27.0pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;A web site puts up ad space for auction and ad agencies bid for those spots. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l0 level1 lfo7; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;What problem does it solve?&lt;/b&gt; Managing co-ordinated, large-scale display advertising campaigns across the net is a logistical nightmare. Given that an effective campaign has to span a multitude of display ad formats and thousands of sites, it takes ages to plan and manage campaigns.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l0 level1 lfo7; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Who are the players in the exchange? &lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;The large online publishers participate in the exchange to sell their inventory.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Ad networks (and agencies) are the buyers. So an advertiser contracts with an ad network or ad agency which maintains a network of properties (placements) where the advertiser’s ads can be placed.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 1.0in; mso-list: l0 level2 lfo7; tab-stops: list 1.0in; text-indent: -.25in;"&gt;&lt;span style="font-family: 'Courier New';"&gt;o&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;The buyer will likely have his own ad serving technology.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;You can also buy space on the AdSense publisher network via the exchange.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Similarly, if you’re an AdWords customer (i.e., advertiser), you can buy ad space on the exchange – via your AdWords interface (you accomplish this by electing to have your ads shown on the Google Content Network).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;And if you’re an AdSense customer (i.e., publisher), you can sell display space on your site on the exchange – via the AdSense interface (check this out).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .5in; mso-list: l0 level1 lfo7; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;“On an exchange, publishers can choose to sell their inventory blind, private, or branded. Which they choose will differ from publisher to publisher, but obviously branded inventory will still be able to command a premium, taking it out of the commodity area. Publishers can also disqualify particular advertisers from whom they do not want to accept advertising (for competitive or other reasons), or make positive qualifications regarding the type of advertisers they will accept (e.g., women's interest only). On the buy side, marketers or their agencies are offered similar control.”&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: lime; background-image: initial; background-repeat: initial;"&gt;Benefits of Ad Exchanges&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Transparent, dynamic pricing; open bidding.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Simplified, standardized business processes (ad sale/purchase) makes things easier.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Better liquidity for ad inventory.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Smaller advertisers have equal access to exchange inventory as the Big Guys – with bigger ad budgets and better relationships – do. A leveling of the playing field.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Can use technology to automate things such as: bid on any ad space that has properties X, Y, Z and is available for less than $N.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Eliminates intermediaries and their margins.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;A publisher gets access to many more advertisers while still retaining control over who can advertise on the publisher’s site.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l7 level1 lfo5; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Buyers can use technology that lets them bid in real-time (based on various criteria and via an automated agent?).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: lime; background-image: initial; background-repeat: initial;"&gt;How do ad exchanges vary?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.clickz.com/3630872"&gt;http://www.clickz.com/3630872&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l2 level1 lfo6; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Their inventory&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l2 level1 lfo6; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Their targeting methods&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l2 level1 lfo6; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Their placement options&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: .25in; mso-list: l2 level1 lfo6; tab-stops: list 0in; text-indent: -.25in;"&gt;&lt;span style="font-family: Wingdings;"&gt;§&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Their pricing models&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: cyan; background-image: initial; background-repeat: initial;"&gt;Does a publisher usually have an exclusive relationship with a particular ad exchange – so that the publisher cannot offer his space on multiple exchanges simultaneously? Also, are the ad exchanges themselves connected in any way – so that a buyer on one ad exchange can purchase through it property that is listed on another exchange?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;I think a goal is certainly to interconnect the ad exchanges (if this isn’t the case already). Also note that a publisher may have generic deals with advertisers – not for any specific impression but for impressions which match certain criteria. Those generic deals can be compared with real-time bids (obtained in the ad exchange auction) to see which is best and make the sell decision then. In this way, a publisher reconciles an advertiser’s desire to make a futures buy (reserve inventory) with the benefits of a per-impression sale.&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: yellow; background-image: initial; background-repeat: initial;"&gt;Incorporating AdWords bids into the DoubleClick Ad Exchange&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;OK, we’ll walk through an example to hopefully illuminate at least the auction process itself, if not the entire context. Let’s say that there is some slot (i.e., impression) being offered on the DoubleClick Ad Exchange. And that slot has been explicitly targeted by an AdWords advertiser (via a site placement for his display ad) or the slot contextually matches the advertiser’s graphical ad (or industry, whatever). And actually let’s say that the slot matches several AdWords advertisers’ bids: ad_1, ad_2, ad_3, and ad_4.&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; margin-left: 51.75pt; mso-border-alt: solid windowtext .5pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 480;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"&gt;   &lt;td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 65.45pt;" valign="top" width="87"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;Advertiser&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 36.15pt;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;CTR&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 70.0pt;" valign="top" width="93"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;# clicks/M&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .5in;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;CPC&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 45.0pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;eCPM&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 27.0pt;" valign="top" width="36"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;QS&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 61.05pt;" valign="top" width="81"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;Ad Rank&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 1;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 65.45pt;" valign="top" width="87"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;ad_1&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 36.15pt;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;1%&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 70.0pt;" valign="top" width="93"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;10&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .5in;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 45.0pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$30&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 27.0pt;" valign="top" width="36"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;7&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 61.05pt;" valign="top" width="81"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$210&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 2;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 65.45pt;" valign="top" width="87"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;ad_2&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 36.15pt;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;2%&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 70.0pt;" valign="top" width="93"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;20&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .5in;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 45.0pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$60&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 27.0pt;" valign="top" width="36"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;8&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 61.05pt;" valign="top" width="81"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$480&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 3;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 65.45pt;" valign="top" width="87"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;ad_3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 36.15pt;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;5%&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 70.0pt;" valign="top" width="93"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;50&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .5in;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$2&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 45.0pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$100&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 27.0pt;" valign="top" width="36"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;6&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 61.05pt;" valign="top" width="81"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$600&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 4; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 65.45pt;" valign="top" width="87"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;ad_4&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 36.15pt;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;3%&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 70.0pt;" valign="top" width="93"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;30&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .5in;" valign="top" width="48"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 45.0pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$90&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 27.0pt;" valign="top" width="36"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;7&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 61.05pt;" valign="top" width="81"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;$630&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;eCPM is the effective CPM rate and is calculated by identifying the # of clicks per 1000 impressions that an ad is expected to obtain (# clicks/M) then multiplying that value by the cost per click bid. Quality Score is multiplied by eCPM in this case in order to get AdRank (rather than by the CPC). Then we can see that ad_4 wins and ad_3 comes in second place; only these two bids will be considered by the Ad Exchange. &lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="left" border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-bottom-style: none; border-collapse: collapse; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; margin-left: 6.75pt; margin-right: 6.75pt; width: 595px;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"&gt;   &lt;td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 69.05pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt;"&gt;&lt;b&gt;Advertiser&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 107.35pt;" valign="top" width="143"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;b&gt;Ad   Exchange bid&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 81.0pt;" valign="top" width="108"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;b&gt;&amp;gt;=   minCPM?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 1.25in;" valign="top" width="120"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;b&gt;Publisher’s   cut&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 99.0pt;" valign="top" width="132"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;b&gt;Ad   Exchange cut&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 1;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 69.05pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt;"&gt;ad_3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 107.35pt;" valign="top" width="143"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$580&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 81.0pt;" valign="top" width="108"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;Yes&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 1.25in;" valign="top" width="120"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$493&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 99.0pt;" valign="top" width="132"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$87.00&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 2;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 69.05pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt;"&gt;ad_4&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 107.35pt;" valign="top" width="143"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$552&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 81.0pt;" valign="top" width="108"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;Yes&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 1.25in;" valign="top" width="120"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$469.20&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 99.0pt;" valign="top" width="132"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$82.80&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 3;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 69.05pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt;"&gt;minCPM&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 107.35pt;" valign="top" width="143"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$520&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 81.0pt;" valign="top" width="108"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;Yes&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 1.25in;" valign="top" width="120"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$442&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 99.0pt;" valign="top" width="132"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$78.00&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 4;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 69.05pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt;"&gt;adExch_1&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 107.35pt;" valign="top" width="143"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$375&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 81.0pt;" valign="top" width="108"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;No&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 1.25in;" valign="top" width="120"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 99.0pt;" valign="top" width="132"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 5;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 69.05pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt;"&gt;adExch_2&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 107.35pt;" valign="top" width="143"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$500&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 81.0pt;" valign="top" width="108"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;No&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 1.25in;" valign="top" width="120"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 99.0pt;" valign="top" width="132"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 69.05pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt;"&gt;adExch_3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 107.35pt;" valign="top" width="143"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$750&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 81.0pt;" valign="top" width="108"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;Yes&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 1.25in;" valign="top" width="120"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$637.50&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 99.0pt;" valign="top" width="132"&gt;&lt;div align="center" class="MsoNormal" style="mso-element-anchor-horizontal: margin; mso-element-anchor-vertical: paragraph; mso-element-frame-hspace: 9.0pt; mso-element-left: -.05in; mso-element-top: .1pt; mso-element-wrap: around; mso-element: frame; mso-height-rule: exactly; tab-stops: 246.0pt; text-align: center;"&gt;$112.50&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First we have to take out the AdWords cut so that the bid represents: what the publisher will make plus what the Ad Exchange gets for the trouble (transaction). Let’s say (HYPOTHETICALLY) that the AdWords revenue share is 8%. Then we have: ad_4 == $630 * 0.92 == $579.60 (let’s call it $580) and ad_3 == $600 * 0.92 == $552. Naturally, taking out the AdWords revenue share doesn’t change the relative ordering between these two ads – because we assume that revenue share is the same (rate) for everyone. Now let’s combine those bids with other Ad Exchange bids and with the publisher’s min CPM.&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;So now we’re considering the most lucrative AdWords ads (ad_3 and ad_4) alongside of the publisher’s minimum CPM and any Ad Exchange bids for that slot (impression). The next thing we do is subtract the publisher’s cut from each bid (which we’re assuming to be 85% across the board; rumor has it that 50% is a more likely estimate) – so that we’re left with what the DoubleClick Ad Exchange stands to make on the deal. THEN we take into account that the publisher may have other bids for this space – that were obtained by his own ad-sales team. You can think of these as commitments that the publisher has made to various advertisers – but these commitments can be fulfilled within a time window (rather than being a real-time thing –specific to a single impression). So the publisher could always use one of those bids. And, if one of those bids is better than all of the bids from the Ad Exchange (including the AdWords bids) – which are all represented as what the Exchange stands to make on the deal – then the publisher should place serve this in-house ad in this impression.&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;So the DoubleClick Ad Exchange interfaces with the publisher’s own ad server to obtain that ad server’s bids for these slots. Those bids are specified in terms of what the Ad Exchange would make on the transaction and hence can be compared (apples-to-apples) to the values in the final column of the above table. So then we’re looking at:&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; margin-left: 1.25in; mso-border-alt: solid windowtext .5pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 480;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"&gt;   &lt;td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;b&gt;Advertiser&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;&lt;b&gt;DoubleClick   Exchange cut&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 1;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;ad_3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;$87.00&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 2;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;ad_4&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;$82.80&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 3;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;minCPM&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;$78.00&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 4;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: magenta; background-image: initial; background-repeat: initial;"&gt;adExch_3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;&lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: magenta; background-image: initial; background-repeat: initial;"&gt;$112.50&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 5;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;inHouse_1&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;$96.00&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 6;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;inHouse_2&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;$73.25&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 7; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: .95in;" valign="top" width="91"&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;inHouse_3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 153.0pt;" valign="top" width="204"&gt;&lt;div align="center" class="MsoNormal" style="tab-stops: 246.0pt; text-align: center;"&gt;$101.50&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;So in this case, the winner of the slot was one of the bidders from the Ad Exchange. If the publisher has “dynamic allocation,” then this transaction will complete automatically (without requiring any approval) and the ad from the &lt;span style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: magenta; background-image: initial; background-repeat: initial;"&gt;adExch_3&lt;/span&gt; advertiser will be shown to the Web site visitor whose impression triggered this whole execution cycle.&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;Note that a publisher doesn’t necessarily have any in-house bids (i.e., bids from “the publisher’s own ad server) – i.e., its direct sales channel is empty for this slot. Note also that it appears then that the final decision about which bid wins is made in order to optimize the DoubleClick Exchange’s cut. But – so long as the publisher’s cut is the same across all advertisers – this is the same as getting the maximum cut possible for the publisher. The rate is the same across all advertisers and hence the winning bid will be the one with the largest principle – of which the cuts are being taken.&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;See: &lt;a href="http://adwords.google.com/support/aw/bin/answer.py?hl=en&amp;amp;answer=146606"&gt;http://adwords.google.com/support/aw/bin/answer.py?hl=en&amp;amp;answer=146606&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="tab-stops: 246.0pt;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-6060197800080295343?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/6060197800080295343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/09/ad-networks-exchanges-and-auctions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/6060197800080295343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/6060197800080295343'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/09/ad-networks-exchanges-and-auctions.html' title='Ad networks, exchanges, and auctions'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-5190283214586642004</id><published>2009-10-08T13:19:00.000-07:00</published><updated>2009-10-10T09:54:05.658-07:00</updated><title type='text'>I also really like these companies that create new ad-hoc employment marketplaces</title><content type='html'>For example, &lt;a href="http://www.justanswer.com/" target="_blank"&gt;JustAnswer&lt;/a&gt; is a company that lets random people post questions on a variety of topics (from auto repair to programming to relationship advice). The questioner specifies how much the answer is worth to him. Then the question is posed to the community. Whomever answers the question in a way that satisfies the questioner gets paid.&lt;br /&gt;&lt;br /&gt;Similar to lots of other efforts to "crowd source" resolution of various questions. Major difference (with JA) is that the answerer gets remunerated (i.e., paid for his trouble). Another major difference with JustAnswer in particular is the amount of due diligence they do in order to "certify" various folks (potential answerers) as being Expert-level in some category. The idea being that if I ask a question about an area I don't know much about, I can rely on JA's accreditation of folks as a gauge of who is trustworthy. I took their test to become certified as an expert in programming and found it reasonable: 10 multiple choice questions, not cake, reasonably generic (rather than w.r.t. specific idioms/languages/paradigms).&lt;br /&gt;&lt;br /&gt;But basically I am always really pumped about products that create opportunities for small-scale entrepreneurs to run their own businesses&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;whether that business consists of answering questions (using JA), writing apps for the iPhone, writing apps/games for Facebook (or some other social network), etc.&lt;br /&gt;&lt;br /&gt;We also saw this with Coghead awhile back which let individual coders (or small teams thereof) create applications on the Coghead platform and then sell those apps as a service to whomever. So an individual programmer becomes in effect a SaaS provider by leveraging the Coghead foundation. Of course we see something similar with AppEngine&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;where Google worries about hosting, server administration, and so on. All you have to do is create your Web service (in Java or Python) via providing code to execute when particular URLs are visited and you're off to the races.&lt;br /&gt;&lt;br /&gt;The whole thing results in a lot more liquid, task-specific employment market&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;and gives workers a lot more options. In a way it's not different than the advances we've seen in resource management in computer science. Fueling the resurgence of virtual machines the past decade was the fact that companies had servers that were not being used wisely. Might have a dedicated server for each different service (e.g., mail, web, news, ftp, ...) which resulted in poor resource allocation because some resources sat idle much of the time while others were (at the same time) oversubscribed. With virtualization, resource allocation became more fluid. A high-demand service could be spread across machines whereas quieter (lower demand) services could all safely share the same hardware without adversely affecting one another.&lt;br /&gt;&lt;br /&gt;In any case, I'm way bullish on any company or product that encourages this same "efficient resource allocation" of human capital. Develop a more just-in-time marketplace where matching humans to jobs occurs dynamically and in response to real-time demand. Taking the real-time per-impression ad-auction paradigm and applying it to humans and jobs/work to be done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-5190283214586642004?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/5190283214586642004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/10/i-also-really-like-these-companies-that.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/5190283214586642004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/5190283214586642004'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/10/i-also-really-like-these-companies-that.html' title='I also really like these companies that create new ad-hoc employment marketplaces'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-1711424943865009576</id><published>2009-10-07T12:43:00.000-07:00</published><updated>2009-10-10T09:55:12.144-07:00</updated><title type='text'>Some interesting companies (just the gist), 10/06/2009</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;Rapleaf&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.rapleaf.com/" rel="nofollow" style="color: #0000cc; text-decoration: none;"&gt;http://www.rapleaf.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Figure out what your customers are doing on the Web as far as social networking etc. goes; for individuals: figure out what is being said about you on the Web.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;TrialPay&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.trialpay.com/" rel="nofollow" style="color: #0000cc; text-decoration: none;"&gt;http://www.trialpay.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Real-time, dynamic generation of "deals" for consumers; so if you're at the WinZip site but decide not to buy the software then later are about to make a purchase at Wine.com, you might be offered a deal to let you get that WinZip software for cheaper&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;along with your wine. Rather than deals being a one-size-fits-all static kind of thing, a deal is generated for a specific user based on that user's past behavior AND based on what it might take to convert that user.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;JustAnswer&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.justanswer.com/"&gt;http://www.justanswer.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Everyday people can pose questions about everything from car repair to computer repair to relationships. A person provides his question along with what it's worth to him to get the question answered. Then a swarm of experts will jump in and try to resolve the matter&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;earning the fee in the process. &lt;br /&gt;&lt;br /&gt;Not so different from aardvark.com and fixya.com except that the answerer gets reimbursed in this case. Also, JA takes steps to make sure that the answerer is qualified to answer the question. In order to sign up to be a Programming Languages expert, I had to successfully complete a straightforward multiple-choice quiz of programming questions.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;Adify&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.adify.com/"&gt;http://www.adify.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These are guys responsible for building the various vertical ad networks; e.g., the Martha Stewart Living ad network whose anchor is the Martha Stewart site but which also includes related sites/publishers.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;meebo&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.meebo.com/"&gt;http://www.meebo.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Overcomes the historical limitation of chat programs which was that a chat client was tied to a particular chat network and so you could only chat with someone on your same network (sounds almost insane to type this; what a dumb way to do things!). With meebo, you chat via a Web interface and you can chat using an AIM, Yahoo, MSN, MySpace, Google Talk, etc. client and you can chat with anyone using any other chat client. You can also easily create chat rooms.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;Yelp&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.yelp.com/"&gt;http://www.yelp.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Standard review site, like CitySearch. Provides reviews of dentists, restaurants, dating services, clothing stores, and so on. A user can vote on reviews and a business can respond to reviews about it. Reviewers are encouraged to generate original content such as lists of the top happy hour spots, the best place for a cheap mani/pedi, and so on. Reviewers are also encouraged to share more info about themselves&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;to personalize their profiles.&lt;br /&gt;&lt;br /&gt;When you search for something on Yelp, you might also be provided with sponsored search results. That is to say that Yelp probably derives a substantial portion of its revenues from search marketing (i.e., selling text ads based on keywords). A business can also pay Yelp to put one of the reviews of this business at the top of the business's page. So that when a user visits that business's page, the first review she sees is this selected one. The business still has no control over its other reviews&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;including over the order in which those reviews appear.&lt;br /&gt;&lt;br /&gt;&lt;b&gt; TODO&lt;/b&gt;: Look into: whether they deliver display ads yet, how they sell the ads that appear in search results&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;based on keywords? via an auction? on an impression-by-impression basis? and so on. Basically, do they roll their own ad sales/placement or are they a publisher that belongs to some network, such as AdSense&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;and hence they outsource all ad-sales-related activities. Presumably since it's Yelp's primary source of income, they manage ad sales directly.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;Cooliris&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.cooliris.com/"&gt;http://www.cooliris.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Their products are Cooliris and CoolPreviews. Cooliris is a browser extension which lets you explore the contents of your disk drive&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;in particular to look at the pictures in any folder and navigate through those pictures in some cool way. So that is the heart of the Cooliris proposition&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;the way that you navigate through your photos, the way that they present those photos to you, and so on. So in a way, what Cooliris competes with is your computer's traditional way of displaying your photos to you. For Windows, if a folder contains pictures, I can see small thumbnails of each picture (maybe each is 1.5 inches by 1.5 inches) or I can view the photos in a slideshow. With the slideshow presentation, I see a much larger version of each photo but I can only see a single photo at a time. &lt;br /&gt;&lt;br /&gt;By contrast, with Cooliris, you can simultaneously be looking at a large collection of photos, each of which is a much larger thumbnail. So for starters, you might be looking at two rows of photos, each of which consists of around 4 photos. And the thumbnails for each photo are much larger than traditional thumbnails&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;maybe 4 inches by 2 inches (but the sizes are variable). Then the new thing is that you can rotate those rows so that&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;instead of looking at the two rows (one covering the top half of the screen and the second covering the bottom half) straight-ahead&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;you are looking at the rows from a sidelong glance. This lets you simultaneously look at more than 8 photos. Maybe more like 12. The effect is that your screen becomes 3-dimensional and the plane containing the photos pivots on its leftmost vertical edge or its rightmost vertical edge, like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZBDg7C2Kjko/SszTvRmwj1I/AAAAAAAAAIk/BeBeUoY_7LM/s1600-h/bigger--Cooliris.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_ZBDg7C2Kjko/SszTvRmwj1I/AAAAAAAAAIk/BeBeUoY_7LM/s320/bigger--Cooliris.bmp" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;br /&gt;By presenting the photos to you using three dimensions, they can present more photos for you to consider at once. Moreover, as you scroll through the rows of photos by using the sidelong view, the photos cruise by you. So it's a very dynamic, bouncy-even presentation.&lt;br /&gt;&lt;br /&gt;Now they take this same technology for viewing photos on your hard drive and apply it to viewing photos of products at the marketplace. So there is a way to "go shopping" from your Cooliris plug-in. Similarly, you can visit various channels, each of which contains a collection of videos related to some topic such as Sports, News, Sci-Tech, Entertainment News, TV, and so on. See also:&amp;nbsp;&lt;a href="http://www.pcmag.com/article2/0,2817,2353223,00.asp"&gt;http://www.pcmag.com/article2/0,2817,2353223,00.asp&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-size: medium; line-height: normal;"&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;Jigsaw&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.jigsaw.com/"&gt;http://www.jigsaw.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a modern version of the Dun and Bradstreet databases that I remember using in my investment analyst job&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;in order to gain information on particular companies. Jigsaw maintains a database of both companies/organizations and individuals. The idea is that, for any individual, you should be able to view that individual's current position and contact info (basically his business card). Also, one can go from an organization to identifying key individuals within that organization (or can just learn more about the&amp;nbsp;organization&amp;nbsp;generally). So if you know you need to talk to the VP of Sales, you can figure out who that is. &lt;br /&gt;&lt;br /&gt;A user can "get points" by adding information about contacts and companies. The information you enter is associated with you&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;so that there's the basis for reputation scores, that is, for discounting information in the Jigsaw database depending upon who provided that information. Viewing certain info about companies/individuals requires redeeming points (i.e., so you must have previously contributed to the Jigsaw database) OR a paid subscription.&lt;br /&gt;&lt;br /&gt;Primary users are expected to be folks in sales, marketing, or recruiting. See also:&amp;nbsp;&lt;a href="http://www.jigsaw.com/corp/jigsaw_corporate_overview.pdf"&gt;http://www.jigsaw.com/corp/jigsaw_corporate_overview.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TODO&lt;/b&gt;:&amp;nbsp;Play with their data; how good is it? How accurately does it capture individuals/businesses of which I am aware?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;box.net&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.box.net/"&gt;http://www.box.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Is a way for a company to host documents in the cloud so that employees in arbitrary locations can collaborate on these documents. The documents can be internal (not publicly visible) or external (publicly visible). Enables creation of online file systems. Users can collaborate on documents. Can use their interface to share (via configuring permissions), access, and manage files in the cloud. All communication (including downloading, uploading, editing files?) takes place over an encrypted pipe (SSL). Your files are stored on multiple servers so that, if one hard disk drive fails, your data is not lost.&lt;br /&gt;&lt;br /&gt;An alternative to Microsoft SharePoint, which is derided as "too complicated." An improvement over emailing docs back and forth between team members (collaborators). Better than FTP where there is no notion of "merging changes;" if one user changes the doc and replaces the old version on the FTP site, that old version is gone. So changes occur at document-granularity. Hence, their primary value proposition is the ease with which one can use their system.&lt;br /&gt;&lt;br /&gt;Sharing: can share individual files or a whole folder of files. Share with someone via providing their email address. Each document can have an associated thread for comments. Can also create "discussions," which are presumably comment threads that are updated in real-time (i.e., not at all different from a chat room on meebo). Can create &lt;b&gt;tasks&lt;/b&gt;, to organize work flow. All of your documents, tasks, comments, and discussions can be searched and modified by the people you elect to provide these capabilities to. (Actually, a document's &lt;i&gt;contents&lt;/i&gt;&amp;nbsp;cannot apparently be searched &lt;b&gt;without a box business subscription&lt;/b&gt;.)&lt;br /&gt;&lt;br /&gt;With a &lt;i&gt;box business subscription&lt;/i&gt;, you can view previous versions of a document, customize the box interface, &lt;i&gt;search the content of your documents&lt;/i&gt;, view reports, manage users through an admin console.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TODO&lt;/b&gt;:&amp;nbsp;register and play with their interface, including observing how intuitive and easy-to-use their sharing interface is&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px; line-height: normal;"&gt;—&lt;/span&gt;&amp;nbsp;as well as how scalable (how easy and intuitive to maintain many sharing policies, to create sharing policies which apply to data not-yet-created, and so on). Etc.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;meraki&lt;/b&gt;:&amp;nbsp;&lt;a href="http://meraki.com/"&gt;http://meraki.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Traditionally, if you wanted to create a wireless LAN for your enterprise (), you would buy a collection of access points (APs), each of which was a hardware device that provided wireless Internet access to users within some radius of the device. To manage your wireless network then you had to log into each separate AP and configure it then monitor its status. That is, you couldn't log into a centralized server in order to get a network-wide view or in order to configure a network-wide policy. You had to interact individually with each separate AP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Recognizing the need for centralized monitoring and configuration,&amp;nbsp;vendors introduced a number of controller-based systems with thin APs (also called dependent APs). Unlike standalone APs, most thin APs cannot&amp;nbsp;operate on their own. Rather, they rely on one or more WLAN hardware controllers that need to be installed in wiring closets.&lt;br /&gt;&lt;/blockquote&gt;In this scenario, the hardware controller is a centralized management interface. It directs traffic between wireless and wired networks. It also lets clients roam from one AP to another. The AP connects to the controller over an Ethernet cable; through this cable, the AP obtains both Internet connectivity and power. This set-up is referred to as a:&amp;nbsp;&lt;i&gt;controller-based deployment with tethered APs&lt;/i&gt;. Controllers are expensive, they have installation costs. Also, when a WLAN controller fails, all APs connected to that controller lose connectivity (i.e., fail). So the controller is a single point of failure. ("Dual-redundant controllers, while technically possible, are often prohibitively expensive.")&lt;br /&gt;&lt;br /&gt;The next phase of evolution was to not require that APs physically connect to a controller but rather have a logical tunnel back to the controller. Presumably in this case, the AP derived its power by plugging into a wall socket. And there was a wireless connection from the AP to the controller. Sending data through an AP means the data would also go through that AP's associated controller. With this architecture, still need expensive, redundant controllers. This doesn't work so well if have multiple sites that all need to be on the same wireless LAN.&lt;br /&gt;&lt;br /&gt;With that backdrop, then, meraki's solution entails a single piece of hardware: the access point (actually a set of access points depending upon the number of clients and size of the region for which wireless service is to be provided). Then these access points connect to meraki's data center which consists of a bunch of servers which are used to configure, manage, and monitor a wireless LAN. So the hardware controllers are effectively centralized and moved to the cloud. Then multiple different wireless LANs can be run/managed using the same hardware controllers (so, some virtualization going on). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The Meraki Cloud Controller is out of band, which means that client traffic never flows through it...&amp;nbsp;Control traffic flows between the APs and the Cloud Controller via a persistent tunnel. All sensitive data, such as configuration details, user names, and passwords, are encrypted... Multiple geographically distributed data centers are used to ensure that networks continue to function even in the event of a catastrophic failure. All management is done remotely through a Web browser... The administrator can also remotely diagnose the APs, using standard tools like ping, from the Meraki remote management interface.&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;TODO&lt;/b&gt;:&amp;nbsp;Spend more time understanding the various architectural elements and how the meraki system differs from previous solutions etc.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, sans-serif; font-size: medium;"&gt;&lt;span style="font-size: 15px; line-height: 19px;"&gt;&lt;b&gt;Rocket Fuel&lt;/b&gt;:&amp;nbsp;&lt;a href="http://rocketfuelinc.com/index.html"&gt;http://rocketfuelinc.com/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's an ad network. Their customers are advertisers (who want to run a campaign) and&amp;nbsp;other ad networks (who want to add intelligence to their targeting and optimization but lack the in-house expertise to do so). RF also has partnerships with publishers (on whose sites the ads are run). From their site:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Rocket Fuel Inc. is building the first intelligent ad serving technology platform that combines the best of social, behavioral, contextual, geographical, search and other data sources to understand consumer interest and intent... We’re experts at predictive modeling and customer segmentation. Our core expertise is in developing and using technology to process and scale huge amounts of data to predict the likelihood of responses from individual users – we find audiences designed for your needs.&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;There should be no contextual ad networks or behavioral ad networks. It's like debating whether you should have eyes or ears. If you can have both, it's a win and there's no point debating.&amp;nbsp;There should just be smart ad networks that use as much relevant information as they can to pick the best impressions for a given campaign. An ad server should just use whatever data is found to be valuable in selecting the best ad for an impression, or the best impression for an ad.&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-1711424943865009576?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/1711424943865009576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/10/some-interesting-companies-just-gist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/1711424943865009576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/1711424943865009576'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/10/some-interesting-companies-just-gist.html' title='Some interesting companies (just the gist), 10/06/2009'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZBDg7C2Kjko/SszTvRmwj1I/AAAAAAAAAIk/BeBeUoY_7LM/s72-c/bigger--Cooliris.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-2525012925613263304</id><published>2009-09-21T10:36:00.001-07:00</published><updated>2009-10-10T09:55:48.484-07:00</updated><title type='text'>So I recently added Google Analytics code to this blog...</title><content type='html'>&lt;span style="font-size: medium;"&gt;&lt;/span&gt;Mostly to play with the functionality and so on. But a funny thing happened on the way...&lt;br /&gt;You are given a code snippet to add to your page's HTML; a portion of which is copied here:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;So I copied and pasted the above&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;as is&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;to the window of the Blogger editor (for editing blog posts). The Blogger editor has two editing modes: Edit HTML&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;which is supposed to let you directly edit the page's HTML&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;and Compose&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;which is more like an MS Word interface to editing a blog post; one can easily bold, italicize, change font, create bullets, and so on in this mode (using buttons rather than specifying HTML markup tags). Then that editor transforms your entered text into HTML.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Because I was given HTML code though (for analytics tracking), I used HTML mode and copied the given JavaScript scripts (as above) directly into the bottom of the page then saved and published. However, some *additional* code was added&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;by the Blogger editor&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;to the scripts that I inserted. In particular, XHTML line breaks were inserted within the JavaScript script. So, the above became:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;script type="text/javascript"&amp;gt; &lt;span style="font-size: large;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;b&gt;&amp;lt;br/&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;var gaJsHost = (("https:" == document.location.protocol)? "https://ssl." : "http://www."); &lt;span style="font-size: large;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;b&gt;&amp;lt;br/&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;So now I have XHTML line breaks (&lt;span style="font-family: 'courier new';"&gt;&amp;lt;br/&amp;gt;&lt;span style="font-family: Georgia, serif;"&gt;) within the analytics tracking scripts, which caused any JavaScript interpreter (parsing the above script) to choke and stop processing the script&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;and hence not to perform the analytics-related tasks. This explains why I wasn't seeing tracking information for clicks that I was sure had landed on my pages. The fix was simple of course: remove all line breaks in the analytics scripts. Interesting all the same.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(How did I verify that a JavaScript interpreter chokes when it sees &lt;span style="font-family: 'courier new';"&gt;&amp;lt;br/&amp;gt;&lt;span style="font-family: Georgia, serif;"&gt; mid-script? Using &lt;a href="http://www.w3schools.com/js/tryit.asp?filename=tryjs_textx"&gt;this sandbox&lt;/a&gt;.) (Note also that as far as Google Analytics was concerned, my tracking code was installed properly, which means their checker needs to be fixed.)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another curiosity is whether I should create separate Analytics "profiles" for each different page of my blog. And whether visiting my blog homepage will cause the analytics tracking scripts (which are inserted within every individual blog post) to *all be executed*. That is, I added analytics tracking scripts to each individual blog post. And when you visit my blog, you automatically see all posts. So presumably, every time I get a visitor to my homepage, all N analytics scripts will execute (where N is the number of blog posts) and so it will seem as if I've had N * x visitors (where x is the number of people who visit lizstinson.blogspot.com).&lt;br /&gt;&lt;div&gt;&lt;span style="font-size: medium;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-2525012925613263304?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/2525012925613263304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/09/so-i-recently-added-google-analytics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/2525012925613263304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/2525012925613263304'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/09/so-i-recently-added-google-analytics.html' title='So I recently added Google Analytics code to this blog...'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-4887938435826461822</id><published>2009-09-15T13:01:00.000-07:00</published><updated>2009-10-10T09:56:39.678-07:00</updated><title type='text'>(some) Google Technology, briefly: PageRank, MapReduce, Bigtable</title><content type='html'>&lt;div&gt;Below are some brief notes, meant only to capture the Big Picture. This simplification may come at the cost of precision and even accuracy. My apologies to the creators. By way of summarization, Google's philosophy is "in-house development designed to run on commodity hardware."&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;PageRank&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;&lt;div&gt;One signal of many. Examine entire link structure of the Web. Identify which pages are most important. Note that this is not the same thing as identifying which pages are most important &lt;i&gt;relative to some query&lt;/i&gt; or &lt;i&gt;within a given vertical&lt;/i&gt;. I think it's interesting that they use this overall importance measure rather than identifying importance &lt;b&gt;&lt;i&gt;within a given domain&lt;span style="font-style: normal; font-weight: normal;"&gt;. Then if it's important to have an overall metric, assign relative importance to each domain then calculate each page's resulting overall importance. In any case, from my incredibly cursory reading, it appears this is not what they do. They have an overall importance metric. Separately, they perform hypertext matching to compare Web documents to the query string. &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-style: normal; font-weight: normal;"&gt;The rationale behind my computing "overall importance" within a domain is that what seems unimportant one day can be quite important the next, e.g., consider pages dealing with "anthrax vaccines" pre-anthrax-letter-mailing and post-. The relative importance of such pages increases dramatically. And so by tweaking relative importance of various domains, we can automatically adjust the relative importance of all documents within those domains. But certainly this approach would have all sorts of challenges of its own, such as what the hell are the domains? How to handle documents that cross domains? Can domain identification be automated? And so on.&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In any case, your search results are obtained by considering the relative importance of all pages on the Web and combining that information with which pages best match your particular search query. So it seems that the hypertext analysis is used to determine which documents match and the "overall importance" metric is used to rank the matching documents. So is the idea that all documents match equally? Probably not; probably they use buckets. So all documents in this bucket match approximately equally; hence, use "overall importance" to rank the documents within this bucket. Do the same for the next bucket and so on. Ranking of results across buckets could be done by using all results from the first bucket (which perhaps maps the most closely) followed by all results from the second bucket (which maps the second most closely) and so on. Or something more sophisticated where the results from various buckets are interleaved.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that the parsing they do of Web pages (in order to build inverted indices which will be used to perform hypertext-matching) does not just scan the page's content. It's more sophisticated, taking into consideration fonts, the way a page is organized or divided, where a word occurs within a page (early on or later). This is meant, in part, to frustrate those who would manipulate results by inserting metatags which suggest that a page contains data that it does not actually visibly present.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;References&lt;/b&gt;:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.google.com/corporate/tech.html" target="_blank"&gt;http://www.google.com/corporate/tech.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ilpubs.stanford.edu:8090/422/1/1999-66.pdf" target="_blank"&gt;http://ilpubs.stanford.edu:8090/422/1/1999-66.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;MapReduce&lt;/span&gt;&lt;/b&gt;: &lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem that MapReduce was designed to solve was that Google (and others) had large sets of input data that they needed to perform computation over. If they ran that computation on a single computer, it would take a very long time. So they needed a way to break up the computation into smaller chunks (i.e., parallelize it), distribute those chunks to multiple computers, then merge the results. The raw data in this case might be, for example, crawled documents or web request logs. And the computation or processing might be to: (1) identify the most frequent queries, (2) represent the crawled documents graphically, (3) summarize the number of pages crawled by each host, or other tasks. The processing or computation is straight-forward but the input data set is HUGE and so it has to be split across multiple machines; otherwise it would take forever.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are a number of questions: How to parallelize this computation? How to distribute the (input) data (to the various machines)? How to handle failures?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So MapReduce is an abstraction that was introduced to allow solving common problems (such as how to handle failure) one time&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;in the MapReduce implementation&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;rather than having this machinery be reinvented for each different problem &lt;i&gt;instance&lt;/i&gt;. MR "hides the messy details of parallelization, fault-tolerance, data distribution and load balancing in a library."&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The various tasks that they were needing to solve in a distributed manner involved a couple common components. That is, the meat of those tasks could be broken up into two phases: (1) &lt;b&gt;MAP&lt;/b&gt;: apply a function to each input item in order to get a set of intermediate key/value pairs; this function is provided by the user and essentially decomposes the input data in a way that makes sense given the target computation; (2) &lt;b&gt;REDUCE&lt;/b&gt;: given several sets of intermediate key-value pairs (i.e., one set is generated by each machine participating in the computation and acting on some input data), merge the key-value pairs that have the same key. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a practical example, consider the problem of identifying the most frequently queries given a set of web request logs. Maybe we'd give one web request log to each participating machine. Then each machine would parse that log using the MAP function, which would result in the machine having a set of key-value pairs where the key is the query string and the value is the frequency with which that string appears in this web-request log. In this case, REDUCTION is trivial; in particular, reduction involves merging all machines' results, which means that&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;for each machine which has a key in common&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: medium;"&gt;&amp;nbsp;we add those machines' values for that key to obtain the key's ultimate value (i.e., total frequency). Remember that the "value" in this example is the frequency with which a query string (the key) appeared in the given machine's input data (web request log). Hence, REDUCE here is arithmetic addition but you can imagine a case where the combination of intermediate computation results is more complicated.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Note then that the steps are as follows&lt;/b&gt;:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Invoke MAP on an input pair; results in MAP returning a set of intermediate key-value pairs.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;MR library obtains these key-value pairs from all participating machines. Then MR library looks at this aggregate set of intermediate key-value pairs (those contributed by each machine) and identifies common intermediate keys.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;For each common intermediate key identified in the previous step, invokes REDUCE&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;supplying the common intermediate key I and all (intermediate) values for I. This function combines those values to obtain a single output value (corresponding to the given input key). Note that in principle, REDUCE could result in merely a different set of values (rather than being required to produce a single aggregate output value); that said, "typically just zero or one output value is produced per Reduce invocation."&lt;br /&gt;&lt;br /&gt;Note that the way that the values (for the given intermediate key) are supplied to Reduce is via an iterator. This makes it OK for an intermediate key to have a set of associated values that is too large to fit into memory.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;How to handle failure?&lt;/b&gt; Re-execute. In particular, failure is presumably a single machine dropping dead (or some small number of machines). And since the computation on each such machine is independent of that on other machines, we can restart or re-execute the computation that occurred on the failed machine without having to restart the entire job.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;MR is a widely applicable model&lt;/b&gt;:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://labs.google.com/papers/mapreduce-osdi04-slides/index-auto-0005-0001.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Source: &lt;a href="http://labs.google.com/papers/mapreduce-osdi04-slides/index-auto-0005.html" target="_blank"&gt;http://labs.google.com/papers/mapreduce-osdi04-slides/index-auto-0005.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MapReduce "is often used for generating and modifying data stored in BigTable[2], Google Reader,[3] Google Maps,[4] Google Book Search, "My Search History", Google Earth, Blogger.com, Google Code hosting, Orkut[4], and YouTube[5]."&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Source: &lt;a href="http://en.wikipedia.org/wiki/BigTable" target="_blank"&gt;http://en.wikipedia.org/wiki/BigTable&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;References&lt;/b&gt;:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://labs.google.com/papers/mapreduce.html" target="_blank"&gt;http://labs.google.com/papers/mapreduce.html&lt;/a&gt; (2004)&lt;/li&gt;&lt;li&gt;&lt;a href="http://labs.google.com/papers/mapreduce-osdi04.pdf" target="_blank"&gt;http://labs.google.com/papers/mapreduce-osdi04.pdf&lt;/a&gt; (paper)&lt;/li&gt;&lt;li&gt;&lt;a href="http://labs.google.com/papers/mapreduce-osdi04-slides/index.html" target="_blank"&gt;http://labs.google.com/papers/mapreduce-osdi04-slides/index.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/BigTable" target="_blank"&gt;http://en.wikipedia.org/wiki/BigTable&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Hadoop provides an open-source implementation of Map-Reduce; see: &lt;a href="http://en.wikipedia.org/wiki/Hadoop" target="_blank"&gt;http://en.wikipedia.org/wiki/Hadoop&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Bigtable&lt;/span&gt;&lt;/b&gt;: &lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a database and its implementation is built on top of Google's File System (GFS), Scheduler, Lock Service, and MapReduce. Non-Googlers can use Google's Bigtable implementation by developing programs for Google's AppEngine which use the engine's datastore (&lt;a href="http://www.stanford.edu/class/ee380/Abstracts/081105-slides.pdf" target="_blank"&gt;which sits on top of Bigtable&lt;/a&gt;). "Bigtable is used by more than sixty Google products and projects, including Google Analytics, Google Finance, Orkut, Personalized Search, Writely, and Google Earth."&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;blockquote&gt;Many projects at Google store data in Bigtable, including web indexing, Google Earth, and Google Finance. These applications place very different demands on Bigtable, both in terms of data size (from URLs to web pages to satellite imagery) and latency requirements (from backend bulk processing to real-time data serving).&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Motivating example&lt;/b&gt;: Webtable, "a copy of a large collection of web pages and related information that could be used by many different projects; let us call this particular table the Webtable. In Webtable, we would use URLs as row keys, various aspects of web pages as column names, and store the contents of the web pages in the contents: column under the timestamps when they were fetched..." This retention of time-modified information enables versioning.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A table does NOT have a fixed number of columns. Each table has multiple dimensions; it might have a row for each URL and columns corresponding to: the content stored at that URL at some time, the language of that content, ... Each cell would have an associated &lt;i&gt;time&lt;/i&gt; as well, making every two-dimensional table at least a three-dimensional table.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Each table is split&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;at row boundaries&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;into multiple tablets. That is, a range of rows is dynamically partitioned into a tablet. So a tablet might contain some number of rows; all of a row's contents can be found within a single tablet. Tables are divided into tablets in order to get tablets of size approximately 100&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;200MB. Each machine stores around 100 tablets (so 100 * 200MB == 20GB) [according to &lt;a href="http://andrewhitchcock.org/?post=214" target="_blank"&gt;notes from a talk in October 2005&lt;/a&gt;, so that may have changed substantially as the cost of disk space continues to drop]. This sizing is done to optimize Bigtable for the underlying file system implementation and:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;This setup allows fine grain load balancing (if one tablet is receiving lots of queries, it can shed other tablets or move the busy tablet to another machine) and fast rebuilding (when a machine goes down, other machines take one tablet from the downed machine, so 100 machines get new tablet, but the load on each machine to pick up the new tablet is fairly small).&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Special tablets keep track of the file system locations of data tables (akin to how a directory structure keeps track of where particular file blocks are stored on disk). These "meta-tablets" keep a mapping between tablet ID and location within the GFS. If a tablet or segment exceeds the 200MB limit, they use compression to reduce the segment's size.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Bigtable Data Model&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A table is really a multi-dimensional map which is indexed by row key, column key, and timestamp. Each value in the map (i.e., cell contents) is an uninterpreted array of bytes. The map is distributed and persistent, which means that different parts of it may be stored permanently on different machines in different locations. It's also sparse (though this seems to me more a function of the table's contents than of the table itself), which means that lots of cells have no values; for example, if each row corresponds to a URL then there are many more columns (each corresponding to a feature) than most URLs exhibit. As a contrived example, imagine that there was a column for each possible language. Then a row (URL) will only have an X in the column corresponding to the language in which this URL's content is written. Hence, all other language columns would be empty for this row.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Bigtable paper represents a table as having three dimensions; hence, one can access a cell value by providing the string identifying the row, the string identifying the column, and the 64-bit integer representing the timestamp. Alternatively, by just providing the row and column, one obtains an array of values contained in that cell at different times (value v0 at time t0, v1 at t1, and so on).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Dynamic Control over Data Layout and Format&lt;/i&gt;: There is a claim that clients can specify the locality of data (namely, Bigtable "provides clients with a simple data model that supports dynamic control over data layout and format, and allows clients to reason about the locality properties of the data represented in the underlying storage."). In particular, Bigtable stores data in lexicographic order by row key. Then the row keys that a client uses determine which data will be stored together and hence enable the client to group data that should be accessed together in adjacent rows. I'm not sure how frequently the "dynamic partitioning" of a table into tablets occurs (whether it's something that's done once up front and retained thereafter OR IF INSTEAD a table might be repartitioned as the contents of various rows grow/shrink).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;blockquote&gt;For example, in Webtable, pages in the same domain are grouped together into contiguous rows by reversing the hostname components of the URLs. For example, we store data for maps.google.com/index.html under the key com.google.maps/index.html. Storing pages from the same domain near each other makes some host and domain analyses more efficient.&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;Sample Application&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;Google Analytics&lt;/b&gt;, which:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;provides aggregate statistics, such as the number of unique visitors per day and the page views per URL per day, as well as site-tracking reports, such as the percentage of users that made a purchase, given that they earlier viewed a specific page. &lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;To enable the service, webmasters embed a small JavaScript program in their web pages. This program is invoked whenever a page is visited. It records various information about the request in Google Analytics, such as a user identifier and information about the page being fetched. Google Analytics summarizes this data and makes it available to webmasters.&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;The Bigtable for this application consists of one row per end-user session, where the row is named by a tuple consisting of the website name followed by the time the session was created. Then sessions that visit the same site are contiguous in the Bigtable (which is kept sorted lexicographically by row name, recall) and are sorted chronologically. A summary table (approximately 20TB) is generated periodically for each such "raw click table" by running various MapReduce jobs which extract info from the Bigtable (approximately 200TB).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other applications: Google Earth and Personalized Search.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A lesson they learned in building Bigtable was not to add new features until there's a use case for them.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: black;"&gt;&lt;b&gt;References&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;a href="http://labs.google.com/papers/bigtable.html" target="_blank"&gt;http://labs.google.com/papers/bigtable.html&lt;/a&gt;&lt;/span&gt; (2006)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/BigTable" target="_blank"&gt;http://en.wikipedia.org/wiki/BigTable&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://andrewhitchcock.org/?post=214" target="_blank"&gt;http://andrewhitchcock.org/?post=214&lt;/a&gt;&lt;/li&gt;&lt;li&gt;There is also an open-source implementation of Bigtable as part of Hadoop; it's called HBase: &lt;a href="http://hadoop.apache.org/hbase/" target="_blank"&gt;http://hadoop.apache.org/hbase/&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tangential items that came up in writing the above&lt;/b&gt;:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Inverted indices&lt;/b&gt;: a non-inverted (or forward) index contains a list of documents and, for each document, identifies the words that appear in that document. An inverted index then lists the words (i.e., is &lt;i&gt;indexed by&lt;/i&gt;) and identifies which documents each word appears in. So an inverted index maps from content to location. There are two types of inverted indices: (a) a record level inverted index (or inverted file) provides, for each word, references to all documents containing that word. The second type is a word-level inverted index (a.k.a. inverted list or full inverted index) which lists, for each word, the documents in which that word appears and, for each document, the position(s) within that document at which the word appears.&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Index_(search_engine)" target="_blank"&gt;http://en.wikipedia.org/wiki/Index_(search_engine)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Inverted_index" target="_blank"&gt;http://en.wikipedia.org/wiki/Inverted_index&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Full_text_search" target="_blank"&gt;http://en.wikipedia.org/wiki/Full_text_search&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Functional (programming) languages&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); &lt;/script&gt; &lt;script type="text/javascript"&gt; try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-4887938435826461822?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/4887938435826461822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/09/some-google-technology-briefly-pagerank.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/4887938435826461822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/4887938435826461822'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/09/some-google-technology-briefly-pagerank.html' title='(some) Google Technology, briefly: PageRank, MapReduce, Bigtable'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-5751922120470477948</id><published>2009-08-15T08:33:00.001-07:00</published><updated>2009-09-21T10:30:30.056-07:00</updated><title type='text'>Notes on The Long Tail by Chris Anderson</title><content type='html'>&lt;a href="http://www.thelongtail.com/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The Long Tail&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, by Chris Anderson&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Introduction&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Our culture has been fixated on best seller lists for about a century. The reason is that the distribution costs for movies, television shows, music groups, even books were such that only a relatively few could be distributed. So the goal was to maximize the audience for the relatively few TV shows, movies, and music groups that are distributed so as to recoup costs. As a practical example, consider your local bookstore. It only has so much shelf space. So naturally it wants to choose the books to populate that shelf space that have the greatest chance of selling. And so the focus on best sellers. Anderson refers to the condition wherein only a small fraction of possible products is provided to an audience as &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;economic scarcity&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;For some people, a blockbuster movie really is the best movie they can imagine; whereas for other people (who also see that blockbuster movie), the movie is merely good enough. So there is a &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;sheepherding&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; effect of broadcast distribution where audiences are cajoled into seeing a movie, for example, because it's the best &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;available&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;With broadband, every audience member can access different content (as opposed to broadcast which entails sending a single signal to all audience members). Consequently, the old paradigm was a single mass market (a state that is optimized for broadcast economics) and the new paradigm is millions of niche markets. When users are given choice, they exercise it. Furthermore, the best sellers are selling comparatively fewer instance (than they sold before); so these niche markets are taking from the single mass market.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;These niche markets always existed; the difference is that the cost of reaching their natural customers has fallen. Anderson presents an analogy for these falling distribution costs; in particular, he likens them to a receding tide. As the tide falls, an underlying landscape is revealed that had been there all along, just underwater. "Think of the waterline as being the economic threshold... the amount of sales necessary to satisfy the distribution channels."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;These niches are a great uncharted expanse of products that were previously uneconomic to offer. Many of these kinds of products have always been there, just not visible or easy to find.&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Now the niche products are available via &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Netflix&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;iTunes&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, Amazon, ...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Quiz: given a digital jukebox which contains 10,000 albums. What percent of albums sell at least one per quarter? The answer: 98%. "What if non-hits — from healthy niche products to outright misses — all together added up to a market as big as, if not bigger than, the hits themselves?" This 98-percent rule held for Amazon, Apple, &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Netflix&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;. In looking at the distribution of sales across this vast expanse of inventory, still have lots of sales for a relatively few hits. Then it fell off steeply but &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;never to zero&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;. This is a long-tail curve because the tail is very long relative to the head. Anderson reflects: "I realized that, for the first time, I was looking at the true shape of demand in our culture, unfiltered by the economics of scarcity."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;His claims: the tail is longer than we realize (i.e., there's more variety), people can economically access products at the tail (in contrast to &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;pre&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;-broadband times), the aggregation of all those niche markets is itself a significant market. New efficiencies in distribution, manufacturing, and marketing — changing definition of what was commercially viable. The Long Tail "is really about the economics of abundance — what happens when the bottlenecks that stand between supply and demand in our culture start to disappear and everything becomes available to everyone."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 1: The Long Tail&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The tyranny of locality: need to find a sufficiently large local audience for a product in order for it to be economically viable to carry that product. E.g., a movie theatre will not show a film unless it can attract an audience of at least 1500 people over two weeks. The same applies to book or music stores, movie rental joints, and so on. So lots of movies might have a great national audience but can't crack into the various local markets because of this hurdle.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Another limitation of the physical world is that there are limited distribution channels for many goods. A book store shelf can only hold so many books; a radio spectrum can only be divided into a finite number of bands; a coaxial cable can only carry so many TV channels; and so on.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;These conditions have meant that one needs to aggregate large audiences in one geographic area. And this has led to the focus on releasing hits (as a way to ensure that the audience-size hurdle is cleared and a profit can be generated). He refers to this as &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;hit-driven economics&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The long tail is long. Consider Rhapsody (an online music retailer) which has (at print) 4M tracks. Every one of Rhapsody's top 1M tracks is streamed &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;at least once a month&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;. Also, if you add up all the non-hits, you get a market that rivals the hit market. For Amazon, 25% of its book sales (by unit? or by aggregate value or dollar amount?) come from outside of the top 100,000 titles. And this percent is &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;the fastest &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;growing part of their businesses&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;. "The act of vastly increasing choice seemed to unlock demand for that choice." "More than 99% of music albums on the market today are not available in &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Wal&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;-Mart."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Also, these fringe sales are incredibly cost efficient since it costs very little for Amazon to carry another title (much less than it would cost a traditional brick-and-mortar retailer which would need to allocate shelf space for the title and so on). And for purely digital services (where don't even need a warehouse to carry the physical product because there isn't one) such as &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;iTunes&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, the cost efficiency is even greater.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;When you can dramatically lower the costs of connecting supply and demand, it changes not just the numbers, but the entire nature of the market. This is not just a quantitative change, but a qualitative one too. Bringing niches within reach reveals latent demand for non-commercial content. Then, as demand shifts toward the niches, the economics of providing them improve further, and so on, creating a positive feedback loop that will transform entire industries — and the culture — for decades to come.&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 2: The Rise and Fall of the Hit&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;American was a rural society where people were distributed across the land — creating a very fragmented culture. And so developed regional accents and traditions. Then the industrial revolution brought people to the cities. Then media were developed which created a common culture: commercial printing, photography, the phonograph. Pop culture was transmitted using these technologies, which linked people together and synchronized them. All were reading the same newspapers.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Then broadcast mediums were developed: radio and TV. But initially these were just able to generate signals strong enough to reach local and regional (rather than national) audiences. Then AT&amp;amp;T developed long distance networks, over which voice and audio could be transmitted nationally. The first broadcasts were carried nationally by going over long distance phone lines. 1935 - 1950s was the Golden Age of Radio: Edward Murrow, Bing Crosby. Then TV took over as the principle &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;inculcator&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; of shared culture.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;But for the music industry, it peaked in 2000 and by 2005, music sales had dwindled more than 25% from their peak. And the number of hit albums dropped more than 60%. "In other words, although the music industry is hurting, the hit-making side of it is hurting more. Customers have shifted to less mainstream fare..." &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Where did the customers go? One hypothesis is that people continued to acquire new music but did so from free providers such as Napster. So it isn't that demand dropped, it's just that this demand could be satisfied without a commercial transaction or sale. Anderson points out that services such as Napster not only provided music free of cost but they also substantially increased the available &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;variety&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; of music. &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;BigChampagne&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; tracks all files shared on the major P2P networks. "What it's see&lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ing&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; in the data is nothing less than a culture shift from hits to niche artists." He also mentions the existence of &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;mashups&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; which are combinations of tracks: one track from one artist played (or layered) over another. Or similar transformations of original content that results in new content. A micro-hit is a hit within a narrow music niche, of which there might be hundreds of thousands. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The traditional model of marketing, selling, and distributing music has gone out of favor. The major label and retail distribution system that grew to titanic size on the back of radio's hit making machine found itself with a business model dependent on huge, platinum hits — and today there are not nearly enough of those. We're witnessing the end of an era.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;But current media industries are still oriented to the hit-making model; it's still all about finding and creating blockbusters. "Setting out to make a hit is not exactly the same thing as setting out to make a good movie." And "We are turning from a mass market back into a niche nation, defined now not by our geography but by our interests."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 3: A Short History of the Long Tail&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;He makes the point here that the Long Tail phenomenon is not different in kind than previous innovations, only in scale and digital particulars. For example, back in the late 1800s was when Sears Roebuck got his start, offering customers a much wider variety of things and at much better prices than those folks could get in their local "general stores." Sears was able to make this work by creating a mail-order catalog and buying goods in volume. He also listed in his catalog stuff that he sourced from other proprietors (a network of suppliers), who would then ship stuff directly to the customer — which sounds an awful lot like Amazon's Marketplace. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Sears and Roebuck also developed innovative supply chain efficiencies. In particular, they studied and improved the assembly line of preparing goods within the warehouses for shipping to the customer. Finally, they used "viral marketing" by having customers share catalogs with non-customers and giving a referral bonus (discount on goods) to the sharer.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;With the development of the Internet, a lot of the constraints of bricks-and-mortar establishments (amount of shelf space, locations, staff, working hours, weather) fall away — leaving unlimited selection.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 4: The Three Forces of the Long Tail&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The theory of the Long Tail can be boiled down to this: Our culture and economy are increasingly shifting way from a focus on a relatively small number of hits (mainstream products and markets) at the head of the demand curve, and moving toward a huge number of niches in the tail. In an era without the constraints of physical shelf space and other bottlenecks of distribution, narrowly targeted goods and services can be as economically attractive as mainstream fare.&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"The true shape of demand is revealed only when customers are offered infinite choice."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Lots more non-hits than hits.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The cost of reaching people who would be interested in the non-hits is falling.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Need ways for such people to find or locate such goods. These ways (he refers to them as filters) "can drive demand down the Tail."&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Once more niche goods generated and people learn about them, "&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;the demand curve flattens&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;. There are still hits and niches, but the hits are relatively less popular and the niches relatively more so."&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;There are so many niche products that if you add up demand for all of them, its comparable to demand for the hit products.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Only when infinite choice has been made available to consumers in a way that they can grok it can we determine "the natural shape of demand" — "&lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;undistorted&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; by distribution bottlenecks, scarcity of information, and limited &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;choice&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; of shelf space."&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A Long Tail occurs when it becomes cheaper to reach niches (as with Amazon, which can offer random books to customers that would not be economical for local booksellers to offer — since the local booksellers wouldn't get enough sales of the random books to justify keeping them in stock). There are a few specific factors that together encourage &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;TLT&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;1. Democratize the tools of production.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Basically, make it so that just about anyone can generate stuff. The PC did this; now, webcams and software for blogging and for recording/editing music and video are ubiquitous. "The result is that the available universe of content is now growing faster than ever... the number of new albums released grew a phenomenol 36% in 2005, to 60,000 titles... largely due to the ease with which artists can now record and release their own music."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2. Cut the costs of consumption by democratizing distribution.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;For content that consists of bits (e.g., MP3s, videos, ...), everyone who creates can also be a distributor — for example via uploading their video production to YouTube.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Over decades and billions of dollars, Wal-Mart set up the world's most sophisticated supply chain to offer massive variety at low prices to tens of millions of customers around the world. Today &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;anybody&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; can reach a market every bit as big with a listing on eBay.&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;3. Connect supply and demand.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;This consists of the way by which customers become aware of and are able to efficiently search the variety of niche goods. For example, iTunes recommendations, Netflix recommendations, Amazon recommendations, blogs, customer reviews, and so on. All of these things drive demand down the Tail. "Because it's now so easy to tap this grassroots information when you're looking for something new, you're more likely to find what you want faster than ever. That has the economic effect of encouraging you to search farther outside the world you already know..."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Toolmakers, producers&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: how we make stuff&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Populates the Tail.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Aggregators&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: how we distribute stuff (e.g., eBay, Amazon, ...)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Makes everything in the Tail available.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Filters&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: how we find stuff  (e.g., Google, blogs, recommendations, best-seller lists)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Helps people find what they want.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 5: The New Producers&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The open-source movement has been a software phenomenon where lots of people voluntarily pitch in. But this same phenomenon is occurring outside of software with things like spotting stars since astronomical sitings requires a viewer have his telescope focused on a particular part of the sky, it's easily parallelized with different folks training their telescopes on different parts of the sky. No expertise required.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The pushing down of the tools of production from the few elite to the masses has meant that there are now many more creators. "Don't be surprised if some of the most creative and influential work in the new few decades comes from this Pro-Am class of inspired hobbyists, not frmo the traditional sources in the commercial world. The effect of this shift means that the Long Tail will be populated at a pace never before seen." (Pro-Am is a term which describes Pros working alongside of Amateurs.)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;He also talks about the shift from elites generating authoritative content within a controlled framework to the current model where systems are self-governing, as with Wikipedia: "now we're depending more and more on systems where nobody's in charge; the intelligence is simply 'emergent,' which is to say that it appears to arise spontaneously from the number-crunching." The more people who participate, the more the law of large number is at play, which means the better the quality overall. In such probability-based systems, "order arises from what appears to be chaos, seemingly reversing entropy's arrow." Such systems also improve over time.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;With these statistical systems, there is only a statistical level of quality: some things will be great, some will be mediocre, some will be very bad. Thus, the quality range is broader in these systems than it would be in traditional governed systems, in which all output will exceed at least a minimum quality threshold. With traditional systems, the range of material covered is much less broad as is the depth at which each is covered. This is for "bandwidth" issues: only so much space can be used and only a finite number of creators. These constraints are not in play with a Wikipedia-like system.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;This is the world of "peer production," the extraordinary Internet-enabled phenomenon of mass volunteerism and amateurism. We are at the dawn of an age where most producers in any domain are unpaid, and the main difference between them and their professional counterparts is simply the (shrinking) gap in the resources available to them to extend the ambition of their work. When the tools of production are available to everyone, everyone becomes a producer.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Why do people create content for free? Expression, Fun, Experimentation, Reputation. Some artists are using free content as a way to build an audience that will eventually (hopefully) become paying customers for the wares on display (or for future, related wares). See Lulu.com, which is a do-it-yourself publisher... just about anyone can get published now. Even traditional booksellers are using print-on-demand, which entails printing batches of a book title when sufficient demand warrants it (rather than at the outset printing a humongous batch). With print-on-demand, there is a smaller gamble taken. Print-on-demand converts a physical market into a digital one, freeing booksellers from occupying warehouse shelves with a lot of physical goods.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;He also talks about the "increasingly frictionless mobility in the Long Tail," which lets content at the bottom of the Tail move to the top of the Tail quickly and easily. Then he talks about Andy Samberg and his crew and how they broke into SNL. "Think about how many of those potential talents now have a chance to find a real audience, thanks to the democratized distribution of the Internet."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 6: The New Markets&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Consider the used books market. Previously, it was a very difficult market to search the full breadth of. One could go to his local used bookstore which had, more or less, a random collection of used books. One couldn't find a particular used book very easily, though surely somewhere that book was available for resale (or would be if the owner knew there was a buyer). Richard Weatherford developed Alibris to make this market more efficient. Each used-book seller entered his inventory into the database, enabling a person to easily search across the inventory of thousands of used-book stores. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;By bringing millions of customers to the used-bok market, this gave used-book stores even more incentive to computerize their inventories, which, in turn, gave Alibris... even more inventory to sell. It was a classic virtuous circle, and the effect supercharged used-book sales...&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Alibris is a Long Tail 'aggregator' — a company or service that collects a huge variety of goods and makes them available and easy to find, typically in a single place. What it did by connecting the distributed inventories of thousands of used-book stores was to use &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;information&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; to create a liquid market where there was an illiquid market before... it tapped the latent value in the used-book market. And it did it at a tiny fraction of the cost that it would have required to assemble that much inventory from scratch, by outsourcing most of the work of assembling the catalog to the individual booksellers, who type in and submit the product listings themselves.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Other aggregators (or entities that provide access to something that the entity itself does not own): Google, iTunes, Netflix, eBay, ... &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;There are a couple categories of online aggregators: those that sell physical goods online and those that sell digital goods online. The aggregators that sell physical goods can offer incredible variety but at some point they hit a space limitation (for storing the goods). (But what if you outsource storage to individual micro-proprietors like Amazon's Marketplace effectively does? Then you don't run into the physical storage limitations, right?) By contrast, the aggregators that sell digital goods can sell everything all the way down the Tail. Distribution costs in the physical goods case are cost-to-ship and in the purely digital model it's merely broadband megabytes. Pure digital retailers can choose between selling goods as standalone products or as a service. So in the digital case, we have "the holy grail of retail — near-zero marginal costs of manufacturing and distribution."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;As this program [Amazon Marketplace] continues to grow, Amazon gets closer and closer to breaking the tyranny of the shelf entirely. It doesn't have to guess ahead of time where the demand is going to be, and it doesn't have to guess at how big that demand will be. All the risk within the Marketplace program is outsourced to a network of small merchants who make their own decisions, based on economics, on what to carry.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;On Amazon getting closer to economic nirvana: Amazon is using print-on-demand, as described above, which stores books as digial files until they're purchased at which point they're printed on laser printers. "Now Amazon can retain an inventory that takes up no space and has no cost at all: These books and movies remain files in a database somwhere until they're ordered." The biggest cost to publishers is the cost of returns from booksellers. With print-on-demand, this goes away — "potentially reducing returns radically."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"The ultimate cost reduction is eliminating atoms entirely and dealing only in bits. Pure digital aggregators store their inventory on hard drives and deliver it via broadband pipes... Because the goods are digital, they can be cloned and delivered as many times as needed, from zero to billions. A best-seller and a never-seller are just two entries in a database; equal in the eyes of technology and the economics of storage."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 7: The New Tastemakers&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A few stories of how tech is being used in music and how this is changing the music industry. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;First, Bonnie McKee was a new singer. And there were questions about how to market her, what audience (demographic) to target. The studio thought she was a natural fit for adult contemporary, women ages 25 - 35. To validate this hypothesis, they did a limited release of her songs using LAUNCHcast, which is an online radio station. A LAUNCHcast user has a playlist created specifically for him (or her) based on his/her ratings of previously listened to songs — i.e., an adaptive recommendation system. The label paid for placement and promotion (on LAUNCHcast) — essentially buying an initial audience but also buying that audience's feedback on McKee's songs.  Also, LAUNCHcast is part of Yahoo!, which has lots of demographic info about its users, which could be provided back to the label along with the ratings. Through this experiment, the studios learned that in fact the audience which responded best to McKee's songs were girls ages 13 - 17.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The second story is about a band called My Chemical Romance whose label established a presence for the band on two music-heavy social networking sites. Released a couple singles to limited audiences then used file-trading data (which tracks were the most searched? downloaded?) to figure out which singles to release in what order (release the hottest one now). The band also leveraged its online audience to real-world effects, namely by encouraging audience members to contact radio stations and ask them to play the band's songs. The band's fans were given access to exclusive tracks, access that they repaid via heavy word-of-mouth on behalf of the band.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The third story is about a band that was able to displace the role of the music label entirely by using resources on-line (and because of technological advances which drove down the cost of recording studio time). Birdmonster used the Internet to identify possible gigs and to build a base of support (via MySpace). This base was leveraged by the band in its attempts to secure gigs — to demonstrate that the band would be able to draw a crowd. Birdmonster recorded three tracks at a local independent studio then self published this mini-album via CDBaby. CDBaby takes albums on consignment and sells them online. CDBaby transferred the tracks to iTunes to sell. The band drummed up free marketing by sending tracks to MP3 blogs. As a consequence of this attention, buzz, and sales, Birdmonster started getting offers from established recording labels — offers which Birdmonster turned down. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The traditional role of a music label is to scout talent and provide financing, distribution, and marketing. Because of advances in digital recording technology, the price of studio time was lower than ever — about $15k for an entire album. So financing wasn't a problem. And the band was able to get distribution via CDBaby and Cinderblock which released the tracks via iTunes, Rhapsody, etc. Finally, the band got free high-credibility marketing from various music blogs. Technology has shifted the balance of power from the label to the band.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Yahoo! music ratings, Google PageRank, MySpace friends, Netflix user reviews — these are all manifestations of the wisdom of the crowd. Millions of regular people are the new tastemakers. Some of them act as individuals, others are parts of groups organized around shared interests, and still others are simply herds of consumers automatically tracked by software watching their every behavior.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;As the culture fragments from a single mass market to millions of niche markets, we see the rise of microcelebrities — that is, celebrities for each such niche; people whose opinions are respected when it comes to fashion, music, and so on. The slice of the world over which such people have authority can be as narrow as a niche is. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The resources that help a person locate stuff that person might like are &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;filters&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, which "sift through a vast array of choices to present you with the ones that are most right for you. That's what Google does when it ranks results..." This is not dissimilar from the role that the Yellow Pages played in years of old. Filters have the effect of driving demand down the tail as with Netflix's movie recommendation system which results in most Netflix rentals being "back catalog" (rather than new releases). As Reed Hastings says by way of explanation: "it's not because we have a different subscriber. It's because we create demand for content and we help you find great movies that you'll really like."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;As an example of the types of filters that people use in perusing an online music store. You can choose a category (niche) and will be presented with a best-seller list for that category. If you click on an artist or song within that category, you might be presented with related artists and music. You can also see an artist's followers who have perhaps written reviews and created playlists. Finally, you can try a custom radio station tailored around a particular artist or micro-genre. Tehse are all ways of weeding through the vast database of music in the Tail.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;There are some limitations to current music filtering. In particular, the same sample format is presented for all genres of music (the 30-second portion of a track) even though this sample may not be equally helpful in evaluating music from all genres. Also, even  just the listing format for a song: artist, album. This is specialized for the pop-music domain and may be less appropriate for classical music which has a composer and separately a performer. Ideally, the way things are presented for each niche is specialized to that niche. Bestseller lists &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;across &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;genres are not helpful in the way that rankings within a genre are.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Since the Long Tail contains so much stuff (the vast majority of stuff), the filters to navigate it must be better than those needed to navigate the head, which just contains a comparatively few items. Noise is a big problem in the Tail. Because hit products are tailored to have the greatest audience, they are lowest common denominator. What this means is that the products in the head won't necessarily be the best products for you. Because the products in the head have specifically been designed to be the least offensive, the most vanilla. Hence, the best products for you (the ones that most closely match your specific tastes) are likely to be in the Tail somewhere. And there is a wider range of quality in the Tail generally than there is in the head.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"As the Tail gets longer, the signal-to-noise ratio gets worse. Thus, the only way a consumer can maintain a consistently good enough signal to find what he or she wants is if the filters &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;get increasingly powerful&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;There are pre-filters, which determine what gets made and how (i.e., shape the &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;development&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; of a product), and post-filters, which determine how well-liked the made things are. A pre-filter attempts to predict what will best appeal to audiences whereas a post-filter merely amplifies how audiences feel about a particular thing; "in Long Tail markets, the role of filter shiftsw from gatekeeper to advisor. Rather than predicting taste, post-filters such as Google measure it."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 8: Long Tail Economics&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;80-20 rule: demonstrated variously; first witnessed in wealth distribution (20% of the people had 80% of the wealth). Zipf noted that the frequency with which a word appeared was proportional to one divided by that word's rank (2nd item occurred half as much as the first; 3rd item occurred one third as much as the first; and so on). These are both examples of power law distributions. The conditions that lead to power laws in consumer markets are: (1) variety of products, (2) inequal quality of products, and (3) network effects that amplify the differences in quality. These result in a "predictable imbalance" of markets and culture... Success breeds success.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;If you plot a power-law distribution on a log-log scale (both the x and y axes are logarithmic) then you get a straight line with negative slope (the steepness of which depends on the particular distribution). When we look at box office receipts, however, we note that instead of seeing a straight line across, we see a straight line that steeply drops off. So the line is in effect truncated. What happened? Do box office receipts NOT follow a power-law distribution? &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;They do. What we're seeing is the effects of the constrained carrying capacity of the US theatrical industry. That is, the movie screens across the country can only carry so many movies; in particular, around 100. There might be some variation in which movies are carried by which theatres (e.g. contrast a megaplex in a Midwestern city to an art house theatre in the East Village) so we see movies ranked 100 - 500 getting box office receipts that obey the power laws. But movies ranked 500 to 13,000 have no theatrical distribution. Hence the steep drop off in box office receipts. "The lesson is that what we thought was a naturally sharp drop-off in demand for movies after a certain point [rank] was actuallly just an artifact of the traditional costs of offering them." What we're starting to see is non-theatrical distribution channels (e.g., the Internet and direct-to-DVD) are becoming major markets.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The 80-20 rule is an example of a Zipf distribution and has classically been applied to products and revenues (20% of products account for 80% of revenues). Since carrying costs for hits and misses were the same (and substantial), this meant that a substantially greater share of profits came from hits (whereas the sales of misses merely covered their costs but yielded no margin). With lower carrying costs of inventory, the 80% of products become more profitable and so proprietors would do well to offer them. A Long Tail retailer, by contrast, carries much more inventory and at cheaper costs. The 20% of traditional retailers (e.g., 1000 albums) represents just 2% of LT retailers (since LT retailers carry much more variety — many more different products). This 2% accounts for 50% of sales, the next 8% accounts for 25% of sales, the bottom 90% accounts for 25%.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Consider new-release DVDs which big-box retailers (e.g., Best Buy) sell at a loss when they first come out. Why? Because they are a &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;loss leader&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, a product sold at or below cost to stimulate other profitable sales (i.e., they bring people into the store where those people buy more/other stuff as well). Also DVD manufacturers allow unsold new releases to be returned, which lowers the risk to retailers. An effect of this market is that Best Buy and company set the prices for these new releases, even for other businesses which have different models — e.g., Blockbuster which doesn't sell many other products (and hence for which the loss leader advantage is lost).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Blockbuster and Co. want to create a market that isn't so depeendent on new releases then BECAUSE new releases are not profitable for them. The way to do this is to drive demand down the curve. Long Tail products are cheaper to acquire (DVD manufacturers charge more for new releases and less for older titles) and hence can be very profitable — as long as inventory costs are kept close to zero. So, LT retailers: (1) offer many more products, (2) sales are spread more evenly between hits and niches, and (3) there are profits at all levels of popularity.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Does a LT mean that the hits at the head sell less? More? The same?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;What shifts demand down the Tail? (1) Variety, (2) Lower search costs — easier to navigate this increased variety in order to find what you want, and (3) sampling — able to "test drive" a purchase (read a chapter of the book, listen to 30 seconds of the song) — which reduces the purchase risk.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Quantifying the effect of lowered search costs for the same inventory: compare online to catalog sales. Both have same inventory; easier to navigate the online inventory. The effect was that customers tended to buy further down the Tail online. In the catalog, 20% of the products accounted for 84% of sales. Online, 20% accounted for 71% of sales. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Measuring the effect of having more selection available: compare a retailer with unlimited shelf space with one which has limited shelf space. Used industry-wide data fror bricks-and-mortar entertainment purveyors. Compared to Rhapsody and Netflix. The results were that the online demand curve is much flatter: the average niche music album titles sold twice as many copies online as offline; the average niche DVD sold three times as many copies online. The top 1000 albums accounted for 80% of the offline market and less than 1/3 of the online market.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Does TLT grow the pie ior just slice it differently?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Some forms of entertainment are &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;non-rivalrous&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, i.e., you can do something else while you consume them. You're more likely to consume more if it doesn't cost you more to do so. This means that subscription services may be more likely to drive demand down the tail as consumers can explore niche markets without paying more. It may be that users will be more satisfied with their niche purchases than they were with hit products (because the niche product more closely matches the consumer's preferences than one-size-fits-all blockbusters) and furthermore that this increased satisfaction will yield more sales (i.e., grow the pie).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The effects of TLT on pricing? See reading.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Microstructure in TLT&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Power laws are fractal — no matter how far you zoomin, they still look like power laws; also described as "self-similarity at multiple scales." The music market is made up of thousands of niche micromarkets or miniature ecosystems, each of which has its own head and tail. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;How come the powerful feedback loops that yield 80-20 distributions do NOT have the same effect in TLT — i.e., do not make hits ever more popular and niches ever less so?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Because we've noted that what we see in TLT is a flattened power-law (rather than exaggerated), that is, there is less difference between hits and niches. The answer is that the recommendation networks have more muted effects between or across genres than they have within a genre. "Popularity exists at multiple scales and ruling a clique doesn't necessarily make you the homecoming queen."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;TLT of time: new things sell better than old things.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Since TLT is about abundance and economics is based on the premise of scarcity, does that mean that everything we know about econ no longer applies? That is, two of the main scarcity functions of traditional economics are the marginal costs of manufacturing and distribution; these functions are trending to zero in LT markets of digital goods. Anderson claims that since the overall system is still constrained by scarcity, the traditional laws of economics are still in play. Gilder: "In every industrial revolution, some key factor is drastically reduced in cost. Relative to te previosu cost to achieve that function... physical force in the industrial revolution."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;That suggests a way to put this in an economic context. If the abundant resources are just one factor in a  system otherwise constrained by scarcity, they may not challenge the economic orthodoxy.&lt;/span&gt;&lt;/blockquote&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 9: The Short Head&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Online shopping still accounts for less than 10% of American retail. There are tactile and instant-gratification advantages of bricks-and-mortar establishments. Also, there will always be blockbusters; "For each way that we differ from one another, there are more ways that we are alike." Hits still have unmatched impact and are a source of common culture. LT aggregators need to provide the full range of variety, "from the broadest appeal to the narrowest, to be able to make the connections that can illuminate a path down the Long Tail that makes sense for everyone" (i.e., familiar head products give customers a toe-hold into the market which enables then exploring products on down the tail). And because "Customers love one-stop shopping."  iTunes succeeded in part because it provided a critical mass of mainstream music.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;How come MySpace — which focuses mostly on independent music — still works, despite its non-provision of mainstream musicians? Because of its combination of social networking with music, which has the effect of keeping both fresh (don't have burnout of pure social networking where folks are connecting just for connection's sake).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Population clusters also exhibit power laws.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;138 million Americans shop at Wal-Mart every week.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The Short Head: Wal-Mart carries only 4500 unique CD titles (Amazon carries 800k). Wal-Mart accounts for 20% of all music sales in America (presumably this includes both their online and physical sites). Wal-Mart has something in about every category of product but not much (broad and thin as opposed to deep and narrow); they provide "a veneer of variety."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Challenge of physical goods: they force us into crude categorization. A can of tuna cannot simultaneously be located in all different categories that it might be in; e.g., health food, canned goods, fish, protein, low-fat, casserole components, and so on. Have to guess at what category most people would use for tuna fish (and for every other product). "With the evolution of onlione retail, however, has come the revelation that being able to recategorize and rearrange products on the fly unlocks their real value." "The efficiency and success of online retail hyave illuminated teh hcost of traditional retail's inflexibility and taxonomical oversimplifications." The tricky question of where to put things: &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;the ontology problem&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;On the other hand, think about a world of ad-hoc organization, determined by whatever makes sense at the time. That's more like a big pile of stuff on a desk instead of rows of items stringently arranged on shelves. Sure it may seem messy, but that's just because it's a different kind of organization: spontaneous, contextual order, easily reorderedinto a different context as need be... a world of infinite variety and little predetermined order; a world of dynamic structure, shaped differently for each observer.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The economics of broadcast are such that one can reach a million people as easily as one (for the same cost); and revenues (e.g. from advertising) are variable. There are constraints: only 24 hours in a day, only so many channels per cable. So the way to make money is to get a big enough audience to make the most from that slot. "The general principle of the last hundred years of entertainment economics was that content and distribution were scarce and consumer attention was abundant... It was a sellers' market and they could afford to waste attention." This led to ad clutter; in the mid-1980s, ad time per hour went from 6 minutes 48 seconds to 12 minutes 4 seconds. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;More recently, people have started to watch less television. Or rather, people brought up on the Internet watch less television than their predecessors did at their age. "The audience is migrating away from broadcast to the Internet, where niche economics rule."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 10: The Paradise of Choice&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Huge explosion in variety available. Why? Globalization and hyperefficient supply chains. The variety of goods &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;imported&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; increased by a factor of 3 from 1972 to 2001. Another answer: demographics.  We are more diverse and people want to be special rather than wanting to achieve some singular common ideal (e.g., being like the Joneses). &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;But growing chorus that too much choice is no good; it's oppressive because we can't navigate it and become stressed by the fear of making the wrong choice (something that increases in likelihood as more options are made available). The solution is to help users navigate the array of choices so that they can be confident in their particular selection. The navigational support can come in the form of different orderings of stuff: by price, ratings, date, genre. Can determine what "people like you" have preferred (bought). The limitation of the supermarket shelf is the absence of this extra ordering information, which is simply physically more difficult to provide to the customer in this environment vs. in the online environment. This is the resolution of the paradox of choice, which held that consumers loved choice but that having more of it didn't actually seem to make them happier: we not only need choice, we also need information about the various options, so as to increase the likelihood that we'll be happy with our ultimate selection.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The more choice we have, the more we have to decide what we really want. The more we reflect on what we really want, the more involved we get in the creation of the goods we buy and use [via customization]. The more we participate in the creation of products and services, the more choices we end up creating for ourselves.&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Does more choice make people buy more, though? Results are inconclusive.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 11: Niche Culture&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;House music (the Rave scene) was a reaction against the bankruptcy of blockbuster culture. The spread of affordable technology — mixing decks and multi-track recorders — let DJs produce house music. Clubs and warehouses served as democratized distribution channels. The market fragmented into hyperspecialized genres: deep house, funky house, dub house. Needed a mechanism to navigate this new landscape (i.e., serve as a filter) — the label was used to fill this need. House music producers opened up their goods to be remixed and tweaked: "A house reord that does well often attracts remixes from other producers; it becomes a kind of platform... As the number of complements increases, the value of the platform track snowballs."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Seeing a shift from mass culture to massively parallel culture, where lots of little tribes or microcultures and each of us belongs to many different ones. Almost all of us, though we may be pretty mainstream, "goes super-niche in some part of our lives." That is, Postrel: "Most of us cluster somewhere in the middle of most statistical distributions. But there are lots of bell curves, and pretty much everyone is on a tail of at least one of them." Anderson: "This has always been true, but it's &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;only now &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;something we can act on. The resulting rise of niche culture will reshape the social landscape. People are re-forming into thousands of cultural tribes of interest, connected less by geographic proximity and workplace chatter than by shared interests."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;We've seen this in the news industry; "In effect, blogs pick off the mainstream media's customers one by one by being niche where their old-media precursors are mass." A concern about whether this will fracture our relationships to one another — since we are no longer consuming the same mass culture. Anderson claims that "What we've lost in common culture, we've made up in our increased exposure to other people [who populate the niches we explore]... Rather than being loosely connected with people thanks to superficial mass-cultural overlaps, we have the ability to be more strongly tied to just as many if not more people with a shared affinity for niche culture."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 12: The Infinite Screen&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Chapter 13: Beyond Entertainment&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;eBay&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: the Long Tail of merchants and of products. Has sales volume equivalent to Wal-Mart's. Distributed inventory: it's just a web site where buyers and sellers meet and agree upon a price. Inventory costs: $0. Self-service model: merchants create own product listings, handle own packaging and mailing. So eBay has very few employees relative to its revenues; it has around $5M in revenues per employee (Wal-Mart has around $170,000 in revenues per employee). Also, eBay provides filters (search, multi-level category stucture) to help buyers navigate.&lt;br /&gt;&lt;br /&gt;eBay is the largest used-car dealer and largest seller of automotive parts. It extends from the head to the tail. But eBay is not perfect. It doesn't have a standardized product-description framework and so it doesn't have knowledge of what's being sold on its site — knowledge that could be navigated by a computer program. For this reason, eBay isn't able to build product recommendation systems and so on, which would presumably drive demand even further.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;KitchenAid&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: mixers come in various colors. In making all of them available to consumers, a Long Tail emerged.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;LEGO&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: has a mail-order business that caters to enthusiasts. At least 90% of its products are not available in traditional retail outlets, which accounts for about 10 - 15% of LEGO's sales. These sales have higher margins, though (no retailer to share profits with).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Salesforce.com&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: rather than ship software that was installed in the usual way and used to manage sales contacts, Salesforce offers software as a service. Customers navigate their browsers to the site and effectively run the software on Salesforce's servers. Meant that businesses could save on tech expenses (relating to administering and maintaining software installations). Benioff responded to the threat of Oracle and Co me-too'ing him to death by opening up his platform to other independent developers to develop their own software as a service and make it available to customers.&lt;br /&gt;&lt;br /&gt;The head of the software business is Microsoft. The costs of writing software plummeted, the cost of delivering software decreased as move from CD-ROM to download model. Now can also navigate the world of software products more easily too.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Google&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: the traditional advertising market — classic, hit-centric industry. The ad-business historically entailed a lot of expensive schmoozing because: "a lack of trusted performance metrics makes salesmanship and personal relationships key to winning business" (I quote this because it precisely describes the type of field I wanted completely to avoid in my own career.) Ad sales people focus on the largest and most lucrative of potential advertisers: "In other words, the system is biased toward the head of the advertising curve."&lt;br /&gt;&lt;br /&gt;"As with every other makret we've looked at, that head is just a tiny fraction of the potential market. But because it's so expensive to sell advertising the traditional way, the smaller potential advertisers have been left to their own devices, mostly picking up a phone and placing a classified ad or sending some homemade display copy to the local newspaper. That's pretty much how advertising has worked for most of the past century."&lt;br /&gt;&lt;br /&gt;"What Google realized is that if it could take most of the cost out of both selling and buying advertising, it could dramatically increase the pool of potential ad buyers and sellers. Software could do almost all of the work, therby lowering the economic barrier to entry and reaching a much larger market."&lt;br /&gt;&lt;br /&gt;Google's ad model: (1) is based on keywords, which is a Long Tail; (2) dramatically lowered the cost of reaching the market — use a simple and cheap self-service model; (3) provided the same benefits to publishers — allowing them to be a platform on which ads could be served the same way that traditional big newspapers were in the past. The pages on which ads are served (i.e., the publishers' sites) are cost-free inventory for Google. So the opportunity costs are born by the publisher, not Google.&lt;br /&gt;&lt;br /&gt;Google expanded its search options from keyword and text to other vertical categories: Maps, Scholar, Products, News, Books, Video, and so on. These are like different niches. Search results are customized in a way that makes sense for the category; e.g., video search results would include a clip, for books — a snippet, for images — a thumbnail, and so on.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); &lt;/script&gt; &lt;script type="text/javascript"&gt; try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-5751922120470477948?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/5751922120470477948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/08/notes-on-long-tail-by-chris-anderson.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/5751922120470477948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/5751922120470477948'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/08/notes-on-long-tail-by-chris-anderson.html' title='Notes on The Long Tail by Chris Anderson'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-4996551868488328235</id><published>2009-08-10T14:22:00.000-07:00</published><updated>2009-09-21T10:30:41.779-07:00</updated><title type='text'>Quotes from: Closing the Innovation Gap (Estrin)</title><content type='html'>&lt;a href="http://www.theinnovationgap.com/"&gt;Closing the Innovation Gap&lt;/a&gt;, by Judy Estrin&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Introduction: Innovation Is Not Optional&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 1: The Capacity for Change&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Curtis Carlson, CEO of SRI: "When you start a project, you don't know enough about the competition or the customer needs. You haven't developed the best ideas or the best technology. So it's the nature of the game that in the beginning, most of what you're going to do is going to be a failure."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Best Buy launched an internal initiative to listen much more closely to the employees who were talking to customers every day."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"The willingness to give it a shot and allow people a second, third, or fourth act in their careers has differentiated not only Silicon Valley's but also America's culture from that of other countries. Nokia researcher Henry Tirri says, 'If I pose a queestion to a class of 100 students at a university in Finland, I'll get only one hand up, but I'll be totally convinced that the answer will be correct. If I do the same in the United States, I get 99 hands raised, out of which 90 are probably wrong. But they're willing to try.'"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Openly sharing information also creates pathways for valuable feedback. Some of the most costly failures in Silicon Valley were the result of projects that had been kept under wraps for too long."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Increasingly, leaders are recognizing the value of what IDEO, a leading product design company, calls T-shaped people &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;/span&gt; those who have a depth of knowledge in a particular area, but also the breadth to communicate well with people in other disciplines."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 2: The Innovation Ecosystem&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 3: Inspirational Innovation&lt;/b&gt;&lt;/div&gt;&lt;div&gt;"Paul Baran was a young researcher at Rand when the U.S. Defense Department realized that its strategic command-and-control systems were vulnerable because they were over-centralized. By studying the ways in which the neural networks in the human brain recover from a catastrophic injury like a stroke, Baran and his team conceptualized models for a new kind of telecommunications network that would resemble a fishnet, with redundant links that enabled the network to automatically route communications around damaged areas. They discovered that when you have three times as many links as you need, there would always be a viable path through the network."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bell Labs: between 1960 and 1983&lt;/div&gt;&lt;div&gt; * transistor, cell phone, laser, light-emitting diode, Unix, digital camera chips&lt;/div&gt;&lt;div&gt; * 6 Nobel prizes&lt;/div&gt;&lt;div&gt; * parent company was a government-sponsored monopoly&lt;/div&gt;&lt;div&gt; * financing came from a tax on phone service&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 4: Narrowing Horizons&lt;/b&gt;&lt;/div&gt;&lt;div&gt;"The Vietnam War diverted money from basic research and resulted in increasing resistance to the military among university scientists."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"The founding of Nasdaq opened up another avenue of financial return, which in turn spurred more entrepreneurial activity. Unlike the NYSE's, Nasdaq's "trading floor" existed only in cyberspace. Nasdaq had lower listing requirements and fees, creating a vehicle that enabled smaller, more volatile companies to access public markets and fund their future growth."&lt;br /&gt;&lt;br /&gt;"Legislation allowing pension funds to invest in venture capital firms [in the early 1970s] significantly increased the dollars available for startups."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the 1980s (Reagan administration): "People who had been looking forward five to ten years were now looking only two to three years out, because they had to show commercial justification for their work. 'I saw this huge retraction in the research horizon,' recalls Van Jacobson... 'In Washington, you had to demonstrate two things: you had to use commercial gear whenever possible, and whatever you were doing had to be commercially relevant.'"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"In 1980, Congress passed the Bayh-Dole Act, giving universities ownership of intellectual property resulting from federally funded research... Bayh-Dole created a conflict between scientific motivations and financial ones &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;/span&gt; between the information sharing that is the coin of the realm in academia AND figuring out how to capitalize on intellectual property." (I reworded this.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"This shift [toward more scientists becoming entrepreneurial] was heralded by some as progress: academic researchers were being brought down from their ivory towers to face real-world problems. But the effect was to narrow the scope of research to work that could be ported to the marketplace as quickly as possible."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Danny Hillis, co-founder of Applied Minds: "The very process of a company becoming good at its business is often a process of driving out the unknowns and the uncertainties. Lots of people have gotten much better at getting the slop out of the system. Unfortunately, that slop was where a lot of the innovation was happening. It provided the openness to look for new opportunities."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Start-ups became the research engines of the pharmaceutical industry." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"The discovery of DNA in the 1950s occurred at about the same time as the discovery of the semiconductor. But there was no way that scientists could deal with the vast number of variables and complexity of genetics without the aid of computers... 'It was almost like there was a holdup in biology until the semiconductor led to the type of computing power thta allowed you to be able to look at a system that had 20,000 independent variables, or genes,' says Genomic Health CEO Randy Scott. 'But once the technology for experimentation started to come into play and the computer technology was there to be able to analyze it, that's when the game really started.'"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Around 1989: "The technology industry was so strong that no one noticed that we had stopped planting the seeds of future growth. The rest of the world was not standing still. The number of articles in science and engineering published by U.S. authors stayed flat through the 1990s, while people in other nations were growing more prolific."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"The pharmaceutical industry focused on making drugs for which millions of prescriptions are written every year. 'We drove the world to a blockbuster model,' says Genomic Health CEO Randy Scott. 'It has become so expensive to develop a drug that the only drugs you can justify developing have to be worth half a billion to a billion dollars or more.' To sell those drugs, Big Pharma pushed for the ability to market its products directly to consumers... [in 1997 the FDA changed its policy to allow this] Dollars spent on pharmaceutical advertising &lt;i&gt;have increased 28 percent a year since then&lt;/i&gt;." (emphasis mine &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;/span&gt; wow that's huge)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"By then, the role of start-ups in driving innovation was becoming so clear that many larger companies were beginning to depend on them for their own growth. Partnerships and acquisitions became a key strategy for 'outsourcing' innovation..."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Heidi Roizen on the late 90s: "In that crazy period, you saw the emergence of the entrepreneurial equivalent of the day trader. They saw an opportunity to get rich by building something that somebody wanted to buy and flipping it."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 5: Losing Our Balance&lt;/b&gt;&lt;/div&gt;&lt;div&gt;"Less than a year after the first hint of corporate scandal, in July 2002, Congress passed the Sarbanes-Oxley Act (SOX). The 66-page legislation, passed with very few 'no' votes, established new standards for U.S. public companies, boards of directors, management, and public accounting firms... it added millions of dollars a year in expenses for compliance and legal fees that could have gone toward R&amp;amp;D and innovation."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"The administrative and financial burden of SOX compliance was especially tough on small to medium-sized businesses."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Shareholderes became more active and vocal, demanding to know, 'Where were the board members at Enron or WorldCom?' With each new investigation, pressure was put on directors to show their muscle, eroding the critical trust relationship between shareholders and boards, and between boards and management."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"There were also new regulations in investment banking that attempted to address real and potential conflicts of interest that arose during the bubble. A side effect of these new laws was that a lot of talent moved from investment banking into firms that were not subject to regulation, such as venture capital and hedge funds."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"The excesses of the dot-com era exposed weaknesses in judgment, controls, and regulation. But the overreaction of the country's leadership had the unintended consequence of creating an atmosphere in which boards and executives were less willing to take meaningful risks on products and business strategies. The real punishment was to long-term shareholder returns through a loss of focus on innovation."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 6: Green-Thumb Leadership&lt;/b&gt;&lt;/div&gt;&lt;div&gt;"To create room for risk taking, you have to actively protect those who have been involved in a project that doesn't succeed beyond saying that they didn't get fired &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;/span&gt; this time. Too often, other employees want to punish innovators who fail, becqause they were competing for the same resources."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"if you talk about user-contributed content, few people think about Disney. But it was the first to come up with the concept in 1989, recognizing the trend of people using portable video cameras to record family events that were not only valuable keepsakes for posterity, but often hilarious. The result was America's Funniest Home Videos, which debuted nearly two decades ago. 'Why is it that five years ago we didn't see that you could collect videos on the Web and create a site that mirrored the show, with a bit of a twist?' ... It took a start-up like YouTube to think orthogonally and apply the home-video concept to the Web."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Being open to new ideas also means being willing to cannibalize your own product or business model before someone else does. The music industry could have benefitted greatly by opening its eyes and changing its distribution model before Napster did it for it. The newspaper industry is currently ripe for such a quantum shift..."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Requiring that a proposed project or service have demonstrated demand can also kill off a company's future growth, he [FedEx CEO Fred Smith] adds. 'It's like saying there's not much demand for people crossing the Hudson River at 96th Street. You have to build the bridge before there's a market.'"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"One force that insidiously undermines the health of baby tigers is the tendency of small business units in large companies to feel that they are undervalued and of marginal importance. Any large and profitable venture tends to become obsessed with the business that led to its first success, which steals energy from the risk-taking, exploratory ventures that could turn into the next one."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"'The genomics of the future is going to be able the science becoming more personalized for smaller markets,' says former FDA commissioner David Kessler... This will require adapting test methodology and developing new ways to identify the efficacy of a drug earlier in the testing process, such as measurement techniques that rely on molecular genetics to track the progress of specific diseases."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"'Most of us have gotten trapped by our own business models,' says Autodesk's Carol Bartz. 'We're expected to make a lot of money so we can take our 90 percent gross margins. But it's a shame we couldn't take 10 of those points and do more research, because we've allowed ourselves to be bound by expectations and become victims of our own success.'"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"In the mid-1980s, Intel made a bold move that ended up saving the company &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;/span&gt; exiting from the declining memory business and focusing on microprocessors. But that move was possible only because a small team at Intel was already developing microprocessors."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"The corporate research organizations of today can no longer afford to run like the ivory-tower labs of the past, centralized and isolated from the mainstream business. Instead, they shold be porous, providing tight connectivity with the rest of the company."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Some leaders today have an aversion to the concept of separate groups committed to basic research, seeing them as an antiquated organizational structure. 'The research stuff on the hill is death,' says Eric Schmidt of Google. 'It may be a good model for someone else &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;/span&gt; though I doubt it &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;/span&gt; but it's clearly a bad model for us.' ... Google Research is tightly integrated with the core business, which keeps it tethered to real-world needs."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"At Applied Minds, the first test of a new idea is a gut-level one: is the proposed project something that people would feel good about working on? The second test is economic, a classic risk-reward analysis. The third test is whether or not the employees believe they would do a better job of executing the project than anyone else."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Best Buy has adopted the strategy of creating small, temporary networks to tackle specific projects, drawing people from diverse areas of the company."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"People who naturally play the role of knowledge connectors are critical when building relatinoships across communities, disciplines, or divisions, facilitating communication between disparate groups. The best connectors can quickly synthesize information across a broad range of topics, communicate well, and bring the right people together..."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Opportunities for acquisitions or partnerships that could bring benefit to multiple businesses within a company often fall through the cracks because no one is willing to champion or pay for something that will be shared across the company. Levy [managing director of Silicon Valley Connect] calls this the 'integrator's dilemma.'"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"'If you overimpose metrics, you sacrifice creativity and open thinking,' says Joost CEO Mike Volpi... Metrics-driven bonuses are easy to implement and understand, and are effective when focusing on yearly financials and incremental improvements. But they need to be complemented with programs that reward behaviors that are not measured in a spreadsheet, recognizing and rewarding value creation in addition to today's revenue and profit."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;About offshoring: "For products that are well defined, the assignment of labor to far-flung groups can be relatively straightforward. Forcing this discipline too early can limit the kind of broad-based exploration that thrives in face-to-face interactions and in fruitful collaborations among engineering, marketing, and management. For companies with advanced technology groups, it's best to create networks of complete teams, as opposed to just offshoring a piece of the development."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Because of SOX regulation, companies now have to be larger to go public, so more companies are opting for getting acquired instead."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"To make a difference, some of these [green] technologies will require infrastructural changes that only very large companies or the government can provide."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Private equity buyouts of public companies release those companies from the pressure of meeting the Street's quarterly expectations. But the companies end up under mountains of debt, and suddenly every staff meeting is focused on how to pay the interest on the loan..."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 7: Reviving the National Ecosystem&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Chapter 8: Next-Generation Innovators&lt;/b&gt;&lt;/div&gt;&lt;div&gt;"But one-third of our eighth graders never receive a high school diploma, and of those who do, 40 percent do not pursue a college education. And half of those who do enroll in college never earn a bachelor's degree." (Shocking if true)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Some elementary school teachers may have taken only one introductory course in math or science while earning their teaching credentials. 'Many teachers are very fearfl of science and math,' says Sally Ride, 'so they actually teach in a way that discourages kids from asking questions.' But learning how to ask questions and test hypotheses makes these subjects interesting and is crucial in learning how to think like a scientist."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Teaching math and science skills presents a special challenge because students need to understand each level before moving on to the next. In an increasingly mobile society without consistent educational standards, it's too easy for students to miss a step along the way... Agreeing on a shared set of federal milestones would not be interfereing with states' power to select a curriculum &lt;span class="Apple-style-span" style="font-family: arial; "&gt;—&lt;span class="Apple-style-span" style="font-family: Georgia; "&gt; it would just be ensuring that kids throughout the country are getting the same basic level of education."&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Now the country [Singapore] is implementing what's called the &lt;i&gt;full inquiry method&lt;/i&gt;, with teachers emphasizing questioning among small groups of students. 'I've watched groups of seventh graders doing Newtonian mechanics, all trying to get a gut level understanding of what Newton's laws actually mean. Then they have to explain their understanding to other kids in the class. It's just awesome,' he [scientist John Seely Brown] says."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Most of the chemicals that were once staples of home chemistry sets are now illegal to sell to children. Even in science classrooms, fears about safety and liability are limiting hands-on experimentation."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"we can now build virtual words that would have cost millions a few years ago. 'I got wrapped up into a protein in a 3-D game a few months ago,' says John Seely Brown. 'Now I know why protein folding is so complicated. Before that, I had no visceral sense of what a protein was.' Computation and visualization can bring dry science lessons alive, and even restore a sense of awe about the ways the universe works."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jamshed Bharucha, Chronicle of Higher Education: "We learn more effectively when we generate the material to be learned than when we passively receive it."&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); &lt;/script&gt; &lt;script type="text/javascript"&gt; try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-4996551868488328235?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/4996551868488328235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/08/quotes-from-closing-innovation-gap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/4996551868488328235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/4996551868488328235'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/08/quotes-from-closing-innovation-gap.html' title='Quotes from: Closing the Innovation Gap (Estrin)'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-8662637423922871795</id><published>2009-08-04T14:19:00.000-07:00</published><updated>2009-10-10T09:58:19.019-07:00</updated><title type='text'>Thoughts from: Talent is Overrated by Geoff Colvin</title><content type='html'>&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Below are some quotes from &lt;a href="http://www.amazon.com/Talent-Overrated-Separates-World-Class-Performers/dp/1591842247" target="_blank"&gt;this book&lt;/a&gt; that summarize the major findings/arguments. In all cases, emphasis (italics) are mine.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;What genetic brain-science research is telling us&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"the research is revealing many ways in which DNA and the environment &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;interact&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; from the moment of conception all the way through life, and suggesting increasingly that the concept of strict nature-versus-nurture conflict is unhelpful in understanding how people actually develop." (pg 81)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Why care about "deliberate practice"?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"the differences between expert performers and normal adults reflect a life-long period of deliberate effort to improve performance in a specific domain" (pg 63)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Deliberate practice "can extend one's ability to perform at high levels &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;far longer &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;than most people believe." (pg 79)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;What is deliberate practice?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;"Deliberate practice is characterized by several elements..." (pg 66)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;It is activity designed (often with a teacher's help) specifically to improve performance.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;It can be repeated a lot.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Feedback on results is continuously available.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;It is highly demanding mentally.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;It isn't much fun.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"deliberate practice requires that one &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;identify certain sharply defined elements of performance that need to be improved&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;, and then work intently on them... The great performers isolate remarkably specific aspects of what they do and focus on &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;just those things&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; until they are improved; then it's on to the next aspect." (pg 68) &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;How much do I have to do it?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"A finding that is remarkably consistent across disciplines [violin, chess, sports, ...] is that four or five hours a day seems to be the upper limit of deliberate practice, and this is frequently accomplished in sessions lasting no more than an hour to ninety minutes." (pg 71)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;How exactly do I do it?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Deliberate practice demands that "we insistently seek out what we're &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;not good at&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;." (pg 71) "He [&lt;span id="SPELLING_ERROR_0"&gt;Tichy&lt;/span&gt;] labels the inner circle 'comfort zone,' the middle circle 'learning zone,' and the outer one 'panic zone.' Only by choosing activities in the learning zone can one make progress. That's the location of skills and abilities that are just out of reach." (pg 68)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Top performers repeat their practice activities to stultifying extent." (pg 69) "More generally, the most effective deliberate practice activities are those that can be repeated at high volume." (pg 70)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Regardless of how well it [deliberate practice] is designed, another important variable is how much effort a person puts into it... Measuring the intensity of practice may be difficult, but it's clearly significant." (pg 80)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;What is the effect of deliberate practice? I.e., how does it make us better?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Frequently when we see great performers doing what they do, it strikes us that they've practiced for so long, and done it so many times, they can just do it automatically. But in fact, what they have achieved is the ability to &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;avoid doing it automatically&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. When we learn to do anything new—how to drive, for example—we go through three stages. The first stage demands a lot of attention as we try out the controls, learn the rules of driving, and so on. In the second stage, we begin to coordinate our knowledge, linking movements together and more fluidly combining... In the third stage, we drive the car &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;with barely a thought&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. It's automatic. And&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; with that &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;our improvement at driving &lt;/span&gt;&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;slows dramatically&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;, eventually stopping completely." &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;(pg 82)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"By contrast, great performers never allow themselves to reach the automatic, arrested-development stage in their chosen field. That is the effect of continual deliberate practice—avoiding &lt;span id="SPELLING_ERROR_1"&gt;automaticity&lt;/span&gt;... Avoiding &lt;span id="SPELLING_ERROR_2"&gt;automaticity&lt;/span&gt; through continual practice is another way of saying that great performers are always getting better." (pg 83)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;The above was &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;conceptually&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; how deliberate practice works; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;now for a few more details.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Perceive more&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; (where perception can be visual, auditory, tactile, ...).&lt;br /&gt;&lt;br /&gt;For a fast serve in tennis, rather than watch (or try to watch) the ball, exceptional players watch the server's body to predict where the serve will land. This is an example of &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;working around a limitation&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; (in reflex speed as far as 150mph serves go). "the accomplished performers, facing the familiar limits on response time, didn't react any faster than the novices, but they understood what they were seeing much more quickly" (pg 87). Similar examples for typists, jugglers, drivers. Other themes: understand the significance of indicators that average performers don't even notice, look further ahead, know more from seeing less, see differences that others don't see.&lt;br /&gt;&lt;br /&gt;What if response time is not the perceptual bottleneck? E.g., interpreting X-rays. No points for doing so quickly; rather, the challenge is to determine the correct diagnosis. All were looking at the same X-rays, the top performers were able to pick up on more subtle cues—which enabled discriminating among multiple possible diagnoses so as to obtain the correct one.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Know more&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. Domain-specific knowledge makes a difference. Doesn't suffice to merely apply superior reasoning methods to an arbitrary problem in a problem-independent manner. Stunning example of this was the quest to build a computer that could beat a man at chess. The computer could consider 100 million possible moves a second and still was beaten by Kasparov. Top performers have more knowledge AND their knowledge is better organized and consolidated.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Remember more&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. Finding: expert players could glance at a chess board in some position and recall it (all 25 pieces) perfectly whereas novices looking at the same board could only recall the positions of around 5 pieces. But, when instead put pieces randomly on the board, the difference in recall between the two groups was non-existent. "The conclusion was that top-ranked chess players did not possess incredible &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;general memories&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; but did possess an amazing ability to remember real chess positions." (pg 98)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;How?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; The above experiment tested short-term memory; "virtually &lt;span id="SPELLING_ERROR_3"&gt;everyone's&lt;/span&gt; short-term memory falls in the range of five to nine items." The chess researchers found that "the masters had only average short-term memories in that they recalled only five to nine 'items,' just like the novices. The difference had to be in what those 'items' were." (pg 99) From whence sprung &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;chunk theory&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;: everyone remembers the same number of chunks of information. "For the novices, a particular piece on a particular square was a chunk. But for the masters, who had studied real positions for years, a chunk was much larger, consisting of &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;a whole group of pieces in a specific arrangement&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;."&lt;br /&gt;&lt;br /&gt;Chunk theory explains short-term memory but not longer term memory differences, such as the chess players who would play — blindfolded — ten games simultaneously. The claim is that the memory used in this case is neither short-term (which does not have a long enough time span) nor long term (which doesn't produce fast enough recall) where short-term is like RAM and long-term is like disk. Supposedly, the explanation is something referred to as &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;expert working memory&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;, which involves the expert having some structure in which to incorporate the new information where that structure enabled recall at some later time. As an example, consider a programmer who has written a very long computer program. Because the programmer knows what the various routines he has written accomplish, he can remember all sorts of information about the program — information that would otherwise seem like random letters and symbols to someone who didn't understand the program's functionality.&lt;br /&gt;&lt;br /&gt;"the superior memory of great performers doesn't just happen. Since it is built on deep understanding of the field, it can be achieved only through years of intensive study. It further requires consistently relating new information to higher-level concepts..." (pg 102)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Even larger claim&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;: deliberate practice causes the brain to change in helpful ways. Then there is a discussion of &lt;span id="SPELLING_ERROR_4"&gt;myelination&lt;/span&gt;. &lt;span id="SPELLING_ERROR_5"&gt;Colvin&lt;/span&gt; doesn't claim that DP causes &lt;span id="SPELLING_ERROR_6"&gt;myelination&lt;/span&gt; but rather that &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;the way in which DP changes the brain&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; is akin to the way in which practice (in general) causes &lt;span id="SPELLING_ERROR_7"&gt;myelination&lt;/span&gt;. &lt;span id="SPELLING_ERROR_8"&gt;Myelination&lt;/span&gt; occurs when &lt;span id="SPELLING_ERROR_9"&gt;myelin&lt;/span&gt; builds up around neurons and nerve fibers; a neuron or nerve fiber with &lt;span id="SPELLING_ERROR_10"&gt;myelin&lt;/span&gt; around it "works better." (pg 103) How does it occur? When send a signal through a fiber over and over, that eventually causes &lt;span id="SPELLING_ERROR_11"&gt;myelin&lt;/span&gt; to build up over that fiber. By way of example, stroking a particular piano key in a particular way corresponds to sending a signal through a particular fiber. (But this makes it sounds as if doing something &lt;span id="SPELLING_ERROR_12"&gt;rotely&lt;/span&gt; can have a great effect when all previous discussion of deliberate practice makes it seem as though one must concentrate while doing it. The answer to this riddle is that &lt;span id="SPELLING_ERROR_13"&gt;Colvin&lt;/span&gt; isn't tying &lt;span id="SPELLING_ERROR_14"&gt;myelination&lt;/span&gt; to deliberate practice directly (yet).)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;OK, how do I actually apply these findings to become better?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;There are a couple different ways to practice, depending upon what skill (or activity) we're trying to improve.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;The music model&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. Use for playing a musical piece, giving a speech/presentation, writing, even preparing for an interview.&lt;br /&gt;&lt;br /&gt;In this case "you know what you want to convey, and the challenge is to convey it effectively. The message can be broken down into pieces and each piece analyzed for intent, then practiced repeatedly with immediate feedback from a coach or..." (pg 111)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;The chess model&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. Since there are thousands of books with positions from real games between top players, "study a particular position and choose the move you would make, then compare it with the move chosen by the master; if they're different, figure out why and which is better." (pg 112) Also used in case studies in business school.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;The sports model&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. Training involves two components: (a) conditioning which builds strength and capacities (e.g., endurance) and (b) work on specific critical skills. The tricky part about working on such skills — e.g., hitting a baseball, throwing a football to a receiver — is that they have to be performed differently every time "because the situations in which they're encountered are never the same." (pg 114)&lt;br /&gt;&lt;br /&gt;"Conditioning [in business] means getting stronger with the underlying cognitive skills... basic math and accounting in financial jobs, basic science in engineering jobs, basic language skills in editorial jobs." The second type of practice (specific skill development) "is based on focused simulation." Unpredictable opponents, fast responses, dynamic situations. Practicing these can be difficult because they involve other people.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Practicing in the work&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. Basically, whatever job you have to do that day, make that deliberate practice of some sort. Self-regulation.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;* &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Before the work&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;: set specific goals about &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;the process to use&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;* &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;During the work&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;: Observe yourself while doing the work; use &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;metacognition&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; ("knowledge about your own knowledge, thinking about your own thinking"; pg 108).&lt;br /&gt;* &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;After the work&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;: Debrief. Evaluate your performance. Figure out how to do better. Adapt.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Another thing you can work on day-to-day is deepening your domain knowledge. "your objective is not just to amass information. You are building a mental model — a picture of how your domain functions as a system." What does a mental model buy you?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;It's a framework in which to easily incorporate new information.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;It helps you distinguish relevant from irrelevant information.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;It lets you project what happens next.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"A mental model not only enables remarkable recall, it also helps top performers learn and understand new information better than average performers, since they see it not as an isolated bit of data but as part of a large and comprehensible picture." (pg 123)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Skipped &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Chapter 8: Applying the Principles in Our Organizations&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Chapter 9: Performing Great at Innovation&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Time was when you could turn the crank on a good business model for thirty or forty years, and sometimes much longer; the regulated-utility model of AT&amp;amp;T and electricity companies worked for close to a hundred years." (pg 147)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Creativity and innovation may even be the key to the future economic prosperity of America and other developed countries, at least according to one line of thinking. ... It [this idea that America's future depends on innovation]'s radical because for three hundred years the source of economic dominance has clearly been leadership in science and technology; the countries or regions that were the most advanced technologically have also been the most prosperous." (pg 147)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"how does Target thrive as a discount retailer against the massive power of Wal-Mart, a company more than five times its size that commands by far the world's most advanced retail computer systems? In part it does so by arranging for some of the world's top designers... to design some of the home's most pedestrian products... and then selling them in massive volume at discount prices. Following that strategy, Target can never be commoditized." (pg 148)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"The other thing we think we know about creativity is that it can be inhibited by too much knowledge. We often say that someone is 'too close to the problem' to see a solution. The broader principle is that if you know too much about a situation... then you can't have the flash of insight that is available only to someone unburdened by a lifetime of immersion in the domain." (pg 150)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;But... "The greatest innovators in a wide range of fields... all have at least one characteristic in common: They spent many years in intensive preparation before making any kind of creative breakthrough. Creative achievement never came suddenly." (pg 151)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"These findings remind us strongly of the ten-year rule that researchers have found when they study outstanding performers in any domain." (pg 152)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Until recently, researchers have often thought of creativity in two categories: Big-C creativity, which yields famous, influential products like the integrated circuit or Huckleberry Finn; and little-c creativity, which produces everyday creations like a TV commercial or a florist's arrangement of flowers. But ... have suggested that both types of innovation exist 'on the same developmental continuum,' and that the continuum extends even further back than little-c creativity, to what they call mini-c creativity. In this framework, 'all levels of creative performance follow a trajectory...' This perspective is highly significant because it ties together evidence showing that &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;creative achievement is attained in the same way&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt; as other kinds of achievement." (pg 159)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;How can an organization foster (encourage) innovation?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Create "innovation networks" within the organization. "'Since new ideas seem to spur more new ideas, networks generate a cycle of innovation.'" (pg 162)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"In a survey of six hundred executives, those at the top thought the main reason why their company wasn't more innovative was &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;that it didn't have enough of the right people&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;. Lower-level management held a markedly different view&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;that the company had the right people but the culture kept them from innovating as they should." (pg 163)&lt;br /&gt;&lt;br /&gt;Organizations should: tell people what's needed and give them freedom to innovate. "What's important is that people understand the organization's priorities and thus know where innovation will do the most good." (pg 164)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Practice in childhood causes myelin to build up more than does practice in adulthood." (pg 171)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;What type of environment is best for encouraging innovation?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Findings from a study of the parents (home environments) of 120 young high achievers (in various fields&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;art, science, athletics): "Despite wide variations in the parents' backgrounds, professions, and incomes, their homes tended to be child-oriented. Kids were important, and the parents were willing to do a lot&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;almost anything&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;to help them. The parents also believed in and modeled a strong work ethic. Work came before play, obligations had to be met, goals were to be pursued... 'To excel, to do one's best, to work hard, and to spend one's time constructively were emphasized over and over again.'" (pg 172)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"In an organization this progression [to a master teacher from an initial convenient teacher] is analogous to choosing developmental assignments taht continually stretch an employee's abilities. Employees aren't children, but many of them, like children, will not voluntarily keep seeking new work experiences taht stress their weakest professional muscles; the temptation to continue doing what you do comfortably is too great." (pg 173) &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"A stimulating environment was one with lots of opportunities to learn and high academic expectations. A supportive environment was one with well-defined rules and jobs, without much arguing over who had to do what, and in which family members could rely upon one another... But in the fourth combination, the environment that was both stimulating and suppportive, students were much more engaged, attentive, and alert in their studying... Most organizations are not intellectually stimulating, even when the field itself might seem fascinating..." (pg 174)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Deliberate practice == the fountain of youth?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Studies in a very broad range of domains&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;management, aircraft piloting, music, bridge, and others&amp;nbsp;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;show consistently that excellent performers suffer the same age-related declines in speed and general cognitive abilities as everyone else&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 12px;"&gt;—&lt;/span&gt;&amp;nbsp;except in their field of expertise... But while excellent pianists slowed down like everyone else in how fast they could respond to a choice on a screen, which is not a skill that makes much difference to a pianist, they didn't slow down at all when it came to piano-related skills like finger tapping or finger coordination. They could do those things as if they hadn't aged at all... When it comes to tasks that are part of their domain of expertise, great performers can keep performing at a high level even after their skills outside their domain have deteriorated." (pg 180)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Why bother?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"[Shizuka] Arakawa's road to the gold medal [in figure skating] involved at least twenty thousand derrier impacts on an unforgiving surface [the ice skating rink floor]... Arakawa's story is not just impressive in itself but also valuable as a metaphor. Landing on your butt twenty thousand times is where great performance comes from." (pg 187)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"A study of figure skaters found that sub-elite skaters spent lots of time working on the jumps they could already do, whlie skaters at the highest levels spent more time on the jumps they couldn't do, the kind that ultimately win Olympic medals and that involve lots of falling down before they're mastered." (pg 187)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;Who bothers?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"Creative people are focused on the task (How can I solve this problem?) and not on themselves (What will solving this problem do for me?)." (pg 188-189)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"His [Csikszentmihalyi's] famous work on 'flow' describes a state in which a person is so totally involved in a task that time slows down, enjoyment is heightened, and the task seems almost effortless. This 'high' is achieved when the challenge just matches the person's skills..." (pg 189)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"The concept of flow might even help explain one of the particular puzzles of motivation to practice. It's a considerable 'might' because the research has not been done... at a deeper level one has to suspect that practice is somehow meeting an inner need for anyone who can maintain it at an intense level for years. It seems plausible that the role of practice in producing the highly enjoyable flow state could be part of it." (pg 189-190)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;What not to do to a creative person&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: medium;"&gt;"'The intrinsically motivated state is conducive to creativity, whereas the extrinsically motivated state is detrimental.' Other studies showed that virtually any external attempt to constrain or control the work results in less creativity. Just being watched is detrimental." (pg 191-192)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); &lt;/script&gt; &lt;script type="text/javascript"&gt; try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-8662637423922871795?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/8662637423922871795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/08/what-im-reading-right-now-talent-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/8662637423922871795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/8662637423922871795'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/08/what-im-reading-right-now-talent-is.html' title='Thoughts from: Talent is Overrated by Geoff Colvin'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-753786280139608870</id><published>2009-07-10T12:51:00.000-07:00</published><updated>2009-10-14T15:57:47.768-07:00</updated><title type='text'>Cloud Service providers</title><content type='html'>So this is all about determining what kind of app I can run on the Amazon cloud vs. the MSFT cloud vs. the Google cloud. Are these guys all considered "cloud service providers"? Who else should I care about? (surely, Yahoo! has something?) What do their offerings look like? How do they differ from one another? What kind of app do they let me build (i.e., what do I upload to the cloud)? What type of functionality does their API expose (what can my app do that it couldn't do before)? Another question: how nice is the interface for managing one's stored data or web service at each of these cloud service providers? Answer: the GUI web interface for managing cloud resources seems to be a selling point for all.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The biggies of which I am aware:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#AWS" style="text-decoration: none;"&gt;Amazon Web Services (AWS)&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* MSFT &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#Azure"&gt;Azure&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;* Google &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#AppEngine"&gt;AppEngine&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Also look into:&lt;br /&gt;* Coghead (&lt;a href="http://www.techcrunch.com/2009/02/18/coghead-grinds-to-a-halt-heads-to-the-deadpool/" target="_blank"&gt;on second thought...&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: x-large;"&gt;&lt;b&gt;Overall Observations&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;All of the databases provided by Amazon, MSFT, and Google are &lt;i&gt;schema-less&lt;/i&gt;. That is, they collectively represent a big shift a&lt;i&gt;way from&lt;/i&gt; SQL and relational databases and &lt;i&gt;toward&lt;/i&gt; something more unstructured, like a hashtable or RDF triple store. Even Microsoft's SQL Service (which is a service that runs in the cloud and can be accessed by applications) doesn't actually run a SQL server!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Each vendor provides a way to upload blobs or large binary objects of data (Amazon S3, MSFT Azure Storage, and MSFT SkyDrive for Windows Live users).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;&lt;a name="AWS"&gt;&lt;/A&gt;Amazon Web Services (AWS)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'll talk in the below about:&lt;br /&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#SimpleDB"&gt;Amazon SimpleDB&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#S3"&gt;Amazon Simple Storage Service (S3)&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#EC2"&gt;Amazon Elastic Compute Capacity (EC2)&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a name="SimpleDB"&gt;&lt;/a&gt;Amazon SimpleDB&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An alternative to building and maintaining a DB (e.g., SQL) in-house. Used to store, process, and query data sets. Can be used in conjunction with EC2 and S3. Automatically indexes uploaded data; provides query interface for accessing that data.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The actual format (in which data is stored) sounds a lot like a triple (RDF) store. Create a "domain" which contains &amp;lt;attr, value&amp;gt; pairs. Can only query within a single domain (not across domains). There can be multiple entries for a single attribute (attr) mapping it to various different values. No pre-defined or set schema. Amazon indexes the data (for fast query access). Can query via the SELECT or the QUERY API, which are &lt;a href="http://aws.amazon.com/simpledb/#details" target="_blank"&gt;discussed in more detail here&lt;/a&gt;. Designed for fast access to a (relatively) small amount of data. Pricing is based on amount of storage, CPU time consumed by queries, and amount of data transferred to/from storage; note that transferring data from storage to EC2 is free of charge (i.e., to perform a calculation over that data). Not storing raw data the way that S3 does but instead storing hash table entries (i.e., attr, value pairs) which they index variously.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a name="S3"&gt;&lt;/a&gt;Amazon Simple Storage Service (S3)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simple interface (web service) to store and retrieve any data. How is S3 used? People store at S3: static web data, backups of files, files to share, and data to be processed using an EC2 application. That data is stored on the same infrastructure that Amazon's marketplace runs on; thus, quick access, high reliability, sophisticated, fault tolerant. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Can write, read, or delete an object; each object is anywhere from 1 byte to 5 GB in size. When upload an object, provide a key for it, which is subsequently used to retrieve the object. Each object is stored in a bucket in the same location that the bucket is stored (either US or Europe). Can grant access to the object to the public, to specific users, or to no one at all. Pricing is based on amount of storage occupied, amount of data transferred in or out, and the number of requests on data objects. The operations one can perform on data include: PUT, COPY, POST, LIST; it seems as though a data object is treated a bit like an opaque blob (in contrast to SimpleDB which enables performing SQL-like queries over data objects, which in that case are attribute-value pairs).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a name="EC2"&gt;&lt;/a&gt;Amazon Elastic Compute Capacity (EC2)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first two Amazon services that we looked at were ways to upload, store, and then access that stored data in the cloud. EC2 provides a way to effectively upload an application to the cloud; i.e., to convert an application that you run on a server that you maintain in an equipment room under your control &lt;i&gt;to&lt;/i&gt; an application that runs on Amazon's infrastructure. A small outfit might create a VM (Amazon Machine Image (AMI)) and install Apache web server on that VM, along with all of its site-specific web data. Then they would remap the DNS hostname to point to this VM, which is part of EC2. This means that the small outfit probably doesn't have to worry about denial-of-service (DoS) attacks anymore; plus, they don't have to maintain backup/redundant network connections etc. Many of the IT department is pretty much outsourced to Amazon. The small outfit just produces the web site data and uploads it to its VM, as appropriate.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The way I think of EC2 is as a replacement for a server that is used to host a customer-facing app; the most obvious and common type of these is a web server. So instead of running Apache locally, I'll simply move it to the Amazon cloud. I'm still running the same app on top of the same hardware configuration; the location of the app (and hence who is responsible for ensuring connectivity to the app etc.) has changed. You create an instance on EC2 using the same parameters that you would use in selecting a server: HW config (memory, CPU speed, amount of storage), which libraries should be loaded on the server, and which applications should be loaded on the server. These are not web-apps or applications built to some Amazon API but rather the same Linux-based or Windows-based applications; only difference is that the apps are not running on an Amazon VM.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By contrast, other cloud service providers actually provide an API. Then you write an application using that API. Your application is most likely a web-service. For example, below (with Google App Engine), instead of uploading a virtual machine (and specifying hardware configuration etc.), one merely uploads an application, written using a Google-provided API. So it's much more lightweight but you might need to rewrite your application so that it can be hosted on Google whereas with Amazon EC2 your app runs in an identical environment. So no changes are needed to the application itself. (Note that Amazon does have an API for &lt;i&gt;managing&lt;/i&gt; your EC2 instances, such as instantiating and running them as well as configuring access control among them.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;&lt;a name="Azure"&gt;&lt;/A&gt;Microsoft Azure&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'll talk in the below about:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#AzureOS"&gt;Azure OS&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#DOT_NET"&gt;.NET services&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#SQL"&gt;SQL services&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* &lt;a href="http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#Live"&gt;Live services&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://download.microsoft.com/download/e/4/3/e43bb484-3b52-4fa8-a9f9-ec60a32954bc/Azure_Services_Platform.pdf" target="_blank"&gt;Their whitepaper&lt;/a&gt; (pdf) — I don't recommend this; it's sort of typically sucky whitepaper writing (where they say that certain things are "harder than most people think" without providing any insight at all as to &lt;i&gt;how&lt;/i&gt; or &lt;i&gt;why&lt;/i&gt;); that said, there is some information in there. The basic offerings:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Azure Execution&lt;/b&gt;: Run a Windows application on Microsoft's cloud computing operating system (OS). Not for running arbitrary applications...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Azure Storage&lt;/b&gt;: Store data using Microsoft's cloud computing OS.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;.NET cloud service&lt;/b&gt;: Provides "distributed infrastructure services," such as a directory service for providing a mapping between a cloud service URI and an actual physical location.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;SQL cloud service&lt;/b&gt;: Presumably provides data storage/access.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Live cloud service&lt;/b&gt;: Synchronizes data across desktops and devices.&lt;/li&gt;&lt;/ol&gt;An app can do any single one of the above or any combination of the above; e.g., might have an app which runs at the customer site (so-called "on-premises applications") but stores data on the cloud using Windows Azure Storage &lt;i&gt;or&lt;/i&gt; stores data using MSFT's SQL cloud service (or both). An app can also run on the cloud, store data locally (on-premises), and access cloud services. Where specifically might an app be running? An app might run on the Azure OS in the cloud, on Windows Server in some company's equipment room, or on a user's desktop (using Windows XP or Vista) or mobile device (using Windows Mobile). This app might access cloud services. So the Azure Services Platform consists of a cloud OS (Azure) on which applications can run as well as a set of "developer services," including .NET services, SQL services, and Live Services.&lt;br /&gt;&lt;br /&gt;Here is video of Ray Ozzie (chief software architect at MSFT) introducing Azure. In this, he positions Azure as part of the "Web tier" of MS offerings (where the experience tier contains Windows Vista and Mobile and the enterprise tier contains Windows Server). The goals for Azure were two-fold: (1) Backwards compatible or *respect the installed base*; in Ray Ozzie's words: let current Windows developers apply their existing skills and knowledge as well as deploy existing code. So provide ability to leverage knowledge of Windows developer tools (such as Visual Studio) and environments (e.g., .NET framework). (2) Provide an "open environment" in which programmers can use arbitrary languages, tools, run-times (i.e., not relegated to only being able to use Microsoft tools).&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CD9ZItlZ7Pg&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/CD9ZItlZ7Pg&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size: large;"&gt;&lt;a name="AzureOS"&gt;&lt;/A&gt;Windows Azure OS: Compute and Storage&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There seems to be a bit of redundancy in offerings between (2) and (4) above but there are some key differences. &lt;b&gt;Azure Storage&lt;/b&gt; can be used to store blobs and does not use SQL or any other relational DB. Data is accessed via the REST protocol and using "a straight-forward query language" (that is not SQL), whatever that means. The unstructured-ness of the data storage makes Azure Storage sound a lot like Amazon's S3 service which enables uploading blobs (of widely varying sizes) to the cloud. However, one can also use Azure Storage to put data in tables which can be queried; this sounds much more like Amazon's SimpleDB service. So maybe Azure Storage is effectively a hybrid of both Amazon offerings, in which case look for it to have worse performance since it's not optimized for either (quite different) case.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Initially, could only run apps built using .NET framework on Azure OS. These are apps written in C# and "other .NET languages." It's expected that will be able to run non-.NET apps on Azure but presumably these must still be Windows apps (and there are no details here). &lt;i&gt;Managing apps that run on Azure&lt;/i&gt;: is via the app's configuration file which identifies the # of instances and other parameteres. To use the web-based management interface, need a hosting account if are going to actually run an app on Azure and a storage account if going to store data on Azure.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a name="DOT_NET"&gt;&lt;/A&gt;&lt;b&gt;.NET Services&lt;/b&gt;: to address common infrastructure challenges in creating distributed apps.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Access Control&lt;/b&gt;: I think the challenge is that one organization provides a user with an authentication token while another organization hosts the app. The solution is to supply a user with a token which contains a set of claims. That token is provided to the app which determines what type of access the user has, given his claims. This requires a way to translate claims created in one scope (the user's affiliation) into equivalent claims in a second scope (the application provider); this is referred to as &lt;i&gt;claims transformation&lt;/i&gt;. Alternatively, need to have &lt;i&gt;identity federation&lt;/i&gt;, which lets claims created in one scope be accepted in another.&lt;br /&gt;&lt;br /&gt;As a concrete (if toy) example, say that ACM has a policy which lets university students read its articles for free. So we need one entity (the university) to provide a token to each student which the student would provide to the second entity (ACM) demonstrating that he should be provided access to the requested ACM article. How does ACM know whether the token is valid (actually generated by the university) or not? What about token revocation? What language should the token use to encode the "right to read any article for free" such that the ACM article service automatically understands what that right means in this context?&lt;br /&gt;&lt;br /&gt;We hear the term &lt;i&gt;federated&lt;/i&gt; in tech a lot and it refers to the existence of autonomous domains that cede some power to a central authority which provides some service in exchange (that no single domain itself could provide). When we talk of &lt;i&gt;federated identity management&lt;/i&gt;, we mean that one entity vouches for the identify of some user to another entity which consequently provides a service to that user. We might also think of it as providing a unifying description of a single person across multiple domains, which might use different authentication technologies etc. So ACM and the University might know Joe Student in different ways and might store information about his identity differently but they both agree on a particular representation so that each can refer to Joe S. in a way that the other understands. &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-5893946.html" target="_blank"&gt;Some additional reading on federated identity mgmt&lt;/a&gt;. What's the big deal? Why would you care? FIM lets a company easily outsource various business functions without requiring that the company divulge all of its customer information.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Service Bus&lt;/b&gt;: It sounds like this is a directory or mapping service; an on-premises application provides a web service endpoint to SB. SB generates a URI for this endpoint; clients can locate and access the service via this URI (and with help from the SB's directory service which lists all such URIs). Presumably, the URI resolves to some network location in the cloud and all traffic to/from that location is forwarded on to the on-premises application. So the SB acts as a network proxy for traffic to/from the web services endpoint. The actual mechanics is that the web service endpoint opens a persistent connection to the SB; this connection is not torn down. Since the connection originates at the on-premises location, there is no need to punch any holes in the firewall. Traffic is sent over this connection. The client only ever sees the SB's IP address, not the IP of the on-premises web service.&lt;br /&gt;&lt;br /&gt;Maybe the Service Bus can also do authentication so then instead of merely passing all received (client) traffic to the target application (endpoint), the SB will check the client's credentials and only pass traffic through to the target if those credentials are sufficient.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Workflow&lt;/b&gt;: Have some logic in the cloud that coordinates various applications, integrating them to achieve some overall effect. Maybe each individual application communicates with the Workflow service to get its inputs and provide its outputs; the Workflow service in turn passes the first app's output to the second app as input and so on. (Again, all conjecture!)&lt;/li&gt;&lt;/ol&gt;&lt;a name="SQL"&gt;&lt;/A&gt;&lt;b&gt;SQL Services: A Database in the Cloud&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Exposes both SOAP and RESTful interfaces. Built on MSFT's SQL Server. It sounds like data is stored in a RDF-style format (unstructured); a single data item consists of a property which has: a name, type, and value, which sounds a lot like an RDF statement which consists of a subject, property, and value (and is also reminiscent of Amazon's SimpleDB service described above). No pre-defined schema. So why didn't they just offer actual SQL Server in the cloud? Issues with relational DBMS: scalability, availability, and reliability. The unstructured organization of data makes replication and load balancing easier and faster.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a name="Live"&gt;&lt;/A&gt;&lt;b&gt;Live Services: MSFT's API for web applications&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://home.live.com/" target="_blank"&gt;Windows Live&lt;/a&gt; is a family of web applications provided by MSFT. It includes an email app, an instant message app, an app for managing photos, and an app for managing contacts. There is also an app for storing data (SkyDrive) as well as a calendar, something like Evite, and something called Office Live (for creating/editing documents). These applications use &lt;a href="http://dev.live.com/" target="_blank"&gt;Live services&lt;/a&gt; to store and manage their data. What the &lt;a href="http://msdn.microsoft.com/en-us/library/dd156996.aspx" target="_blank"&gt;Live Framework&lt;/a&gt; is all about is making that data available &lt;i&gt;to other applications&lt;/i&gt;, i.e., to applications that are not part of the Windows Live suite. This would let users (you!) create apps and leverage that data; e.g., an app which used the map or directions info provided by the Live Framework. The MSFT Live suite is very reminiscent of Google's set of web services (such as Gmail, Google Docs, Google Calendar, Google Maps, Picasa, and so on).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's sort of interesting about this is that MSFT talks about making map, email, contact, etc. data available through Live Services &lt;i&gt;rather than &lt;/i&gt;talking about exposing a web services endpoint on each individual application (e.g., creating a web service endpoint as part of Hotmail which responds to queries for its data; doing the same for Live Office, Sky Drive, Messenger, and so on). Rather than creating all of those endpoints, since these applications already manage their data through Live Services, just let arbitrary web applications &lt;i&gt;also access&lt;/i&gt; that data through Live Services (via Live Framework). So they're creating a single interface on Live Services rather than an interface on each MSFT Live application.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The below figure is my conceptualization of Live Services. There is some suite of Windows apps that interact with and rely upon Live Services in order to store their data; this includes those mentioned above: Windows Live email, contacts, SkyDrive, Maps, Photos, ... The basic idea is to allow &lt;i&gt;other applications&lt;/i&gt; to also access that data (maps, directions, photos, calendar, contacts, email, chat, ...). The way this is achieved is that Live Services lives in the cloud and is accessed (using HTTP or RSS) via the Live Operating Environment (LOE), which also lives in the cloud. Thus, any application that can request data via HTTP can use Live Services data (doesn't need to be a .NET framework app or even a Windows app generally).&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_ZBDg7C2Kjko/SkJxAy7BmEI/AAAAAAAAAEM/ER9fL8OUiLQ/s1600-h/UpdatedWindowsLiveArch.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5350963565752850498" src="http://1.bp.blogspot.com/_ZBDg7C2Kjko/SkJxAy7BmEI/AAAAAAAAAEM/ER9fL8OUiLQ/s320/UpdatedWindowsLiveArch.JPG" style="cursor: hand; cursor: pointer; display: block; height: 247px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;The most exciting thing about Live services is that you can use it to synchronize data across systems; e.g., you could create a mesh which consisted of your desktop computer, laptop, and mobile phone. Each such device would run an instance of Live Operating Environment (LOE), which would be responsible for synchronizing data across all systems in the mesh (think of it as a network of communicating LOEs). The user specifies which data on these different systems should be kept in sync. Note that the different devices may be running very different operating systems, even OSs &lt;i&gt;not in the MSFT family&lt;/i&gt;. LOE can be run on: Vista, XP, Mac OS X, and Windows Mobile 6. Every mesh also implicitly includes the user's Live services account and hence includes his data stored on the cloud. Thus, if a user has contacts stored on his hotmail account, these could be synchronized with those on his mobile device and so on. A user can also provide access to data from his mesh with other users.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_ZBDg7C2Kjko/SkJrqAEYfgI/AAAAAAAAAD8/KXrmvD97LGs/s1600-h/microsoft_live_mesh.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="text-decoration: none;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5350957676586630658" src="http://1.bp.blogspot.com/_ZBDg7C2Kjko/SkJrqAEYfgI/AAAAAAAAAD8/KXrmvD97LGs/s320/microsoft_live_mesh.jpg" style="cursor: hand; cursor: pointer; display: block; height: 264px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;An app (which runs on a user's device or in the cloud) accesses that user's mesh data through the local LOE or from the cloud LOE. If the app wants to access the mesh data belonging to a user's friend, the app presumably interacts with the cloud LOE, requesting the friend's data (presumably the friend has already provided the necessary permissions). A user can also run an application on his mesh (i.e., on any machine within that mesh); data modified by that app will be kept synchronized. There is a directory of mesh-enabled web apps. A mesh-enabled web app can also be shared with friends (this is their social-networking-apps angle).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another option involves a user who has a Windows Live account (with lots of associated data —&lt;b&gt; &lt;/b&gt;from various Windows Live applications) but he has an iPhone, Linux computer, and so on (no device which runs a Windows OS). And the data he wants to keep synchronized lives on these systems for which there is no LOE. The solution is for the user to have Silverlight installed as a browser plug-in on each device; .NET apps can run on Silverlight; it's like creating a Windows execution environment inside the browser on top of any arbitrary OS. Then this app (which is built for Silverlight) will be able to access the cloud LOE. This is MSFT's multi-platform support, I think, and it uses Silverlight as a bootstrap. The application in this context is a web app.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(How does this work for data which is represented using different formats on different systems? E.g., office documents on Mac? contacts on Mac? and so on. Maybe practically the system works much better when all devices are running a Windows OS. Also: how about Live Services data? Which of it is available to everyone? Only the generic info? Is it possible for a user to make his data available to everyone? Or temporarily? I'm thinking about my Personal Marketplace idea here. And how a user might provide temporary access to (some portion of) his Live services data for a fee.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Questions&lt;/b&gt;&lt;br /&gt;* What is the isolation between multiple apps all running on the cloud OS (Azure)?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Accessing the services described is via a new API? Or existing API with new arguments?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* What about non-MS apps? Can they run on Azure? Store data on Azure? Take advantage of cloud services?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;&lt;a href="http://code.google.com/appengine/docs/whatisgoogleappengine.html" name="AppEngine" target="_blank"&gt;Google AppEngine&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More on AppEngine; note to self: read following and update below &lt;a href="http://www.stanford.edu/class/ee380/Abstracts/081105-slides.pdf"&gt;http://www.stanford.edu/class/ee380/Abstracts/081105-slides.pdf&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AppEngine provides a way for folks to run their web applications on Google's infrastructure; it is not a general-purpose computing platform for any arbitrary code. They run and serve code for you; your code can use some of the functionality used by Google's own web apps (e.g., Google Docs, Gmail, ...), such as Google Accounts, Google File System (GFS), and BigTable. Can write an AppEngine app using the following languages: Java, JavaScript, Ruby, Python. Your app can run either in response to receiving a web request or to a cron job. You can also limit who can execute your app. AppEngine exposes a bunch of APIs including: datastore, memcache, URL_fetch, mail, images, and Google Accounts. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AppEngine consists of:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;A "&lt;b&gt;scalable serving architecture&lt;/b&gt;" — i.e., a way for a request to your web service to reach a running instance of your code. When you submit code to Google, it will be pushed to a bunch of fault tolerant servers. Google automatically scales resources for your code on-demand (you don't neeed to specify a priori the # of machines, CPUs, etc.).&lt;br /&gt;&lt;br /&gt;Your code runs in a sandbox which provides limited access to the underlying OS. The sandbox disallows writing to the file system; an app can only read files that are uploaded with the app's code. Google provides some APIs for persistent storage. So for example if your app's Java bytecode tries to open a socket or write to a file, a run-time exception will be generated.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Python &lt;b&gt;run-time&lt;/b&gt; (and now a Java run-time too). The Python run-time includes a fast interpreter. There is a uniform infrastructure, consisting of the API and developer tools, which apply regardless of the language you're programming in.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;SDK&lt;/b&gt;: is written in python; there's a release of it for Linux, Mac, and Windows. Comes with a AppEngine simulator that lets you test, run, and debug your apps locally (don't need to deploy code to their servers in order to see what the code does).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Web-based Administrative Console&lt;/b&gt;: see app status, control who can administer the app, control which version of the app receives the most hits; also contains a bunch of tools, including those which: let you look at request logs, app logs, your data objects, let you hook up a domain to your app, let you see which errors are being received on which URLs, see traffic reports, etc.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Scalable data store&lt;/b&gt;, i.e., their persistence layer: this is based on &lt;a href="http://en.wikipedia.org/wiki/BigTable"&gt;BigTable&lt;/a&gt; instead of SQL. &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Application Environment&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Serves web pages&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Automatically scales resources and load balances on-demand&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Provides API for authenticating users&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Provides API for sending email (using Google Accounts)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Provides persistent storage which can be queried and sorted.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Provides local development environment which simulates AppEngine on a user's computer&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Provides scheduled tasks&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Sandbox&lt;/b&gt;: limits access to the underlying OS&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why? So that your app is portable... i.e., can be migrated from any system to any other system (since doesn't have any environmental dependencies). How does sandbox constrain app execution?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Network&lt;/b&gt;: &lt;i&gt;Outbound&lt;/i&gt;: your app can only connect to other hosts via the &lt;span style="font-family: 'courier new';"&gt;URL fetch&lt;/span&gt; and email services. &lt;i&gt;Inbound&lt;/i&gt;: your app can only receive connections via HTTP or HTTPS on the standard ports.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;File system&lt;/b&gt;: &lt;i&gt;Writing&lt;/i&gt;: App cannot write to the file system. &lt;i&gt;Reading&lt;/i&gt;: App can only read the files that were uploaded with the app initially. Instead, the app should use the datastore, memcache, or other services in order to maintain state across requests.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Execution&lt;/b&gt;: app is only executed when receives a web request or a cron job. An AppEngine program consists of a map between URLs (on which requests might be received) and the applicable program to run for each. An app must return a response within 30 seconds of being executed. After returning that response, the request handler (i.e., app) cannot spawn a subprocess or execute code.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a href="http://code.google.com/appengine/docs/java/overview.html" target="_blank"&gt;The Java Runtime Environment&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The JVM implements the restrictions on the sandbox environment; hence, bytecode that tries to write a file or open a socket will throw a run-time exception. The AppEngine implementation for Java also includes an implementation of some standard Java API functions so that such functions use AppEngine services. For example, if your program invokes the java.net HTTP APIs, your program will be using the AppEngine &lt;span style="font-family: 'courier new';"&gt;URL fetch&lt;/span&gt; services. This might make porting existing apps easier since don't need to program to an entirely new API; rather, the changes are under-the-hood. Similarly, the APIs for JavaMail, Java Data Objects, and Java Persistence are all reimplemented by AppEngine. That said, AppEngine does have some new APIs which can be used to access its datastore, memcache, Google Accounts, &lt;span style="font-family: 'courier new';"&gt;URL fetch&lt;/span&gt;, mail, and images services. (So in some cases it appears there is &amp;gt;1 way to skin — or &lt;span style="font-family: 'courier new';"&gt;URL fetch&lt;/span&gt; — a cat.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a href="http://code.google.com/appengine/docs/python/overview.html" target="_blank"&gt;The Python Runtime Environment&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See: &lt;a href="http://code.google.com/appengine/docs/python/overview.html" target="_blank"&gt;http://code.google.com/appengine/docs/python/overview.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Datastore&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So this sounds like an RDF store which contains triples, each of which consists of a subject, predicate (or property), and object (or property value). Queries can be executed over this store, and the store is actually spread across multiple machines (so it's &lt;i&gt;distributed&lt;/i&gt;). A property's value can be String, Boolean, byte string, ..., &lt;a href="http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html" target="_blank"&gt;and so on&lt;/a&gt;. This is another example of a non-relational database; it's &lt;i&gt;schemaless&lt;/i&gt;. That said, your application code can create and enforce some structure on your datastore (would this be akin to requiring that data be part of some ontology?). Use the Java Data Object (JDO) and Java Persistence API (JPA) to access the datastore or can access the datastore directly using its own API. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The datastore is &lt;i&gt;strongly consistent&lt;/i&gt; and uses optimistic concurrency control. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What is app execution cycle?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Receive request on URL X&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Google AppEngine identifies handler (i.e. program) for X&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* AppEngine invokes that handler (executes that program)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Program must return a response within 30 seconds&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;An AppEngine application&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An app consists of a *.yaml file which identifies the application's name and version, as well as which run-time and which version of the AppEngine API the app uses. The YAML file also provides a mapping from URLs to code which should be invoked when such URLs are visited. You can start up the development web server (on local machine) via: $dev_appserver &amp;lt;appName&amp;gt; which will print out a URL which you then visit in your browser to test the app. E.g., the following encodes that visiting any URL should result in invoking the main.py python script.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;-url: *.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;script: main.py&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;Below is from Campfire One, which was held in April 2008.&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/oG6Ac7d-Nx8&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/oG6Ac7d-Nx8&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&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;br /&gt;&lt;script type="text/javascript"&gt; var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); &lt;/script&gt; &lt;script type="text/javascript"&gt; try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-753786280139608870?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/753786280139608870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/753786280139608870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/753786280139608870'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/06/cloud-service-providers.html' title='Cloud Service providers'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZBDg7C2Kjko/SkJxAy7BmEI/AAAAAAAAAEM/ER9fL8OUiLQ/s72-c/UpdatedWindowsLiveArch.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-6187194464343615804</id><published>2009-06-29T09:30:00.000-07:00</published><updated>2009-09-21T10:31:20.951-07:00</updated><title type='text'>Geambasu — Menagerie (WWW, April 2008)</title><content type='html'>&lt;b&gt;Notes on&lt;/b&gt;: &lt;a href="http://www.cs.washington.edu/homes/roxana/acads/projects/menagerie/www08/www08-geambasu.pdf" target="_blank"&gt;Organizing and Sharing Distributed Personal Web Service Data&lt;/a&gt; (pdf)&lt;div&gt;&lt;b&gt;Authors&lt;/b&gt;: Geambasu, Cheung, Moshchuk, Gribble, Levy (Univ of Washington)&lt;/div&gt;&lt;div&gt;&lt;b&gt;Venue&lt;/b&gt;: WWW, April 2008&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;My initial comments&lt;/b&gt;: Allow me to warn you that in all likelihood you will have an easier time digesting this material if you go straight to the source. In the below, I wrestle with what the hell the authors are talking about in certain places which is sure to confuse you more if the same questions didn't arise in your own mind as you were trying to understand how the system works. I.e., caveat emptor. On the other hand, if you want to understand how to become a better writer by seeing firsthand how many different ways something can be interpreted then, by all means, eat your heart out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The problem&lt;/b&gt;: A user's data is scattered across the Web and lives under the control of different domains (Flickr, Google Docs, Google Calendar, Picasa, YouTube, ...) which expose data differently (in some cases at a stable, predictable URL and, in other cases, not) and provide different ways to share that data. How can a user: (1) organize, search, and archive that data; (2) create a collection of data that consists of objects owned by different players AND share that collection "in a protected way"; (3) manipulate these data objects using standard applications or scripts (similar to the way that a user can manipulate each file on his desktop system using hundreds of utilities, such as cat, ls, grep).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With desktop computers, a file can be operated on by multiple different applications regardless of which application created the file. Whereas in the web service world, data created as part of one web service (e.g., docs authored at Google docs) cannot be operated on by other web services or using standard utilities (such as ls and grep). Also, on the desktop it's easy to compose applications or utilities in order to get new, more interesting functionalities; e.g., think of all of the command-line shell utilities (such as grep, find, ls, cat, ..., which can be combined using various operators (e.g., pipe, input or output redirection, and so on)).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Their solution&lt;/b&gt;: Have each Web service implement a standard interface that enables accessing and modifying objects that live on that Web service. Then a &lt;i&gt;composite application&lt;/i&gt; can aggregate objects from these various services in order to provide a user with a single logical view of his scattered Web data. Note that in their conceptualization, the composite app isn't actually downloading and managing the various objects but rather embedding pointers to those objects and presenting thumbnails of them. But the solution principally is a standard API, implemented by each Web service that houses user data. The API deals with how one refers to objects (naming), how Web services expose objects via stable URLs, how access to objects is mediated, and how data objects are shared.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thus, the solution requires the various Web services to do something in order to support it; as an intermediate deployment strategy, one can create a proxy for each target Web service where the proxy effectively implements the API on behalf of the service. Naturally, each proxy would be very Web-service-specific.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Goals&lt;/b&gt;: want a user to be able to create a collection of objects and specify policy for that collection as a whole despite the fact that the objects live under the control of different web services which export different access control policy frameworks. Another goal is to enable a user U to share her data with user V even if some of that data lives on web services where V does not have an account (and does not want to get one); i.e., want the ability to share data that is part of some web service with a user who does not have a relationship with that web service.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Challenges&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Not all Web services expose the objects they house in a way that enables referring to such objects externally.&lt;/li&gt;&lt;li&gt;Every Web service has its own access control, authentication, authorization framework. No single uniform way to configure access control policy. A Web service may only support coarse-grained (all-or-nothing) access control policies.&lt;/li&gt;&lt;li&gt;To access a person's data on Web service S, you may be required to have your own account with S.&lt;/li&gt;&lt;li&gt;The access control frameworks of Web services might not support write privileges and might not support revocation of rights.&lt;/li&gt;&lt;li&gt;In addition to possibly not providing a stable URL to access a particular object, Web services might not provide a way to programmatically manipulate such objects.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What will web services need to do to support this solution?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Each origin Web services must export an interface to enable other web services to access data that lives on the origin Web service. Each origin Web service must provide metadata for each data object O (that lives on the service) such that O could be rendered (and operated on) within an arbitrary web page.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;What does the solution require?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Need a single global namespace. Every object and object collection must have a unique and permanent name in this namespace.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The access control interface (to a user's heterogeneous data/object collection) should enable that user to share some portion of that data (rather than requiring the user provide all-or-nothing access). This interface should also enable an entity to access an object on a Web service even if that entity has no account with that service.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Each object should support some set of functions which will be invoked on the object by other Web services or utilities or directly by the end user. One such function is that each object must be able to be embedded and rendered within an arbitrary web page.&lt;/li&gt;&lt;/ol&gt;So they built a system that realizes this vision...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Menagerie&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Consists of Menagerie Service Interface (MSI) and Menagerie File System (MFS).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Menagerie Service Interface (MSI)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;At first blush this is sort of confusing in terms of who implements the interface? Who uses this interface? These are incredibly simple questions with only a limited range of answers, given the context, and yet the answers are not explicitly stated. So we'll be forced to reason them out; so let's look at the described API functions and the players, which include &lt;i&gt;the origin web services&lt;/i&gt; (e.g., Flickr, Picasa, KG) — which own users' data objects — and &lt;i&gt;non-origin web services&lt;/i&gt; (also referred to as &lt;i&gt;composite web services&lt;/i&gt;) — which access objects owned by other web services. A few types of functions are mentioned: &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;An origin web service calls &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;export&lt;/span&gt; in order to add the name of one of its objects to the global namespace. Presumably, this function is implemented by a special Web service, namely the &lt;i&gt;global namespace&lt;/i&gt; Web service which maintains a directory of all objects exported by any Web service. This function returns the stable URL for the object?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Questions&lt;/b&gt;: So is this like a directory service where I can obtain a URL given some object description? Where does the URL point? To the origin web service? I.e., who actually hosts the various data objects? Presumably, the origin web service hosts its objects and must provide an externalized link to such objects (i.e., must make a stable URL available which can be used to refer to / name the given object).&lt;br /&gt;&lt;br /&gt;Comments: I think I was taking the term "export" too literally; they just mean that if you query a Web service (using some MSI API function), it will provide a unique name for each object which can be combined with the service's domain name to obtain a globally unique object ID.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A capability is provided by an origin web service (e.g., Flickr) to a non-affiliated user (e.g., my brother who doesn't have an account on Flickr) to access a particular object (e.g., my album of 4th of July photos) for some period of time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Questions&lt;/b&gt;: but who actually asks for the capability? The object owner?? (E.g., my brother asks me and I interact with Flickr to obtain the capability then give it to my brother?) Otherwise, how does Flickr authenticate the person asking since Flickr doesn't have a relationship with that person?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The third type of API function mentioned as part of MSI are &lt;i&gt;object-independent access functions&lt;/i&gt;, such as, to read, write, or render a particular object or to obtain an object's metadata. These are perhaps the most straightforward to imagine who implements them and who invokes them. Presumably, an origin web service provides an implementation of these access functions which are invoked by a non-origin web service in order to interact with an object owned by the origin Web service.&lt;br /&gt;&lt;br /&gt;For example, let's say we have a photo aggregator app (i.e., a non-origin web service) which creates a virtual file system which contains thumbnails of all of my photos (which are stored, say, on various photo sites, such as, Flickr, Shutterfly, Picasa, and KodakGallery). So this photo aggregator app (PAA) would be invoking these functions on individual photo objects. For example, let's say p1, p2, and p3 all live on Flickr, the PAA will call p1.getThumbnail(), p2.getThumbnail(), p3.getThumbnail() to obtain the thumbnails of photos p1, p2, and p3, respectively.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Let's recap; below is our conjecture:&lt;/div&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Function&lt;/th&gt;&lt;th&gt;Does what?&lt;/th&gt;&lt;th&gt;Who implements?&lt;/th&gt;&lt;th&gt;Who invokes?&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;export&lt;/td&gt;&lt;td&gt;Exports a name for an object into the global namespace.&lt;/td&gt;&lt;td&gt;The web service which acts as the global namespace.&lt;/td&gt;&lt;td&gt;The origin web service.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;generateCapability&lt;/td&gt;&lt;td&gt;Obtains a token to present to an origin web service in order to gain access to some object stored on that web service.&lt;/td&gt;&lt;td&gt;The origin web service.&lt;/td&gt;&lt;td&gt;Some non-origin web service. Or perhaps the user who owns the object.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;readObject&lt;/td&gt;&lt;td&gt;Returns an object's contents.&lt;/td&gt;&lt;td&gt;The origin web service.&lt;/td&gt;&lt;td&gt;Some non-origin web service.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Menagerie File System (MFS)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Allows an app to mount a remote MSI object hierarchy into a local file system namespace. For example, I could mount Ann's entire collection of photos (which lives on KodakGallery) and operate on those photos locally. (Would the effects of my edit or tagging operations be pushed back to Ann's version on Kodak Gallery?) So thereafter my app can operate on Ann's photos as if they were files stored on my computer. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Implementation particulars&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;After all of that rife speculation, let's get down to the details. They talk about three types of operations: &lt;b&gt;"object naming"&lt;/b&gt; (list, getattr, mkdir), &lt;b&gt;protection&lt;/b&gt; (create_capa, revoke_capa), and &lt;b&gt;access&lt;/b&gt; (read, write, get_summary, get_URL).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Object Naming&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Each thing (object) has two names:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;One provided &lt;i&gt;by&lt;/i&gt; the user; this name is meaningful to the entity who owns the data. For example, a photo on Flickr might be referred to using the path to the photo (i.e., the name of the album that contains it) along with the actual photo name.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;One provided &lt;i&gt;to&lt;/i&gt; composite web services for them to use in invoking operations on that object; this is referred to as the &lt;i&gt;service-local ObjectId&lt;/i&gt; or &lt;i&gt;ObjectId&lt;/i&gt; for short. Menagerie generates globally unique object IDs by combining an object's service-local ObjectId with the domain name of the service hosting that object. So if Flickr contains objects with service-local ObjectIds &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;n1&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;n2&lt;/span&gt;, ... then the Menagerie names for these objects will be &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;flickr.com:n1&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;flickr.com:n2&lt;/span&gt;, ...&lt;br /&gt;&lt;br /&gt;Presumably, the origin web service generates this service-local ObjectId (they don't say). I assume that the origin web service creates the ObjectIds because the origin web service implements the MSI interface and most functions in that interface take this ObjectId argument. Hence, that value must be meaningful for the service.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Calling &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;list&lt;/span&gt; returns the mapping between the two names. A user's &lt;i&gt;object name hierarchy&lt;/i&gt; is the collection of his names for all of the objects he &lt;i&gt;has access to&lt;/i&gt;; note that a user's hierarchy may contain the names of objects that belong to someone else. The service-local ObjectIds can be independent of where the object lives within its owner's hierarchy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Why need two different names for a single object&lt;/i&gt;? Because we don't necessarily want to expose a user's organization of her photo albums to the people with whom that user shares a photo? So that the name for an object is stable, even across operations such as the user renaming/moving that object somewhere else in the hierarchy (this is probably why). Also, by using a single ObjectId to refer to a single object, they can identify all accesses to that object and cache it as appropriate. By contrast, if an object is reachable by many different users and the object lives somewhere different in each user's hierarchy and we used those hierarchical paths to identify accesses of the object, we might miscount the number of accesses to an object since that object has different names according to different people.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They describe operations which can be performed on a name hierarchy; presumably, these operations are implemented by each origin web service.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;list&lt;/span&gt;: given a directory's ObjectId, return the name and ObjectId for every object within that directory.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;getattr&lt;/span&gt;: given an object's ObjectId, return metadata about that object (e.g., its type, size, last modified date, etc.) as well as a capability for that object.&lt;br /&gt;&lt;br /&gt;(So this function always gives out a generic capability to whomever asks? Or it performs a privilege check? Or the access control is done earlier — for example, a user is only given the ObjectId for objects that this user is allowed to access. So &lt;i&gt;knowing&lt;/i&gt; the ObjectId implies that one has sufficient privileges to read the object?&lt;br /&gt;&lt;br /&gt;ANSWER: They assume that capabilities are generic (rather than specific to the holder of the capability) and the distribution of them is only to people who should have them. A web service can however require that a user authenticate himself to the service &lt;i&gt;in addition to &lt;/i&gt;requiring that the user possess the necessary capabilities.)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mkdir&lt;/span&gt;: add a collection of objects to the hierarchy (to the user-specific hierarchy?).&lt;br /&gt;&lt;br /&gt;This is a little strange. Presumably if a user wants to organize his objects on the target Web service, he can do so using that Web service's available controls. Not sure where the created directory lives. (Or is this for augmenting some other directory hierarchy structure, for example one maintained by the service itself for its own purposes?)&lt;br /&gt;&lt;br /&gt;Can definitely imagine a composite web service maintaining a user-created directory structure; perhaps that's the intended context for this API call (rather than thinking of mkdir as creating a directory on the origin Web service). Not sure.&lt;/li&gt;&lt;/ul&gt;Again, it's at least modestly unclear who is invoking these functions. Does the data owner invoke these functions in order to manage his data? Maybe each user U who has an account with a web service S invokes these functions; in this scenario, the owner U of an object obtains the capability needed by a friend F who wants to see that object. U presumably can obtain the root directory's ObjectId and then calls list as appropriate to obtain the ObjectId of a photo P that U wants to share with F. Then U calls getattr on P's ObjectId and returns the provided capability to F. At least in this (conjectured) case, it makes sense how authentication works since we have a user U who has an account with S invoking functions implemented by S.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Protection&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;They have a hybrid capability-based protection system. What's the "hybrid" part? With normal (non-hybrid) capabilities, possessing a capability alone suffices to gain the described access to the specified object. But in Menagerie, an origin web service can require that a user provide a capability as well as authenticate himself in order to get access. A Menagerie capability is an unforgeable token that contains the globally unique ID for some object as well as a set of access rights. The semantics are that a user who holds a capability is allowed to access the specified object in the specified way(s). Note that a capability &lt;i&gt;does not&lt;/i&gt; contain any identifying information as to &lt;i&gt;who&lt;/i&gt; is allowed to access the specified thing in the specified way; the right applies to &lt;i&gt;any user who holds the capability&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As mentioned, a web service can also exert some control over who exercises a capability. In particular, a web service issues two types of object rights: (1) &lt;b&gt;open-access&lt;/b&gt;, which gives the capability holder direct access to the specified object without further authentication, and (2) &lt;b&gt;closed-access&lt;/b&gt;, wherein the web service can also require that a user authenticate himself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Implementing capabilities&lt;/b&gt;&lt;/div&gt;&lt;div&gt;If a user possesses a capability for some object O, he actually possesses access rights for all objects rooted at O. So the idea is that a capability might be given for a directory D, enabling the holder to access any object within D or within a subdirectory of D, and so on. Each capability consists of an 8-byte "root node global ID" (which is presumably the object's service-local ObjectId along with the domain name of the service where that object lives) and a 16-byte password. These two values are also stored at the web service (that issues the capability) along with the applicable open- and closed-access rights for that object. The password field is to ensure that an attacker who knows the global ID for an object cannot successfully forge a capability for that object. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Most MSI functions require a capability as well as the ObjectId:&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;list( capa, objectId )&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;getattr( capa, objectId )&lt;/span&gt;&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;create_capa( capa, objectId, rights )&lt;/span&gt;&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;read( capa, objectId )&lt;/span&gt;: to read an object&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;write( capa, objectId, name, content )&lt;/span&gt;: to write an object&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;get_summary( capa, objectId )&lt;/span&gt;: to get an HTML thumbnail of an object&lt;br /&gt;* &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;get_URL( capa, objectId )&lt;/span&gt;: to get the URL of an object on its home Web service&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The exceptions are:&lt;br /&gt;* mkdir( capa, parentId, name )&lt;/div&gt;&lt;div&gt; * revoke_capa( object_capa, revoke_capa )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Revoking a capability for an object O requires a valid capability on O which has the revocation rights enabled. Revocation entails zero'ing the rights field in that capability's CapTable entry.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then they give some real-world examples of web services using capabilities.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Accessing Objects&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;MSI provides a few ways to access objects:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Can embed an object from a remote service within a page. The service that owns the object is responsible for its presentation and interaction controls.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Can get object metadata via get_summary, which returns an HTML code snippet that displays a thumbnail of the object, and get_URL, which returns the object's URL within its parent service.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Can invoke an object-independent access function (e.g., read, write, delete) on an object.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The MSI is an XML RPC layer on top of HTTP which means that you can invoke an MSI function by making an XML RPC call, which can be done in various programming languages, including JavaScript.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;To build a composite Menagerie app, need web services that support MSI. As an incremental deployment strategy, they created MSI proxies for non-MSI services (including Gmail, Yahoo! mail, Flickr, YouTube, Google Spreadsheets), each of which implements the MSI functions and Menagerie protection model on behalf of a service. So each proxy is service-specific. For services which provide a developer API, creating the proxy was straight-forward. For other services, had to do screen scraping etc. which probably wouldn't scale and is kind of a mess generally.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Menagerie File System lets an application mount a user's MSI name hierarchy then operate on objects within that hierarchy as if they were local (e.g., invoking system calls or utilities (such as cp and tar) on such objects). A system call (such as fopen, getattr, readdir, read, write) executed on a mounted object gets passed via VFS to MFS which translates that system call to the corresponding MSI call on the Web service which owns this object. They use a couple caches to speed up access to the mounted FS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Menagerie Applications&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;Menagerie Web Object Manager (WOM)&lt;/b&gt;: use this to create a virtual file system where can drag and drop various objects stored at various web services (without actually affecting how those objects are stored at their home services). Can also share a view of this file system (i.e., export some portion of this file system) to other users -- to give them access to some part of your virtual hierarchy. So in this way, the composite application is both a client (for each web service that owns some object contained in the virtual hierarchy) and a server (for other applications that request to see part of this virtual file system). The kinds of objects one can store in a folder include videos, emails, pictures, spreadsheets, and so on. Moreover, if a user clicks on an object within the folder, the user will be directed to the object's home location (on its parent web service). So if a folder contains a Google docs spreadsheet, the user can click on the particular spreadsheet icon which will open up the spreadsheet (possibly for editing) in Google docs. As mentioned, WOM exports MSI which means a user can get a capability for a WOM virtual folder and give that capability to others.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;Menagerie Group Sharing Service (MGS)&lt;/b&gt;: instead of a single user creating a collection of Web objects then optionally sharing that collection (read-only) with others, MGS is all about a group collectively owning a collection into which each group member adds various objects from different Web servioces. Lets users share a single virtual desktop.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Some questions&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Are capabilities the right model for this? Will a user understand that a capability (i.e., this thing which looks like a URL) should only be forwarded to or shared with someone to whom you want to grant access? When we repurpose things that users know in one context (e.g., URLs) to have security relevance, this can sometimes cause problems.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Once we have some Web service that uses closed-access rights for its objects, what's the benefit of a capability in that scenario? Is the idea that we can partition the various rights that a user might have for an object so that only a small slice of them require authenticating with an object's home Web service? For example, broadly allow users to read an object but writing an object requires authentication.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Somewhat out of the scope of this document is what the typical life cycle of a capability will be. E.g., some user wants to share her 4th of July photos on Flickr with family and friends so she sends an email with a capability which identifies both how to access the photos and provides the privileges necessary to do so. Then her sister Sarah runs an application (like WOM) which invokes MSI functions in order to download thumbnails of the given photos; Sarah adds these photos to her own WOM virtual file system. Naturally, exercising a capability can only be done by a program that invokes MSI functions.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;So a Menagerie capability provides access to all objects rooted at some node (objectId). This is hard-coded into their system and seems not very general. Or at the least, this is a topic of discussion: are there common cases where a user might like to share access to an object without providing access to all of that object's children (and grandchildren and great-...).&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); &lt;/script&gt; &lt;script type="text/javascript"&gt; try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-6187194464343615804?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/6187194464343615804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/06/geambasu-menagerie-www-april-2008.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/6187194464343615804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/6187194464343615804'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/06/geambasu-menagerie-www-april-2008.html' title='Geambasu — Menagerie (WWW, April 2008)'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-3035854476356026853</id><published>2009-06-17T16:06:00.000-07:00</published><updated>2009-09-21T10:31:32.918-07:00</updated><title type='text'>What's a gadget?</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); "&gt;&lt;a href="http://code.google.com/apis/gadgets/" target="_blank"&gt;A gadget&lt;/a&gt;&lt;/span&gt; is an application that is specified via an XML file, which can contain HTML and hence JavaScript and even Flash code. &lt;a href="http://code.google.com/apis/gadgets/docs/fundamentals.html#Content_Type" target="_blank"&gt;There are two types of gadgets&lt;/a&gt;: those whose content is stored in the specification (HTML gadgets) and those whose content is stored at some network-reachable location specified by a URL (URL gadgets). We confine our discussion here to HTML gadgets (the default type). A gadget can store data persistently, run JavaScript code, and download content from remote websites. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Gadgets differ in terms of their configurability (i.e. the extent to which a user can specify his preferences for gadget operation and/or look-and-feel) as well as in whether the user inputs information into the gadget or instead merely receives info from the gadget (that is, whether communication flow is bi-directional in an ongoing basis). For example, many gadgets for news sources (e.g., the Wall Street Journal, Scientific American) at present provide few options for user configurability; also, the flow of information is mostly uni-directional — from the content provider to the user. By contrast, some applications have initial configuration opportunities but thereafter the flow of information is uni-directional (from the gadget to the user); e.g., a Clock application is initially configured with time zone but thereafter merely informs the user of the current time. There's no notion of the user interacting with that time in some way. Finally, some gadgets may or may not have user-configured settings but do have ongoing user input. For example, the to-do list gadgets involve the user providing information (i.e., items to be done); hence, the flow of information is bi-directional: from the gadget to the user ("this is your current list") and from the user to the gadget ("add item X" or "delete item Y").&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Is there such a thing as a gadget mashup? I.e., a gadget which gathers information from more than one webpage? E.g., could I write a gadget which grabbed data from boxofficemojo (box office receipts), rotten tomatoes (movie reviews), and fandango (or some other movie-time site)? &lt;b&gt;YES.&lt;/b&gt; I.e., a gadget is not restricted to only interacting with a single target location, right? &lt;b&gt;YES.&lt;/b&gt; And a gadget can read/write from the network, correct? &lt;b&gt;YES.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;One future thought:&lt;/b&gt; Presently, we think of each OpenSocial app being deployed to a single container (i.e., social network such as Orkut or Linked-In); the next logical step is for an app to work &lt;i&gt;across containers&lt;/i&gt;, i.e., to be a mashup between my Orkut profile/network AND my Linked-In profile/network. Not sure what the OpenSocial API offers w.r.t. this inter-social-network interaction.&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Making Gadgets Accessible and Installing Them&lt;/b&gt;&lt;br /&gt;Examples of gadgets &lt;a href="http://www.google.com/ig/directory" target="_blank"&gt;can be found here&lt;/a&gt;. Enabling the public to use a gadget requires making the gadget world-reachable. There are a couple options for achieving this; a person can host a gadget as part of a website, the same way that he would host an HTML page. Also, Google provides two free alternatives for gadget hosting: (1) the &lt;a href="http://code.google.com/intl/en/apis/gadgets/docs/legacy/gs.html#GGE" target="_blank"&gt;Google Gadget Editor (GGE)&lt;/a&gt; and (2) &lt;a href="http://code.google.com/hosting/" target="_blank"&gt;Google Code Project Hosting&lt;/a&gt;. Once you've built a world-reachable gadget, you can list it in &lt;a href="http://www.google.com/ig/directory?synd=open" target="_blank"&gt;a directory&lt;/a&gt; (which people peruse to find worthwhile gadgets). Then an individual can add your gadget to some webpage (i.e., &lt;i&gt;install the gadget&lt;/i&gt;) by inserting a "script" tag on the given webpage. The script's "src" attribute will point to the given gadget's XML file (i.e., contain that XML file's URL). That URL may also encode display (or other) preferences for the gadget.&lt;br /&gt;&lt;br /&gt;Note that with this approach, one doesn't need to worry that his local version of a gadget (XML file) is out-of-sync with the remote version of the gadget because the user doesn't store the XML file locally but rather points to the remote version. (The user's browser may actually cache a local copy of the gadget when gadget execution is first triggered. But presumably this local copy would be refreshed the next time that the gadget's execution was triggered — which could be mere seconds later.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a name="GadgetPrivileges"&gt;&lt;b&gt;Gadget components&lt;/b&gt;&lt;/a&gt;&lt;div&gt;A gadget specification (or &amp;lt;Module&amp;gt; element in XML) — such as &lt;a href="http://lizstinson.blogspot.com/2009/06/to-do-gadgets-xml-file.html" target="_blank"&gt;this one&lt;/a&gt; — contains a few high-level elements: &amp;lt;ModulePrefs&amp;gt; (encodes gadget properties and preferences, such as the gadget's title, author, desired size), &amp;lt;UserPref&amp;gt;'s (used for persistently storing data and configuring or personalizing a gadget) and &amp;lt;Content&amp;gt; (controls the gadget's operation). &amp;lt;Content&amp;gt; contains HTML which itself can contain JavaScript etc.&lt;br /&gt;&lt;br /&gt;&amp;lt;UserPref&amp;gt; can be used to store application state persistently; e.g., a user's grocery list or preferred background color. The values for user prefs are updated automatically when the user types into the "user preferences edit box" as below with the "Preferences for Rowan" box. When the user interacts with the gadget (entering a grocery item or a URL of a photo), the &amp;lt;UserPref&amp;gt; portion of the gadget's XML file is automatically updated accordingly. That's why, in a gadget's JavaScript code, we won't necessarily see any calls to set(...) preference values. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The code in the gadget's  &amp;lt;Content&amp;gt; section can obtain and use the user's (stored) preferences via the &lt;a href="http://code.google.com/apis/gadgets/docs/reference/#gadgets.Prefs" target="_blank"&gt;gadgets.prefs API&lt;/a&gt;. This API can also be used to programmatically set user preference values (so long as &lt;a href="http://code.google.com/apis/gadgets/docs/fundamentals.html#SetPrefs" target="_blank"&gt;setprefs&lt;/a&gt; is included). E.g., in the below, we see that three user preference variables (myname, myphoto, mychoice) are defined, each as a &amp;lt;UserPref&amp;gt;. The values for those variables are set when the user types into the user preferences edit box ("Preferences for Rowan" in this case) as discussed above. In the &amp;lt;Content&amp;gt; section below, we see JavaScript code that obtains the values of those variables using prefs.getString() and prefs.getBool(); this retrieves the stored value for the named variable. Note that the Prefs API also supports prefs.getInt(). &lt;img src="http://code.google.com/apis/gadgets/images/userprefs_module_new_torn.gif" /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="text-decoration: underline; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;User Prefs section contains&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;UserPref name="&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;myname&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;display_name="Name" default_value="Rowan"/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;UserPref name="&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;myphoto&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;display_name="Photo" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;default_value="http://blah.com/rowan-headshot.jpg"/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;UserPref name="&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;mychoice&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;display_name="Show Photo?" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;datatype="bool" default_value="true"/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Content section contains&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  var prefs = new gadgets.Prefs();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  var html = "hello " + prefs.getString("&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;myname&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;") + "!";&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  if (prefs.getBool("&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;mychoice&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;") == true) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;html += '&amp;lt;img src="' + prefs.getString("&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;myphoto&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;") + '"&amp;gt;';&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For purely programmatic manipulation of user preferences, a gadget might define a method that is invoked &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;onload&lt;/span&gt;; this method would obtain the values of various of the user's preferences and modify the gadget's display accordingly (e.g., setting the background color according to the user's preference). The gadget might also contain a method which stores user preference values; the trigger for this might be &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;onmouseout&lt;/span&gt; (when the mouse moves outside the boundaries of the object) or &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;onblur&lt;/span&gt; (when the object loses focus).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For XML or HTML code (i.e., within the  &amp;lt;ModulePref&amp;gt; or &amp;lt;UserPref&amp;gt; sections OR within the HTML part of the &amp;lt;Content&amp;gt; section), you can obtain a particular user preference value via:  &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;__UP_userpref__&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, where &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;userpref&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; is the name of the desired user preference (e.g. myname, myphoto)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;If you do not want to let a user modify some value and you want to store that value persistently (e.g., the user's high score for a game), you create a UserPref and give it type "hidden." You can modify the value of that variable programmatically, but the user will not be able to modify that variable's value.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Sharing a Gadget and Its Data&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Moreover, one can also have &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;shareable user preferences&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;; e.g., a single list variable that is shared by multiple users (of the same gadget). Then, instead of just the one person modifying the shopping list, multiple users are modifying the same list. It appears that every gadget can by default be shared. That is, every gadget (that I've seen!) has the menu option "Share this gadget." Configuring a gadget to support shareable prefs entails adding &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=" font-weight: bold; line-height: 15px; white-space: pre; "&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;optional feature="shareable-prefs"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. &lt;/span&gt;&lt;span class="Apple-style-span" style=" font-weight: normal; line-height: normal; white-space: normal; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Depending upon a gadget's configurability and whether the user provides input to the gadget in an ongoing basis, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;sharing&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; takes on different meanings.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For a gadget which has minimal configurability and no ongoing user input, there is little real sharing going on since users don't modify or interact with the gadget in any interesting way (there isn't any user-supplied data and hence nothing to share). E.g. the &lt;/span&gt;&lt;a href="http://www.google.com/ig/directory?url=hosting.gmodules.com/ig/gadgets/file/100674619146546250953/wsj.xml" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Wall Street Journal gadget&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; as of time of writing.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For a gadget which has some configurability but minimal ongoing user interaction, there might be the option for a user to "share his configuration settings" with sharees. E.g. the &lt;/span&gt;&lt;a href="http://www.google.com/ig/directory?url=www.amonya.com/igoogle/clock/sclock.xml" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Simple Clock&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; gadget as of time of writing.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For a gadget which has ongoing user interaction, we can not only allow a sharee to "View my content," but we can also allow sharees to "View and edit my content." An example of this are the&lt;/span&gt;&lt;a href="http://www.google.com/ig/directory?url=www.google.com/ig/modules/todo.xml" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; to-do list&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; and &lt;/span&gt;&lt;a href="http://www.google.com/ig/directory?url=www.google.com/ig/modules/sticky.xml" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;post-it note&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; gadgets where each sharer can contribute to a single (shared) list.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Gadget layout on iGoogle&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;One can add a gadget to his iGoogle page or to some other gadget container. On the iGoogle page, by default, the JS for all gadgets appears to run in the same execution context. Each gadget is defined as part of some section via &lt;/span&gt;&lt;a href="http://www.w3schools.com/tags/tag_div.asp" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;the HTML &amp;lt;div&amp;gt; tag&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; as illustrated below. A division can define its own function to be invoked on certain input events, including: onclick, ondblclick, onmousedown, onkeypress, and so on. Hence, if one clicks his mouse while that mouse is within the division for gadget X then gadget X's function for onclick will be invoked (if it exists). Presumably divisions are disjoint portions of the screen real estate, so there is no ambiguity about which division should receive an event. I have 20+ gadgets installed on my iGoogle page and the following HTML code exists for each:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;div id="left_nav_m_110_title" class="gadget_title"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;a id="lnat_110" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;href="#" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;title="To-Do List" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;onclick="_IG_PushHistory('max110', 'selectMod','');return false;"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;gt;To-Do List&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The To-Do list gadget to which I'm referring lives &lt;/span&gt;&lt;a href="http://www.google.com/ig/directory?hl=en&amp;amp;url=www.google.com/ig/modules/todo.xml" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Like all gadgets, it is defined by &lt;/span&gt;&lt;a href="http://lizstinson.blogspot.com/2009/06/to-do-gadgets-xml-file.html" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;an XML file&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Once the gadget has been installed onto a container page (e.g., iGoogle), it generates &lt;/span&gt;&lt;a href="http://lizstinson.blogspot.com/2009/06/some-of-code-which-implements-to-do.html" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;this JavaScript&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Everywhere we see __MODULE_ID__ in the XML file is replaced with a "110" in the installed gadget's JS. This number identifies this particular gadget on my iGoogle page; the naming convention is presumably to ensure that there is no naming conflict with some other gadget's JavaScript function. This is necessary because all of the JavaScript for all of the gadgets on a person's iGoogle page appears to run in the same execution context.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Gadget execution&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;All of the JavaScript for all of the gadgets on a person's iGoogle page appears to run in the same execution context. That is, a gadget is not contained within its own iframe (for which &lt;/span&gt;&lt;a href="http://lizstinson.blogspot.com/2009/06/v8-javascript-virtual-machine.html#V8ExecutionContext" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;a separate execution context&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; would be created) but rather all of the JS of all of the gadgets is in the same HTML page. I actually have the ToDo list gadget installed three different times on my iGoogle page; each version contains a different type of list, one is for personal To-Dos, another for research-related To-Dos, and so on. So that means that my iGoogle page contains three copies of the same functions, each having slightly different names; e.g., loadToDos110, loadToDos117, and loadToDos109, corresponding to gadgets 110, 117, and 109, respectively.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As noted above, part of what spurred this investigation into gadgets was me wondering &lt;i&gt;where&lt;/i&gt; a social networking app executes. And we know that the OpenSocial API (which is implemented by individual social networking sites or &lt;i&gt;containers&lt;/i&gt;, such as Orkut) &lt;i&gt;contains&lt;/i&gt; the gadgets API. So the following is, at present, my best conjecture as to the answer to that question. Let's imagine that Suzy is an Orkut user and installs an app on the Orkut site and gets her five closest Orkut friends to do likewise. When Suzy's browser visits the Orkut site and she logs into her account, presuably the application's JavaScript code is delivered to and executes in Suzy's browser (rather than executing on the Orkut web servers, for example, and just sending Suzy's browser some display code). That application may invoke an OpenSocial API function which itself calls out to the Orkut servers to obtain Suzy's friend list or similar. Think of this as the API function containing an RPC client stub which calls the RPC server, which runs at Orkut. This answers the question about how the OpenSocial API function interacts with the data stored on the Orkut site (i.e., the data that &lt;i&gt;does not&lt;/i&gt; live in Suzy's browser).&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Gadget security&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Evidently there is &lt;/span&gt;&lt;a href="http://code.google.com/apis/gadgets/docs/reference.html#lockeddomain" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;a library&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; that you can include as a "Required feature" of your gadget which"isolates" your gadget from other gadgets running on the same page: the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;locked-domain&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; feature. No details on how this is implemented.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Note that if your gadget requires cookies, you may run into some trouble with IE and Safari. The reason is that a gadget is typically considered a "third party site" because the party hosting the site (e.g., iGoogle) is not the same as the party hosting the gadget (e.g., gadgetsrus.com). So in this scenario, the gadget code is running in an iframe on the iGoogle page. Evidently cookies can only be set for the containing webpage (e.g., iGoogle.com) and it would probably be a security violation to allow gadgetsrus.com to save a cookie for iGoogle.com (could open the door for spoofing attacks etc.). The best solution here would be to enable a cookie to be set for an iframe.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Remote Content&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Can only download from a URL; can't use general sockets API to connect to arbitrary host/port. And even more specifically, the documentation suggests that only website URLs are legitimate (vs. FTP URLs).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a name="GadgetPrivileges"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Gadget privileges&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;Some basic issues in creating a social networking application include identifying the privileges needed by the application in order to serve its purpose and creating an installation and then execution environment (for the app) that confines the app to only access the data it needs and is authorized to access.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The Legacy Gadgets API&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;When I look at the code for several gadgets (NYT, Wikipedia, ToDo list, WSJ, ...), I see several calls to &lt;/span&gt;&lt;a href="http://code.google.com/apis/gadgets/docs/legacy/dev_guide.html" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;the legacy gadgets API&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, as identified by prefix _IG_ and as &lt;/span&gt;&lt;a href="http://code.google.com/apis/gadgets/docs/legacy/reference.html#JS_Ref" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;listed here&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. For example, there are calls to:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_FetchContent&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_FetchXmlContent&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_FetchFeedAsJSON&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : Fetches content at the specified URL then invokes the given callback function upon completion of download.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_GetCachedUrl&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : The passed URL identifies a file that is currently being cached; this function returns the proxy URL for that cached version of the file.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_Analytics&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : Record a page view to a Google Analytics account. There are two arguments: the ID for the Analytics account and the path for the virtual page (whose hit counter should be incremented).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_Prefs&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : For getting/setting UserPref's.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_Tabs&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : Creates new instance of a Tabs object, which itself represents a set of tabs.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_AdjustIFrameHeight&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : Requires the dynamic-height feature.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_RegisterOnloadHandler&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : Pass a callback function that should be invoked when this page has completed loading.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_RegisterMaximizeHandler&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : Presumably this enables setting a callback function for if the given window is maximized.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_DD_Create&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; : &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;So the above were the calls within the XML files that correspond to the different gadgets. When I look at my iGoogle page (the one which references each of these gadgets), I see other invocations of gadgets API functions, including:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_AddEventHandler, _IG_AddModuleEventHandler, _IG_AddCustomEventHandler, _IG_AddDOMEventHandler&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_RemoveDOMEventHandler, _IG_RemoveModuleEventHandler&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_TriggerCustomEvent&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_callPostLoad&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_NavigateToGadget&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_LN_init&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_FormatLeftNavTitles&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_Callback&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_PushHistory&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_SetTitle&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;_IG_DD_init, _IG_DD_open, _IG_DD_create&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Object types: _IG_inlinedTransitionStrategy, _IG_MiniMessage, _IG_iFrameTransitionStrategy, _IG_noMaxSupportTransitionStrategy&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;...&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;a name="GadgetPrivileges"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;References&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;* &lt;/span&gt;&lt;a href="http://code.google.com/apis/gadgets/docs/overview.html" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Gadgets API overview&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;* &lt;/span&gt;&lt;a href="http://code.google.com/apis/gadgets/docs/reference/" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Gadgets API reference&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;* &lt;/span&gt;&lt;a href="http://code.google.com/apis/gadgets/faq.html" target="_blank"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Gadget FAQ&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); &lt;/script&gt; &lt;script type="text/javascript"&gt; try { var pageTracker = _gat._getTracker("UA-10560818-1"); pageTracker._trackPageview(); } catch(err) {}&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4478245028379356028-3035854476356026853?l=lizstinson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lizstinson.blogspot.com/feeds/3035854476356026853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lizstinson.blogspot.com/2009/05/whats-gadget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/3035854476356026853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4478245028379356028/posts/default/3035854476356026853'/><link rel='alternate' type='text/html' href='http://lizstinson.blogspot.com/2009/05/whats-gadget.html' title='What&apos;s a gadget?'/><author><name>Liz Stinson</name><uri>http://www.blogger.com/profile/05671401619658915359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-vZ1R3E3mWGc/TmJlnFgcGiI/AAAAAAAAATY/CHvv0eY9pzw/s220/IMG_0065.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4478245028379356028.post-6696921327811808637</id><published>2009-06-11T13:40:00.000-07:00</published><updated>2009-09-21T10:31:45.055-07:00</updated><title type='text'>V8: JavaScript Virtual Machine</title><content type='html'>&lt;div&gt;The following are some notes from talks given about V8, which is Google's JavaScript virtual machine. These talks focus on a few main features which led to V8's performance advantages over the competition: (1) hidden classes, (2) generation of native code, and (3) inline caching. Hidden classes are V8's way of enforcing some order on the chaos that is JS dynamism. These notes are offered as-is; any mistakes are most certainly mine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The three talks are:&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/06/v8-javascript-virtual-machine.html#LarsSept2008"&gt;Lars Bak on V8&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt; (September 2008)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/06/v8-javascript-virtual-machine.html#MillikinSept2008"&gt;Kevin Millikin on V8&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt; (September 2008)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; * &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;a href="http://lizstinson.blogspot.com/2009/06/v8-javascript-virtual-machine.html#LarsApril2009"&gt;Lars Bak on V8&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt; (April 2009)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Miscellaneous facts about V8&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Functions compiled JIT-style; if never invoke a function, it will never be compiled (lazy compilation).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It generates machine code for two architectures: x86 and ARM (the latter of which is used in mobile phones).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It's open-source.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The V8 JavaScript library is implemented in JavaScript (in contrast to being implemented in the VM); this has several benefits: (1) easier to change and extend the library, (2) don't have to know VM internals to read/understand/modify JS library function implementations, (3) enables them to capitalize on the performance of the JS compiler (and on improvements therein). The drawback is that startup time is 30 ms (for a new tab); they have some solution which entails dumping the heap contents. Not sure how this works but it brings startup time to 4 — 8 ms.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In V8's hidden classes, the following two functions (or object prototypes) are not treated as identical:&lt;br /&gt;&lt;br /&gt;function Point( x, y ) { this.x = x; this.y = y; }&lt;br /&gt;function Point( x, y ) { this.y = y; this.x = x; }&lt;br /&gt;&lt;br /&gt;That is, the order in which properties are defined matters.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a name="LarsSept2008"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Lars Bak on V8&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt; (September 2008)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hWhMKalEicY&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/hWhMKalEicY&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div&gt;V8 compiles JavaScript to native machine code, in contrast to previous implementations of JS (interpreters). Lars Bak talks about V8 in a couple different videos. Summarized here are the presented advances. V8...&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Uses hidden classes.&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;In most JS implementations, if there are two objects of the same type, the representations of those objects are independent of one another; i.e., it's not clear that the objects share lineage. In V8, they introduce &lt;i&gt;hidden classes&lt;/i&gt;, where a hidden class captures the property/method structure of an object so that all instances of that object point to that hidden class. Conceptually, this is not dissimilar from how classes with an inheritance relationship are represented in C++ (as discussed &lt;a href="http://lizstinson.blogspot.com/2009/06/javascript-interpreter-vm-etc.html#ExamplesOfDynamicDispatch" target="_blank"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Their use of hidden classes enables them to generate native machine code for a JavaScript pointer dereference (i.e., accessing an object property) by regularizing the structure of how objects are stored. The alternative (as is done in precursor JavaScript implementations) is to resolve that property through a comparatively expensive run-time lookup.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Generates native machine code.&lt;br /&gt;&lt;br /&gt;Their generation of native machine code to perform method and property lookup for an object results in fast execution. They compound the effects of this by caching such native machine code translation (of a line in a JavaScript program) and re-using the cached machine code rather than retranslating that line every time. This is the inline caching technique discussed &lt;a href="http://lizstinson.blogspot.com/2009/06/javascript-interpreter-vm-etc.html#InlineCaching" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Does garbage collection (memory management generally) more efficiently.&lt;br /&gt;&lt;br /&gt;Their goal was fast allocation and to eliminate garbage collection pauses, which can interfere with a program's interactivity. They achieved this by implementing a garbge collector that reclaims objects (from the global object heap) incrementally as the script executes. More on garbage collection &lt;a href="http://www.google.com/googlebooks/chrome/small_16.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a name="MillikinSept2008"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Kevin Millikin on V8&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt; (September 2008)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lZnaaUoHPhs&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/lZnaaUoHPhs&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Motivation for Google Chrome and creating a new JavaScript implementation: in 2006, JS implementation didn't scale in the # of lines of code or in the # of objects created. The basic design ideas discussed (the same as those introduced &lt;a href="http://lizstinson.blogspot.com/2009/06/v8-javascript-virtual-machine.html#LarsSept2008"&gt;above&lt;/a&gt;):&lt;div&gt;&lt;div&gt;* Hidden classes and hidden class transitions&lt;/div&gt;&lt;div&gt;* Inline caching&lt;/div&gt;&lt;div&gt;* Compilation to native code&lt;/div&gt;&lt;div&gt;* Efficient memory management system&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The basic intuition on how to make JS faster was to bring order to chaos, in particular to the objects portion of JS, which enables objects to be created on the fly, properties/methods added/removed on the fly, etc. Another complicating factor was JS's support of duck typing, which meant that when a line of JS entailed an access of an object property (e.g., &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;val.x&lt;/span&gt;), the actual object used as &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;val&lt;/span&gt; (at run-time) could be any object at all (in contrast to languages which have stricter typing policies). This complete lack of information meant that every access of a property or method involved hash table lookup(s), which are expensive compared to array dereferences. So the idea was to find a way to categorize JS objects into classes; this would allow them to apply well-known performance optimization techniques from class-based language implementations.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In statically-typed object-oriented languages — those for which most type checking is done at compile time — (e.g., Java and C++), we know the layout of an object at compile time. So, accessing an object property value is just like an array access. Same is true for methods; the address of the actual method may be unknown (at compile time) but we know the location of a pointer which will hold the address of that method at run-time. By contrast, in JavaScript, there are no classes. So when see a particular object access at some point in a program, don't know (a) if that object even has that property, (b) if it does have the property, where that property is located. Resolving these questions in previous JS implementations entailed performing hash table lookup(s). Their solution: hidden classes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;V8's Hidden Classes&lt;/b&gt; (minutes 10:22 to 26:50)&lt;/div&gt;&lt;div&gt;We've discussed the motivations for representing the shared structure of objects (e.g., two instances of the same Point object). Now let's look at how this is done. Imagine we have the following code (explanation starts at minute 13:15):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;function Point( x, y ) { &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;// line 1&lt;/div&gt;&lt;div&gt;  this.x = x;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;// line 2&lt;/div&gt;&lt;div&gt;  this.y = y;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;// line 3&lt;/div&gt;&lt;div&gt;}&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;// line 4&lt;/div&gt;&lt;div&gt;var p = new Point(0,1);&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// line 5&lt;/div&gt;&lt;div&gt;var q = new Point(2,3);&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// line 6&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When V8 encounters line 5 — which is the first instantiation of a Point object — it will look for a hidden class associated with Point. If it doesn't find one (which it won't in this case), it will create one. V8 will create a structure representing p and it will create a series of hidden classes. The first hidden class (class 0) is created after executing just the first line of the Point class; hence, class 0 has no properties. Then V8 encounters line 2 and so it &lt;i&gt;creates a new hidden class&lt;/i&gt; (class 1) which has property x; there is a transition (pointer) from class 0 to class 1. Then V8 encounters line 3 and so V8 creates a new hidden class (class 2) with properties x and y; then V8 creates a transition (pointer) from class 2 to class 3. Finally, the p object has its values for properties x and y populated in its own data structure; then there is a pointer from the p data structure to the hidden class representing Point (which is class 2).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Two natural questions arise when considering the above:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Why create separate classes (class 0, 1, and 2) rather than just creating a single class and appending all properties to it?&lt;/li&gt;&lt;li&gt;Why keep the earlier versions of the Point class (0 and 1) around?&lt;/li&gt;&lt;/ol&gt;(I don't have any answers for these questions, yet.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;V8's Inline caching&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Every property access (reading a property, writing a property, invoking a function) "is governed by an inline cache stub." An inline cache stub is a little block of machine code; control is transferred to such a stub whenever there is a property access. My sense is that each of the stubs used is different from the others; i.e., the stub code is not &lt;i&gt;generic&lt;/i&gt; but rather is tailored to the particular property accessed at some site. And for the actual story... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An inline cache stub is in one of four states:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Uninitialized&lt;/b&gt;: this is a generic stub.&lt;br /&gt;&lt;br /&gt;We're in this state when we've never seen any object at a property access site (which is just another way of saying: when this particular property access at this particular code location has never been exercised). This stub does a dynamic lookup; once that lookup is complete, this stub rewrites the call to the inline cache stub to be a call to a different stub, the pre-monomorphic one.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Pre-monomorphic&lt;/b&gt;: this is a generic stub.&lt;br /&gt;&lt;br /&gt;This also performs a run-time lookup then rewrites the 
