<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>The Lab</title>
    <link>http://www.mediamolecule.com/lab/</link>
    <description />
    <dc:language>en</dc:language>
    <dc:creator>ChrisC</dc:creator>
    <dc:rights>Copyright Media Molecule Ltd 2011</dc:rights>
    <pubDate>Tue, 30 Aug 2011 12:09:55 GMT</pubDate>
    
     <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MmLab" /><feedburner:info uri="mmlab" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
    <title>Spending Your Cache Wisely</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/BPqusVaKnQo/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/spending_your_cache_wisely/#id:2174#date:12:09</guid>
    <description>&lt;p&gt;Back in the day, computers were much simpler things. They had a CPU and they had some memory. Getting data to/from memory took a fairly reliable amount of time, and when optimising you’d just try to make sure that memory speed wasn’t the block in the pipeline that caused your application to slow down. Today however, things have changed, primarily due to the fact that CPUs have gained speed at a much faster rate than memory has. Where a CPU might go up in speed by 10x over a few years, the speed of the memory it’s paired with might go up by just 3x, making it become a much larger culprit for slowing games down&amp;#8230;
&lt;/p&gt;&lt;p&gt;The hardware solution to this is the use of caches – a small amount of super fast (and pricey) memory that sits in between the main CPU and RAM. A cache is made up of a set of small cache lines (usually 128 bytes) that at any point in time represent some 128 byte block of main memory. Cache lines can be flushed back to RAM (writing back any changes to the memory they represent), and read from RAM (refreshing or loading a new cache line from memory). It’s the hardware’s responsibility to keep the memory and the cache in sync, and make sure the bits of memory of you want to fiddle with are in the cache.&lt;/p&gt;

&lt;p&gt;Nowadays when you read/write memory you’re really reading/writing what is in the cache. This is exceedingly quick (generally on the same scale as the cost of a few instructions). However, if you attempt to read/write data that isn’t in the cache, the CPU must stall, flush a bit of the cache that’s not been used for a while back to memory, and replace it with the memory you want to read/write. It’s not uncommon for the cost of accessing memory that isn’t in the cache to be 30x the cost of your average instruction!&lt;/p&gt;

&lt;p&gt;So lets jump straight into some code&amp;#8230;&lt;br /&gt;
 
&lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;code class="lang-c"&gt;
struct Person
{
       char Name[58];
       int FavouritePrimeNumber;
 
       Person() : FavouritePrimeNumber(0) { Name[0] = 0; }
};
int NumPeople = 0;
Person GPeople[1000];
 
Person* AddPerson(const char* name, int favourite_prime_number)
{
       strcpy(GPeople[NumPeople].Name, name);
       GPeople[NumPeople].FavouritePrimeNumber = favourite_prime_number;
       NumPeople++;
}
 &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;
This type of code should be fairly familiar to any games programmer. We’ve got a nice big buffer to store people in (in this case their name and favourite prime number). The AddPerson function simply inserts a new entry and increments the NumPeople counter. In this case I’ve conveniently made the Person structure be 64 bytes, so we can fit 2 people in a 128 byte cache line.&lt;br /&gt;
 
Now suppose our game wants to inspect a property of the people – what if we want to know the biggest favourite prime number&amp;#8230;&lt;br /&gt;
 
&lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;code class="lang-c"&gt;int GetBiggestFavouritePrimeNumber()
{
       int biggest = 0;
       for(int i = 0; i &lt; NumPeople; i++)
              if(GPeople&lt;i&gt;.FavouritePrimeNumber &gt; biggest)
                     biggest = GPeople&lt;i&gt;.FavouritePrimeNumber;
       return biggest;
}
 &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;
That all works fine. We iterate over all the added people and track the largest chosen number. However, this article is about memory access, so let’s look at how much data has to be read from memory. FavouritePrimeNumber is a 4 byte integer, so you might be forgiven for assuming that the total memory read is:&lt;br /&gt;
 
&amp;nbsp;  &amp;nbsp;   Total read (in bytes) = NumPeople * sizeof(int) = NumPeople * 4&lt;/p&gt;&lt;/lang&gt;&lt;/pre&gt;&lt;p&gt;
 &lt;br /&gt;
&lt;strong&gt;Wrong!&lt;/strong&gt; Think back to how a cache works. On a modern platform there is no such thing as reading a few bytes – if the data you want isn’t in the cache, you need to load the entire cache line. In hardware, the loop will actually do something like:&lt;br /&gt;
 
1.&amp;nbsp;  &amp;nbsp;   Read GPeople[0].FavouritePrimeNumber – load the whole 128 byte cache line containing GPeople[0] (costs about 30 instructions worth of time)&lt;br /&gt;
2.&amp;nbsp;  &amp;nbsp;   Read GPeople[1].FavouritePrimeNumber – it’ll already be in the cache as it’s in the same line as GPeople[0] (pretty fast)&lt;br /&gt;
3.&amp;nbsp;  &amp;nbsp;   Read GPeople[2].FavouritePrimeNumber – load the whole 128 byte cache line containing GPeople[2] (costs about 30 instructions worth of time)&lt;br /&gt;
4.&amp;nbsp;  &amp;nbsp;   Etc etc ....&lt;br /&gt;
 
When we want to read that 4 byte property of a person, we’re having to actually get the entire person from memory into the cache before doing so. As a result, from the hardware’s point of view GetBiggestFavouritePrimeNumber has to read 64 bytes just to get at that 4 byte integer!&lt;br /&gt;
 
So how to fix this? Well, it all depends on what you want to do regularly with your data. If in my game I very regularly needed to get the biggest favourite prime number from a large set of people then I might re-organise data as follows:&lt;br /&gt;
 
&lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;code class="lang-c"&gt;struct Person
{
       char Name[58];
       Person() { Name[0] = 0; }
};
int NumPeople = 0;
int GFavouritePrimeNumbers[1000];
Person GPeople[1000];
 
Person* AddPerson(const char* name, int favourite_prime_number)
{
       strcpy(GPeople[NumPeople].Name, name);
       GFavouritePrimeNumbers[NumPeople] = favourite_prime_number;
       NumPeople++;
}
 
int GetBiggestFavouritePrimeNumber()
{
       int biggest = 0;
       for(int i = 0; i &lt; NumPeople; i++)
              if(GFavouritePrimeNumbers&lt;i&gt; &gt; biggest)
                     biggest = GFavouritePrimeNumbers&lt;i&gt;;
       return biggest;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I’ve updated the code so the favourite prime numbers are stored in a separate array that I can iterate over nice and quickly (the technical name for this is SOA – structure-of-arrays, as opposed to AOS – array-of-structures). An int is only 4 bytes, which means the GetBiggestFavouritePrimeNumber now only has to load a new cache line for every 32nd person! Given memory was almost certainly the blocker in the pipeline here, my code now runs at roughly 16x its original speed!&lt;/p&gt;

&lt;p&gt;The moral of the story - avoid loading data into the cache that you don’t need. Or to put it another way, &lt;strong&gt;spend your cache wisely :)&lt;/strong&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=BPqusVaKnQo:qwgdcEdFpbA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=BPqusVaKnQo:qwgdcEdFpbA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=BPqusVaKnQo:qwgdcEdFpbA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=BPqusVaKnQo:qwgdcEdFpbA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=BPqusVaKnQo:qwgdcEdFpbA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=BPqusVaKnQo:qwgdcEdFpbA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=BPqusVaKnQo:qwgdcEdFpbA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=BPqusVaKnQo:qwgdcEdFpbA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/BPqusVaKnQo" height="1" width="1"/&gt;</description>
    
    <category>Code</category>
    <pubDate>Tue, 30 Aug 2011 12:09 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/spending_your_cache_wisely/</feedburner:origLink></item> <item>
    <title>Two Uses of Voxels in LittleBigPlanet 2’s Graphics Engine - Anton and Alex at Siggraph 2011</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/WsLu7kmUAuQ/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/two_uses_of_voxels_in_littlebigplanet_2s_graphics_engine_-_anton_and_a/#id:2172#date:11:30</guid>
    <description>&lt;p&gt;Alex recently voyaged over land and sea to attend &lt;a href="http://www.siggraph.org/s2011/" title=""&gt;Siggraph 2011&lt;/a&gt; in Vancouver. There he &lt;a href="http://advances.realtimerendering.com/s2011/index.html"&gt;gave a talk&lt;/a&gt; entitled &amp;#8216;Two Uses of Voxels in LittleBigPlanet2’s Graphics Engine&amp;#8217; as part of the Advances in Real-Time rendering in 3D Graphics and Games course.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://advances.realtimerendering.com/s2011/index.html" title=""&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/voxels.png" alt="Oooooh!" width="640" height="360" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://advances.realtimerendering.com/s2011/Evans,%20Kirczenow%20-%20Voxels%20in%20LBP2%20(Siggraph%202011%20Advances%20in%20Real-Time%20Rendering%20Course).pdf"&gt;slides from that talk&lt;/a&gt; are now available to interested people,&amp;nbsp; &lt;a href="http://advances.realtimerendering.com/s2011/index.html" title=""&gt;along with some other talks on the same subject matter too, from Bungie, Crytek, EA and DICE&lt;/a&gt;!
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=WsLu7kmUAuQ:rmNHFrIbTL4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=WsLu7kmUAuQ:rmNHFrIbTL4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=WsLu7kmUAuQ:rmNHFrIbTL4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=WsLu7kmUAuQ:rmNHFrIbTL4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=WsLu7kmUAuQ:rmNHFrIbTL4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=WsLu7kmUAuQ:rmNHFrIbTL4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=WsLu7kmUAuQ:rmNHFrIbTL4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=WsLu7kmUAuQ:rmNHFrIbTL4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/WsLu7kmUAuQ" height="1" width="1"/&gt;</description>
    
    <category>Code</category>
    <pubDate>Wed, 24 Aug 2011 11:30 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/two_uses_of_voxels_in_littlebigplanet_2s_graphics_engine_-_anton_and_a/</feedburner:origLink></item> <item>
    <title>Using EBS Snapshots with Fog</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/k7nLDDMa8VM/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/using_ebs_snapshots_with_fog/#id:2162#date:12:41</guid>
    <description>&lt;p&gt;Making use of Amazon for our server hosting gives us access to a host of neat features that allow us to do good stuff with our server environments.&lt;/p&gt;

&lt;p&gt;We make use of a feature in Amazon called EBS (Elastic Block Store), you can think of it like a hard drive that exists on the network. While it is true there has been a lot of doom and gloom surrounding the EBS devices (&lt;a href="http://aws.amazon.com/message/65648/"&gt;http://aws.amazon.com/message/65648/&lt;/a&gt;) they can give you some advantages if you are careful how you use them.&lt;/p&gt;

&lt;p&gt;One of those advantages is the ability to create snapshots and then create new EBS volumes based on those snapshots. Snapshots are quite quick to take, get saved in S3 (Amazons Simple Storage Service) and protect the data for long term durability. Using these techniques you could quickly copy data from one environment to another, for example from your production to staging environments. Or while snapshots are *not* a backup solution, you could snapshot a volume, create a new volume from the snapshot, attach it to a machine and take a backup from that volume. Allowing you to backup from a certain point of time without affecting the running of the main server (of course depending on your applications and technologies this may not be appropriate and you might need to take extra steps to ensure you got a consistent data backup).
&lt;/p&gt;&lt;p&gt;Lets take a look at how snapshots can be taken, since server side we&amp;#8217;re mostly a ruby shop, we&amp;#8217;ll use ruby and the fog library (&lt;a href="http://fog.io"&gt;http://fog.io&lt;/a&gt;). Fog will be used to interact with the Amazon API.&lt;/p&gt;

&lt;p&gt;The steps are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect to the region in AWS where we want to snapshot the volumes&lt;/li&gt;
&lt;li&gt;Get a list of the volumes to snapshot&lt;/li&gt;
&lt;li&gt;Create the snapshots for each volume&lt;/li&gt;
&lt;li&gt;Tag the snapshots with an id and the type of snapshot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First off we connect to AWS and get a list of our volumes:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code class="lang-ruby"&gt;
# Load up fog and an internal library to handle loading in AWS keys
require 'fog'
require 'access_control'

# Load in AWS IAM user credentials
fog_creds = MM::AccessControl.new('production', 'snapshot')

region = 'eu-west-1'
# Make a connection to AWS
@fog = Fog::Compute.new(:provider =&gt; 'AWS', :region =&gt; region, :aws_access_key_id =&gt; fog_creds.access, :aws_secret_access_key =&gt; fog_creds.secret)

# Grab an unfiltered list of all of the volumes
volumes  = @fog.volumes.all
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Now we&amp;#8217;ve got the volumes we can run through them all creating a snapshot from them. Snapshots need a few bits of information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Volume id to take the snapshot from&lt;/li&gt;
&lt;li&gt;Description of the snapshot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the same time we will assign a tag. The tags in amazon are handy identifying resources or adding other bits of information. &lt;/p&gt;

&lt;p&gt;So using the volume list that we have taken, we could use the following sort of code to take snapshots of the attached volumes:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code class="lang-ruby"&gt;
# Set up a time stamp for naming the snapshots
t = Time.now
stamp = t.strftime("%Y%m%d.%M%H")
day = t.strftime("%Y%m%d")

volumes.each do |vol|
  # Skip volumes with no attachment. Each attached volume will have a server_id
  next if vol.server_id.nil?

  description = "#.#"

  # Create a new snapshot transaction. It needs a description and a volume id to snapshot
  snapshot = @fog.snapshots.new
  snapshot.description = "#"
  snapshot.volume_id = vol.id

  # Now actually take the snapshot
  snapshot.save

  # To tag the snapshot we need the snapshot id, so reload the snapshot info to get it
  snapshot.reload

  # To tag something you need a key, value and resource id of what you want to tag
  # In this example we will demonstrate tagging just by creating a tag called "SnapshotDate" and applying the current YYMMDD to it.
  # This tag is slightly redundant as amazon gives you the time the snapshot was started at, but shows an example of how to tag
  @fog.tags.create(:resource_id =&gt; snapshot.id, :key =&gt; "SnapshotDate", :value =&gt; day)

  # To add more tags simply make another tagging call
  @fog.tags.create(:resource_id =&gt; snapshot.id, :key =&gt; "TakenBy", :value =&gt; 'snapshot user')
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Awesome, we can now take snapshots. Our next step is to clean this code up, put it into a script and run it on a regular basis. Now we&amp;#8217;ve got a service that is creating snapshots for us every hour, we quickly notice that our snapshot count is growing quickly, we need to clean up old snapshots.&lt;/p&gt;

&lt;p&gt;We might decide that we only want to keep the last 8 hours of snapshots, and that everything else before that isn&amp;#8217;t required. To clean up the snapshots we&amp;#8217;d want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect to AWS&lt;/li&gt;
&lt;li&gt;Get a list of all the snapshots&lt;/li&gt;
&lt;li&gt;Check the time the snapshot was created at&lt;/li&gt;
&lt;li&gt;Delete it if it is over 8 hours old&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="prettyprint"&gt;&lt;code class="lang-ruby"&gt;
# Assuming we have connected to AWS and have a @fog connection object
# Also we assume that as part of our snapshot script we decided to tag the snapshots as hourly

# Grab the hourly tags, we do this by applying a filter against a tags search
tags = @fog.tags.all(:key =&gt; "SnapshotType", :value =&gt; "hourly")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Now we can load the snapshot information for each of the tags, check the time, and delete if required:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code class="lang-ruby"&gt;
# Time limit in hours
time_limit = 8

# Current time
t = Time.now

tags.each do |tag|
  # The resource_id of the tag equates to a snapshot so we can load the snapshot information
  snapshot = @fog.snapshots.get(tag.resource_id)

  # Using the current time and the time when the snapshot was created we can work our out the age of the snapshot
  age = t.to_i - snapshot.created_at.to_i
  hours = age / 60 / 60
 
  # Finally delete the snapshot if it is too old. Deleting a snapshot requires the snapshot id
  if hours &gt; time_limit
    @fog.delete_snapshot(snapshot.id)
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
This example code should then remove all of your old snapshots. Again we&amp;#8217;d want to clean this up, put it into a script and have it running on a daily basies.&lt;/p&gt;

&lt;p&gt;In a future post I&amp;#8217;ll talk about how to use these snapshots to create new EBS volumes in the same, or a different, AWS account.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=k7nLDDMa8VM:fwSTvS3V6f0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=k7nLDDMa8VM:fwSTvS3V6f0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=k7nLDDMa8VM:fwSTvS3V6f0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=k7nLDDMa8VM:fwSTvS3V6f0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=k7nLDDMa8VM:fwSTvS3V6f0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=k7nLDDMa8VM:fwSTvS3V6f0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=k7nLDDMa8VM:fwSTvS3V6f0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=k7nLDDMa8VM:fwSTvS3V6f0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/k7nLDDMa8VM" height="1" width="1"/&gt;</description>
    
    <category>Code</category>
    <pubDate>Mon, 01 Aug 2011 12:41 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/using_ebs_snapshots_with_fog/</feedburner:origLink></item> <item>
    <title>Doing exactly the right amount of work</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/onDQ_E7cAuk/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/doing_exactly_the_right_amount_of_work/#id:2159#date:14:57</guid>
    <description>&lt;p&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/chris.png" alt="Oooooh!" width="300" height="300" align="right" /&gt;The other day I was writing some code that needed to build up a list of strings in a large file, and identify any duplicates that occurred. On average, the file would contain about 10000 unique strings, and I’d be looking at finding at least 500 duplicates per string. That means that throughout the parsing of my file, I’d have to add about 10000 strings to the list, and probably do about 5000000 lookups on them. This needed to be a fast process&amp;#8230;&lt;/p&gt;

&lt;p&gt;This blog entry is about an awesome trick that Mr Alex Evans taught me when I went and asked him for advice about this problem. It’s such a good lesson I thought I’d write it up and shove it on the blog. I’d come up with various ways I could approach this – hash tables, maps, binary trees, specialised string trees and couldn’t pick how to attack it. His advice was &lt;strong&gt;that if an algorithm can do anything at all that you don’t need it to do, it’s probably slower than it needs to be&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A perfect solution to a problem will do exactly what it needs to – no more, no less. That way you know that even if the code isn’t perfectly optimised, it’s not spending time doing things it doesn’t need to. It occurred to me that even nature follows this approach – a perfectly evolved creature for some scenario will be exactly as good as it needs to be at things – anything extra is a waste of valuable resources. Cheetahs don’t run at 150mph because 70mph is enough! Clearly it’s a good way of thinking of things, so I set about this approach for my string searching.&lt;/p&gt;

&lt;p&gt;First, my requirements:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I only ever add to the list – I never remove&lt;/li&gt;
&lt;li&gt;I never need to extract any sorted data from it or anything fancy like that&lt;/li&gt;
&lt;li&gt;I never need to iterate over the list&lt;/li&gt;
&lt;li&gt;I’m going to be doing on average 500 times more lookups than I am adds, and the majority are likely to be successful (i.e. they will find an entry)&lt;/li&gt;
&lt;li&gt;The strings themselves will always be in memory (as they’re loaded when I load the file), so they don’t need copying when adding&lt;/li&gt;
&lt;li&gt;I have loads and loads of memory to burn!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
 &lt;br /&gt;
I started off with a std::map, which could do:&lt;br /&gt;
Adds, gets, deletes
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Any sort of types for the key and value, with any sort of comparison function&lt;/li&gt;
&lt;li&gt;Easy iteration of the list&lt;/li&gt;
&lt;li&gt;Easy extraction of sorted data from the list&lt;/li&gt;
&lt;li&gt;Automatically manages memory allocation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clearly the map does way too much – it supports lots of operations I don’t need, and can deal with any arbitrary types, whereas I just need a null terminated string for a key and a single unsigned int for the value. To cut a long story short, after several rounds of following Alex’s advice, I found myself with:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A custom hash table – uses a very simple 64 bit hash algorithm on the string, then uses the bottom 20 bits as an index into a table&lt;/li&gt;
&lt;li&gt;Each entry in the table is a list of strings, their full 64 bit hash, their length, and their corresponding unsigned int.&lt;/li&gt;
&lt;li&gt;This means my lookups can identify mismatches very fast – only in the event of 2 strings having exactly the same hash and length will I need to do an actual strcmp to verify they’re identical. The odds are I’ll end up doing 1 strcmp per lookup&lt;/li&gt;
&lt;li&gt;All memory in the table is allocated linearly in one big mega chunk (which gets bigger if it really has to). This avoids lots of dynamic allocation, but prevents me being able to delete things.&lt;/li&gt;
&lt;li&gt;Specialised to deal with strings + unsigned ints – doesn’t handle arbitrary class types at all&lt;/li&gt;
&lt;li&gt;It’s only 150 lines of code&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;The result – parsing my file and doing all the string lookups goes from 22.5s to 1.8s.&lt;br /&gt;
 
Anyway, the moral of the story and the lesson this blog post is all about:&lt;br /&gt;
 
&lt;/p&gt;&lt;h4&gt;If an algorithm is capable of more than it needs to be, it’s probably doing more work than it needs to!&lt;/h4&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=onDQ_E7cAuk:zoT4uOpFtvI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=onDQ_E7cAuk:zoT4uOpFtvI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=onDQ_E7cAuk:zoT4uOpFtvI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=onDQ_E7cAuk:zoT4uOpFtvI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=onDQ_E7cAuk:zoT4uOpFtvI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=onDQ_E7cAuk:zoT4uOpFtvI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=onDQ_E7cAuk:zoT4uOpFtvI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=onDQ_E7cAuk:zoT4uOpFtvI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/onDQ_E7cAuk" height="1" width="1"/&gt;</description>
    
    <category>Code</category>
    <pubDate>Mon, 25 Jul 2011 14:57 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/doing_exactly_the_right_amount_of_work/</feedburner:origLink></item> <item>
    <title>Shaun and Vivi’s project</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/6jQy_PrWLXA/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/shaun_and_vivis_project/#id:2013#date:11:28</guid>
    <description>&lt;p&gt;Shaun and his partner Vivi have embarked upon &lt;a href="http://www.flickr.com/photos/marksjo_and_elstob/" title=""&gt;a new art project!&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;These photos are an ongoing project that extends our interests first developed in a series of video/gallery installations begun in 2005.&amp;nbsp; We&amp;#8217;re fascinated by the potential for confusion, discomfort and other emotional responses to environments (and images of environments) that blur the distinction between actuality and simulation.&amp;nbsp; In these photographs we&amp;#8217;re using commercially available doll&amp;#8217;s house furniture, which are carefully painted, composed and lit, combined with other &amp;#8220;found&amp;#8221; bits and pieces.” &lt;/p&gt;&lt;/blockquote&gt;

&lt;div class="center"&gt;&lt;p&gt; &lt;a href="http://www.flickr.com/photos/marksjo_and_elstob/" title=""&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/4516067290_d7417f17c1.jpg" alt="Oooooh!" width="500" height="332" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/marksjo_and_elstob/" title=""&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/4540634370_22ab05452f.jpg" alt="Oooooh!" width="500" height="326" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/marksjo_and_elstob/" title=""&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/4571507404_ba8bbe57f3.jpg" alt="Oooooh!" width="500" height="332" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=6jQy_PrWLXA:5eBDYsmHT-4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=6jQy_PrWLXA:5eBDYsmHT-4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=6jQy_PrWLXA:5eBDYsmHT-4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=6jQy_PrWLXA:5eBDYsmHT-4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=6jQy_PrWLXA:5eBDYsmHT-4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=6jQy_PrWLXA:5eBDYsmHT-4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=6jQy_PrWLXA:5eBDYsmHT-4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=6jQy_PrWLXA:5eBDYsmHT-4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/6jQy_PrWLXA" height="1" width="1"/&gt;</description>
    
    <category>Art</category>
    <pubDate>Tue, 04 May 2010 11:28 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/shaun_and_vivis_project/</feedburner:origLink></item> <item>
    <title>Tetris on the ceiling: chapter 1</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/uxBviuIrjRk/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/tetris_on_the_ceiling_chapter_1/#id:2002#date:14:29</guid>
    <description>&lt;p&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/the-shining-sequel_thumb.jpg" alt="Oooooh!" width="230" height="340" class="floatleft"/&gt;Mm is excited to be moving towers soon, to a new shiny office inside a new shiny tower… and in the new tower, for reasons too pedestrian to recount here, the boring standard office ceiling tiles are being replaced with clear acrylic ones. This, of course, is awesome. But in what particular way? &lt;/p&gt;

&lt;p&gt;Over a few cocktails and glasses of champagne at Guildford’s entirely un-legendary and slightly creepy The-Shining-esque hotel-bar-blue-light-travelling-salesman-horror-venue ‘The Mandolay’, the Molecules put their heads together. ‘What’, slurred Paul ‘Aggie’ Davis, ‘about adding coloured lights above the tiles?’&lt;br /&gt;
 &lt;br /&gt;
What indeed! I feel a lab project coming on&amp;#8230;&lt;/p&gt;

&lt;p&gt;A little drunken 3 am googling session later, whilst contemplating how one might wire up and control 2000 ceiling tiles with coloured lights, I discovered this rather wonderful chip: &lt;a href="http://www.allegromicro.com/en/Products/Part_Numbers/6281/6281.pdf"&gt;the Allegro A6281&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Are all my dreams answered?
&lt;/p&gt;&lt;p&gt; 
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;PWM brightness controller with constant current LED output stage? CHECK. &lt;/li&gt;
&lt;li&gt;Serial input of data to reduce number of wires? CHECK. &lt;/li&gt;
&lt;li&gt;Really simple to wire up because I’ve forgotten all my electronics? CHECK. &lt;/li&gt;
&lt;li&gt;Easy to solder&amp;#8230;. oh wait its surface mount only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never mind! It was late, I was drunk, details like circuit boards et al can be sourced later. Next: LEDs! Oh wait, no-body seems to want to supply LEDs to me in Europe, much less tell me which of the bewildering LED selection available on the whole of the internet’s six billion pages to order. Curses.&lt;br /&gt;
 &lt;br /&gt;
But then&amp;#8230; America saved my ass. Specifically Macetech and their oh-my-god-it-was-made-for-me-surely-this-is-too-good-to-be-true, &lt;a href="http://www.macetech.com/blog/node/54"&gt;shiftbrite product&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Basically, shiftbrite is a cute little, 1 inch by 1inch, mini prefabricated circuit board with a little RGB LED and one of those Allegro chips all wired up and ready to go. On two of its edges are six pins, just like the ones you plug PC cpu fans into on your motherboard, to allow you to chain them together like fairy lights. Then you plug one end into a COMPUTER MACHINE, some JUICY FAT POWER, and it can control all the lights to be any colour you want. Witness 81 one of them gaffer taped to an ikea coffee table. so much win, we had to have them.&lt;/p&gt;

&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/C7aUaMiqoIE&amp;amp;hl=en_GB&amp;amp;fs=1&amp;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/C7aUaMiqoIE&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;
 &lt;br /&gt;
At this point, excitement was brewing. Ideas were flowing. If we could light all 2000 tiles of our ceiling under computer control, we’d essentially have a huge crazy RGB display on the ceiling… we could animate it in any way we wanted, we could run movies on it… we could play games on it… tetris or pong across the ceiling.&amp;nbsp; If someone broke the build, we could put a red light explosion above their desk. What else could we do?&lt;br /&gt;
 &lt;br /&gt;
An order for eight was made, and duly despatched. Maplin was raided for parallel port bits, my dodgy soldering iron was dug up, and this entirely safe monstrosity was created:&lt;br /&gt;
 &lt;br /&gt;
&lt;img src="http://www.mediamolecule.com/images/uploads/ceiling1_thumb.jpg" alt="Oooooh!" width="640" height="480" /&gt;&lt;br /&gt;
 &lt;br /&gt;
(Where Aggy found a pc with a working parallel port in 2010 is another story – but that’s what IT managers do, right? Find stuff that no-one else can find. It’s a kind of genius) The plan was, rather than using a fancy microcontroller as macetech advise, we’d plug eight chains of LEDs into the eight data pins of a linux based pc’s parallel port, and then use all the power of the pc to generate and play ‘awesome stuff’ over the internets.&lt;br /&gt;
 &lt;br /&gt;
A few lines of dodgy C later, we had the first 8 lights up and running:&lt;br /&gt;
 &lt;br /&gt;
&lt;img src="http://www.mediamolecule.com/images/uploads/image001_thumb.jpg" alt="Oooooh!" width="640" height="479" /&gt;&lt;/p&gt;

&lt;p&gt;Tune in next time, when I actually plug in for the first time, the first chain of 100 lights:&lt;br /&gt;
 &lt;br /&gt;
&lt;img src="http://www.mediamolecule.com/images/uploads/ceiling2_thumb.jpg" alt="Oooooh!" width="640" height="480" /&gt;&lt;br /&gt;
 &lt;br /&gt;
(despite epic temptation, unfortunately LBP work has prevented me from having time to try it. But oh, my blog reading friends, you’ll be the first to know when we switch on… well second I guess, we’ll know first!&lt;br /&gt;
 &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=uxBviuIrjRk:lMuW46UuLrE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=uxBviuIrjRk:lMuW46UuLrE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=uxBviuIrjRk:lMuW46UuLrE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=uxBviuIrjRk:lMuW46UuLrE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=uxBviuIrjRk:lMuW46UuLrE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=uxBviuIrjRk:lMuW46UuLrE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=uxBviuIrjRk:lMuW46UuLrE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=uxBviuIrjRk:lMuW46UuLrE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/uxBviuIrjRk" height="1" width="1"/&gt;</description>
    
    <category>Geek</category>
    <pubDate>Mon, 19 Apr 2010 14:29 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/tetris_on_the_ceiling_chapter_1/</feedburner:origLink></item> <item>
    <title>Adventures in Austin at SXSW</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/VIk-gNO5a68/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/adventures_in_austin_at_sxsw/#id:1993#date:16:00</guid>
    <description>&lt;p&gt;Whilst some Molecules were out in San Francisco at this years &lt;a href="http://www.gdconf.com/"&gt;Game Developers Conference&lt;/a&gt;, I was a lone ranger out in the not-so-darkest-depths of Texas. Every year, Austin plays host to &lt;a href="http://sxsw.com/" title="SXSW"&gt;South by Southwest&lt;/a&gt; (SXSW) - a huge festival merging the worlds of music, film and interactive in one big melting pot of win. I was mostly there for there for the Interactive bit (&lt;a href="http://sxsw.com/interactive" title="SXSW Interactive"&gt;SXSWi&lt;/a&gt;), to discover what&amp;#8217;s cooking in the land of the internets and maybe discover some new stuff. It&amp;#8217;s nicknamed &lt;em&gt;spring break for geeks&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So, what is hot? What&amp;#8217;s buzzing in the land of the internets? Commence Tom-rant-rabble! :)
&lt;/p&gt;&lt;p&gt;&lt;a href="http://gowalla.com"&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/gowalla.png" alt="Gowalla" width="199" height="189" class="floatright marg" /&gt;&lt;/a&gt;Probably the most significant thing I noticed at SXSWi was the use of geo-location services &lt;a href="http://gowalla.com" title="Gowalla"&gt;Gowalla&lt;/a&gt; and &lt;a href="http://foursquare.com/" title="FourSquare"&gt;Foursquare&lt;/a&gt;. I&amp;#8217;m sure many of you have heard of these before, but for the benefit of those who haven&amp;#8217;t - they&amp;#8217;re both essentially games which work using your GPS-enabled mobile phone as you move around in your day-to-day life. When you reach a destination, you can choose to &amp;#8220;&lt;em&gt;check-in&lt;/em&gt;&amp;#8221; there, thereby showing your friends where you are and what you&amp;#8217;re doing. There are gameplay elements too: Foursquare lets users who check-in often to a location become &amp;#8220;Mayor&amp;#8221; of that location, and Gowalla displays leaderboards of each location. With Gowalla you can also pick up virtual items or drop them in places - some virtual items are even redeemable for real-world discounts or services.&lt;br /&gt;
The thing about SXSWi, is that there is such a high concentration of geeks in one place, it&amp;#8217;s the perfect testing ground for services like Gowalla and Foursquare. It was four years since Twitter &amp;#8220;hatched&amp;#8221; at SXSWi, and 3 years since it&amp;#8217;s potential was realised by the masses there - mass live tweeting of events as they happened.&lt;br /&gt;
There was a real sense of Gowalla and Foursquare picking up some speed at SXSWi, so many people were using them that they became a truly viable way to meet new people, see where the hotspots were in town and what people were saying about talks, venues and gigs. The most memorable moment came when I saw a girl walk straight to the front of a queue at a venue, approach the bouncer and show him a virtual wristband displayed on the screen of her iPhone (something she could have been given, or unlocked through a series of challenges). &amp;#8220;&lt;em&gt;I&amp;#8217;ve got this wristband, can I get in here?&lt;/em&gt;&amp;#8221; she asked - &amp;#8220;&lt;em&gt;Oh yeah, you need to be in the VIP section over there&lt;/em&gt;&amp;#8221; the bouncer replied.That was pretty awesome. And there weren’t just wristbands - there were other virtual items being dropped around town, exchangeable for their real world counterparts. Someone got their mitts on a digital camera!&lt;/p&gt;

&lt;p&gt;The connection between virtual world and real world items/people/places was made regularly throughout SXSWi. If you wanted to exchange contact details with anyone, you could simply use your smartphone to scan the &lt;a href="http://en.wikipedia.org/wiki/QR_Code" title="QR code"&gt;QR code&lt;/a&gt; on the event pass around their neck. This instantly loads a webpage on your phone showing who they are and how to contact them. A host of other products and services were using QR codes to make the connection between physical and digital. And it even looks like &lt;a href="http://techcrunch.com/2010/03/16/facebook-qr-code/" title="Facebook QR Codes"&gt;Facebook may be integrating them soon too&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s a pretty hectic schedule at SXSW - the hour-and-a-bit long talks run from 9am to 6pm with any one session having up to 27 other talks running at the same time (you have to choose your talks wisely!). And there&amp;#8217;s plenty of stuff going on in the evenings too :)&lt;/p&gt;

&lt;p&gt;Amongst the talks I enjoyed most were Jonathan Stark&amp;#8217;s &lt;a href="http://www.slideshare.net/jonathanstark/hold-the-cocoa-building-ip" title="Hold the Cocoa"&gt;&lt;em&gt;Hold the Cocoa&lt;/em&gt;&lt;/a&gt; (&lt;a href="http://www.twapperkeeper.com/hashtag/holdthecocoa" title="#holdthecocoa"&gt;#holdthecocoa&lt;/a&gt;)- building web apps for iPhone. Many people are interested in building apps for the iPhone these days, but there are clear barriers to entry. Firstly, You need a license for the iPhone SDK  and secondly, you need to learn Objective C to code the thing. If you&amp;#8217;re primarily a web developer, that might not be too appealing. More importantly though - you&amp;#8217;d be investing time and energy developing for the walled garden that is the iPhone. By building an &lt;a href="http://www.quirksmode.org/blog/archives/2010/03/html5_apps.html" title="HTML5 Apps"&gt;HTML5 web app&lt;/a&gt;, you can easily port your code to any of the not-insignificant number of webkit enabled smartphones out there. &lt;br /&gt;
So, you make your HTML5 web app but how can you make it look and feel like a native iPhone app? Easy: jQtouch. &lt;br /&gt;
&lt;a href="http://www.jqtouch.com/" title="jQtouch"&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/jqtouch.png" alt="jQtouch" class="floatright" /&gt;&lt;/a&gt;&lt;a href="http://www.jqtouch.com/" title="jQtouch"&gt;jQtouch&lt;/a&gt; is an awesome jQuery library available for iPhone which lets you rapidly develop iPhone web apps. It comes bundled with a whole host of super-easy-to-use and awesome features, like &lt;em&gt;oooohhh-aahhhhhh&lt;/em&gt; animated CSS3 page transitions, super-simple ajax usage, customisable themes, support for offline caching, geo-location and plenty more. If you&amp;#8217;re thinking about making an app for iPhone then *&lt;strong&gt;you need to check this shit out&lt;/strong&gt;*!&lt;br /&gt;
The &lt;em&gt;Part 2 of Awesome&lt;/em&gt; is &lt;a href="http://phonegap.com/" title="Phonegap"&gt;PhoneGap&lt;/a&gt; (this is where geeks really start to drool). PhoneGap will bundle your web app in to a native app, so you can deploy your iPhone application to Apple&amp;#8217;s iTunes Store. It&amp;#8217;ll even let you plug in to the phones API so you can use, say - the contacts manager or camera. Epic win! I really enjoyed this talk, so mad love to &lt;a href="http://jonathanstark.com/" title="Jonathan Stark"&gt;Jonathan Stark&lt;/a&gt; (&lt;a href="http://twitter.com/Jonathanstark" title="Jonathan Stark"&gt;@Jonathanstark&lt;/a&gt;).&lt;br /&gt;
Oh, and If you know any similar Android or Symbian toolkits out there like jQtouch, let us know in the comments!&lt;/p&gt;

&lt;p&gt;Other interesting talks included &lt;em&gt;Beauty in Web Design&lt;/em&gt; (&lt;a href="http://www.twapperkeeper.com/hashtag/beautyinwebdesign" title="#beautyinwebdesign"&gt;#beautyinwebdesign&lt;/a&gt;), a talk from &lt;a href="http://clearleft.com/" title="Clearleft"&gt;Clearleft&lt;/a&gt;&amp;#8216;s Cennydd Bowles (&lt;a href="http://twitter.com/cennydd" title="Cennydd Bowles"&gt;@cennydd&lt;/a&gt;) - a throughly interesting talk about how web designers need to start thinking bigger and getting more emotional with our designs to engage audiences. &lt;br /&gt;
&lt;em&gt;ActivityStrea.ms: Is it getting Streamy in Here?&lt;/em&gt; (&lt;a href="http://www.twapperkeeper.com/hashtag/gettingstreamy" title="Getting Streamy"&gt;#gettingstreamy&lt;/a&gt;) was a talk from Chris Messina (&lt;a href="http://twitter.com/Chrismessina" title="Chris Messina"&gt;@Chrismessina&lt;/a&gt;) about the new Atom feed format for activity streams detailed over at &lt;a href="http://activitystrea.ms/"&gt;activitystrea.ms&lt;/a&gt;. &lt;br /&gt;
&lt;a href="http://badassideas.com/get-stoked-on-web-typography-wrap-up/" title="Get Stoked for Web Typography"&gt;&lt;em&gt;Get Stoked for Web Typography&lt;/em&gt;&lt;/a&gt; with a highly enthusiastic &lt;a href="http://badassideas.com/" title="Samantha Warren"&gt;Samantha Warren&lt;/a&gt; (&lt;a href="http://twitter.com/Samanthatoy" title="Samantha Warren"&gt;@swarren&lt;/a&gt;), looked at basic principles of typography and showed use of @font-face in CSS3 (something I &lt;a href="http://www.mediamolecule.com/lab/article/lovely_browser_fonts_with_css3_font-face/" title="CSS3 font-face"&gt;talked a little bit about&lt;/a&gt; following the launch of this here new Mm site). She rocked it. &lt;br /&gt;
&lt;em&gt;Interactive Infographics&lt;/em&gt; (&lt;a href="http://www.twapperkeeper.com/hashtag/interinfo" title="#interinfo"&gt;#interinfo&lt;/a&gt;) has a great panel showing off excellent examples of data mashup visualisations out there (try &lt;a href="http://mapumental.channel4.com/" title="Mapumental"&gt;Mapumental&lt;/a&gt;, &lt;a href="http://oakland.crimespotting.org/" title="Crimespotting"&gt;crimespotting.org&lt;/a&gt; and &lt;a href="http://walking-papers.org/" title="Walking Papers"&gt;walking-papers.org&lt;/a&gt;). @jenniferconley shared some nice slide pics and notes, posted &lt;a href="http://rachcreative.posterous.com/guest-brain-jenniferconley-shares-her-notes-o"&gt;over here&lt;/a&gt;.&lt;br /&gt;
&lt;em&gt;Gaming the Crowd: Turning work in to Play&lt;/em&gt; (&lt;a href="http://www.twapperkeeper.com/hashtag/gamingthecrowd" title="#gamingthecrowd"&gt;#gamingthecrowd&lt;/a&gt;) was a really interesting talk by Andy Baio (&lt;a href="http://twitter.com/waxpancake" title="@waxpancake"&gt;@waxpancake&lt;/a&gt;) about how simple gameplay mechanics can be applied to websites to make them more fun and enjoyable for users. I really enjoyed the example from &lt;a href="http://www.panic.com/blog/2010/03/the-panic-status-board/" title="Panic Blog"&gt;Panic on their blog&lt;/a&gt; showing how they improved customer service efficiency.&lt;br /&gt;
The &lt;em&gt;Can the Real-Time Web be Realized?&lt;/em&gt; (&lt;a href="http://www.twapperkeeper.com/hashtag/realtimeweb" title="#realtimeweb"&gt;#realtimeweb&lt;/a&gt;) Panel talked about some of the existing services out there right now which are making the most out of the realtime web and what you could be doing to take advantage of it too (In short: just go ahead and make webpages realtime, don&amp;#8217;t create walled gardens, integrate fully with existing realtime services). &lt;br /&gt;
I thoroughly enjoyed the BBC&amp;#8217;s &lt;em&gt;Digital Planet Live Quiz&lt;/em&gt;. A special quiz edition of the Digital Planet show (broadcast on World Service and you can &lt;a href="http://www.bbc.co.uk/programmes/p006lhjr" title="Digital Planet at SXSW on iPlayer"&gt;hear it on iPlayer&lt;/a&gt;), which had the audience interacting with the panel through a special web app made for the event. Apart from being a great laugh and damn good fun, I also came away feeling like other panel sessions were seriously missing a trick by not making more of audience interaction. I got to meet the team later a bit later on and they are a really fine bunch of people :)&lt;/p&gt;

&lt;p&gt;I need to shout out to &lt;a href="http://www.umbrellagroup.org/author/tweeture/" title="Tweeture"&gt;Tweeture&lt;/a&gt; too - such a fun idea from &lt;a href="http://www.pmstudio.co.uk/" title="Pervasive Media"&gt;Pervasive Media Studio&lt;/a&gt;. Here&amp;#8217;s a clip from the the Digital Planet team&amp;#8217;s coverage of SXSW explaining Tweeture rather nicely and what it was all about:&lt;/p&gt;

&lt;div class="center"&gt;&lt;object width="448" height="364"&gt;&lt;param name="movie" value="http://www.bbc.co.uk/emp/external/player.swf"&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;param name="FlashVars" value="playlist=http%3A%2F%2Fwww%2Ebbc%2Eco%2Euk%2Fworldservice%2Fmeta%2Fdps%2F2010%2F03%2Femp%2F100316%5Ftweeture%2Eemp%2Exml&amp;amp;config_settings_showPopoutButton=true&amp;amp;config_settings_language=en&amp;amp;config_settings_showFooter=true&amp;amp;"&gt;&lt;/param&gt;&lt;embed src="http://www.bbc.co.uk/emp/external/player.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="448" height="364" FlashVars="playlist=http%3A%2F%2Fwww%2Ebbc%2Eco%2Euk%2Fworldservice%2Fmeta%2Fdps%2F2010%2F03%2Femp%2F100316%5Ftweeture%2Eemp%2Exml&amp;amp;config_settings_showPopoutButton=true&amp;amp;config_settings_language=en&amp;amp;config_settings_showFooter=true&amp;amp;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;p&gt;
I first noticed Tweeture, albeit a bit later on, at the thoroughly enjoyable &lt;em&gt;Pervasive Games and Playful Experiences: Rendering the Real World&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Keynotes I went to included Evan Williams (&lt;a href="http://twitter.com/ev" title="@ev"&gt;@ev&lt;/a&gt;) talking about Twitter&amp;#8217;s expansion with the announcement of the &lt;a href="http://blog.twitter.com/2010/03/anywhere.html" title="@ anywhere platform"&gt;@ anywhere platform&lt;/a&gt; and Daniel Ek (&lt;a href="http://twitter.com/Eldsjal" title="@Eldsjal"&gt;@Eldsjal&lt;/a&gt;) talking about the future of music delivery, &lt;a href="http://spotify.com" title="Spotify"&gt;Spotify&lt;/a&gt; and it&amp;#8217;s successes in Europe. Live graphical notetaking of all the keynotes was brilliant - read over the ones below for an insight in to all the keynotes at SXSWi.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mediamolecule.com/images/uploads/danah_boyd.JPG" rel="shadowbox[keynotes]"  title="Danah Boyd - Making Sense of Publicity and Privacy"&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/danah_boyd_sml.jpg" alt="Danah Boyd - Making Sense of Publicity &amp;amp; Privacy" width="648" height="337" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="caption"&gt;Danah Boyd - Making Sense of Privacy &amp;amp; Publicity&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mediamolecule.com/images/uploads/valerie_casey.JPG" rel="shadowbox[keynotes]" title="Valerie Casey - The Designers Accord"&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/valerie_casey_sml.jpg" alt="Valerie Casey - The Designers Accord" width="648" height="370" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="caption"&gt;Valerie Casey - The Designers Accord&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mediamolecule.com/images/uploads/evan_williams.JPG" rel="shadowbox[keynotes]" title="Evan William, co-founder and CEO of Twitter"&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/evan_williams_sml.jpg" alt="Evan William, co-founder and CEO of Twitter" width="648" height="370" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="caption"&gt;A conversation with Evan Williams, co-founder and CEO of Twitter&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mediamolecule.com/images/uploads/daniel_ek.JPG" rel="shadowbox[keynotes]" title="Daniel Ek - The Future of Music Delivery" &gt;&lt;img src="http://www.mediamolecule.com/images/uploads/daniel_ek_sml.jpg" alt="Daniel Ek - The Future of Music Delivery" width="648" height="370" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="caption"&gt;Daniel Ek - The Future of Music Delivery&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;It was a busy week of rushing around seeing new things, learning new things, meeting great people, and &amp;#8216;&lt;a href="http://www.appvee.com/t/iphone-app-review-bump" title="iPhone Bump"&gt;bumping&lt;/a&gt;&amp;#8217; with someone for the first time. If you&amp;#8217;ve ever wondered about heading to SXSW - music, film or interactive - then don&amp;#8217;t wait around any longer and get out there and go. It&amp;#8217;s freaking awesome. &lt;/p&gt;

&lt;p&gt;Anyway, I&amp;#8217;m back with some handy new skillz, some energy from all the inspiration - plus I&amp;#8217;ve had my never-been-to-the-U.S status officially removed. I was the biggest  noob imaginable when I arrived. Now? Um, not quite as much :)
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=VIk-gNO5a68:YCdIyYw3MBU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=VIk-gNO5a68:YCdIyYw3MBU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=VIk-gNO5a68:YCdIyYw3MBU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=VIk-gNO5a68:YCdIyYw3MBU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=VIk-gNO5a68:YCdIyYw3MBU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=VIk-gNO5a68:YCdIyYw3MBU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=VIk-gNO5a68:YCdIyYw3MBU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=VIk-gNO5a68:YCdIyYw3MBU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/VIk-gNO5a68" height="1" width="1"/&gt;</description>
    
    <category>Web</category>
    <pubDate>Sat, 27 Mar 2010 16:00 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/adventures_in_austin_at_sxsw/</feedburner:origLink></item> <item>
    <title>One Hour Fiction: Rain Patrol</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/LfgsEhM6fQ0/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/one_hour_fiction_rain_patrol/#id:1986#date:15:29</guid>
    <description>&lt;p&gt;I set myself a task last week: write 750 words every day. I have not succeeded. However I’m getting married in 8 days so I have an excuse I think.&lt;/p&gt;

&lt;p&gt;The story “Rain Patrol” was my first effort under this short-lived regime, a piece of flash fiction written in an hour. It was inspired by this painting:&lt;br /&gt;
 
&lt;/p&gt;&lt;div align="center"&gt;&lt;a href="http://sid75.deviantart.com/art/In-The-Rain-147780611"&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/In_The_Rain_by_SID75_thumb.jpg" alt="Oooooh!" width="600" height="361" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;
&lt;br /&gt;It’s called In &lt;em&gt;The Rain&lt;/em&gt; and it’s by &lt;a href="http://sid75.deviantart.com/art/In-The-Rain-147780611"&gt;Vitaliy Smyk&lt;/a&gt;, a Ukrainian artist. It turns out that the painting itself was a two hour speedpaint, so it seems pretty fitting!&lt;br /&gt;
 
&lt;/p&gt;&lt;h2&gt;One Hour Fiction: Rain Patrol&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt;For days, it had rained. He had forgotten when it had started and forgotten what being dry was like, becoming accustomed to the mud, the constant companion of damp and the sheer brown of his existence. And then, as suddenly as it always started, the rain had stopped. The clouds parted just long to let the twin suns of this barren, forgotten rock peek through to remind him they did in fact exist.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
Three stinking months. That’s how long he had been here, this time round. He still wondered quite why he had signed up to return, knowing that the promises of forging new worlds and bringing hope to oppressed peoples were nothing but empty marketing drivel. Instead, all that awaited him was foot rot, tepid meals consisting mostly of rainwater and a near statistical certainty that he would return in one or more body bags.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
His company of men lived in close proximity in what seemed to be a plughole for the whole planet. How did all the water drain here, from both the ground and the sky? Last week a mobile command post had been washed away. Three guys now missing – dead, really – after the building had been torn from its moorings and swept down the valley. He had heard them yelling for help on the radio, but what could be done? &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://jonnyhopper.blogspot.com/"&gt;Click me to read the full story&lt;/a&gt;, and a few others too.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=LfgsEhM6fQ0:N4SknDU6m8Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=LfgsEhM6fQ0:N4SknDU6m8Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=LfgsEhM6fQ0:N4SknDU6m8Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=LfgsEhM6fQ0:N4SknDU6m8Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=LfgsEhM6fQ0:N4SknDU6m8Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=LfgsEhM6fQ0:N4SknDU6m8Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=LfgsEhM6fQ0:N4SknDU6m8Q:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=LfgsEhM6fQ0:N4SknDU6m8Q:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/LfgsEhM6fQ0" height="1" width="1"/&gt;</description>
    
    <category>Words</category>
    <pubDate>Fri, 19 Mar 2010 15:29 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/one_hour_fiction_rain_patrol/</feedburner:origLink></item> <item>
    <title>Jesse Schell’s talk on the future of games</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/cBNV8BJIxoY/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/jesse_schells_talk_on_the_future_of_games/#id:1964#date:15:59</guid>
    <description>&lt;p&gt;This is the most interesting/entertaining talk by far from DICE (wot Siobhan and I wos at last week)&lt;/p&gt;

&lt;div align="center"&gt;&lt;object classId="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="600" height="450" id="VideoPlayerLg44277"&gt;&lt;param name="movie" value="http://g4tv.com/lv3/44277" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;embed src="http://g4tv.com/lv3/44277" type="application/x-shockwave-flash" name="VideoPlayer" width="600" height="450" allowScriptAccess="always" allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=cBNV8BJIxoY:KpkbBiyO4eA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=cBNV8BJIxoY:KpkbBiyO4eA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=cBNV8BJIxoY:KpkbBiyO4eA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=cBNV8BJIxoY:KpkbBiyO4eA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=cBNV8BJIxoY:KpkbBiyO4eA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=cBNV8BJIxoY:KpkbBiyO4eA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=cBNV8BJIxoY:KpkbBiyO4eA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=cBNV8BJIxoY:KpkbBiyO4eA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/cBNV8BJIxoY" height="1" width="1"/&gt;</description>
    
    <category>Geek</category>
    <pubDate>Tue, 23 Feb 2010 15:59 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/jesse_schells_talk_on_the_future_of_games/</feedburner:origLink></item> <item>
    <title>Shaun’s iPod paintings</title>
    <link>http://feedproxy.google.com/~r/MmLab/~3/pxhT0RVrOgg/</link>
    <guid isPermaLink="false">http://www.mediamolecule.com/lab/article/shauns_ipod_paintings/#id:1960#date:16:36</guid>
    <description>&lt;p&gt;&lt;a href="http://www.mediamolecule.com/about/whos_who/#Shaun" title="Shaun"&gt;Shaun&lt;/a&gt; has been painting these incredible self portraits on his iPod touch - how?&amp;nbsp; - using an app called &lt;a href="http://brushesapp.com/"&gt;Brushes&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.mediamolecule.com/images/uploads/4326623658_56df4ed687.jpg" alt="Oooooh!" width="320" height="480" /&gt;&amp;nbsp;&lt;img src="http://www.mediamolecule.com/images/uploads/4331655490_cd5b453610.jpg" alt="Oooooh!" width="320" height="480" /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d also like to use this opportunity to welcome Shaun back to Mm Towers, welcome home sir!
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=pxhT0RVrOgg:fotZU6Mnv3E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=pxhT0RVrOgg:fotZU6Mnv3E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=pxhT0RVrOgg:fotZU6Mnv3E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=pxhT0RVrOgg:fotZU6Mnv3E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=pxhT0RVrOgg:fotZU6Mnv3E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=pxhT0RVrOgg:fotZU6Mnv3E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MmLab?a=pxhT0RVrOgg:fotZU6Mnv3E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MmLab?i=pxhT0RVrOgg:fotZU6Mnv3E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MmLab/~4/pxhT0RVrOgg" height="1" width="1"/&gt;</description>
    
    <category>Art</category>
    <pubDate>Thu, 18 Feb 2010 16:36 GMT</pubDate>
    <feedburner:origLink>http://www.mediamolecule.com/lab/article/shauns_ipod_paintings/</feedburner:origLink></item></channel>
</rss>
