<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Ed Anuff</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/" />
    <link rel="self" type="application/atom+xml" href="http://www.anuff.com/atom.xml" />
    <id>tag:www.anuff.com,2008-08-08://1</id>
    <updated>2010-07-19T00:50:58Z</updated>
    <subtitle>a rapidly evolving situation</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.25rc3-en</generator>

<entry>
    <title>Death Grip</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/07/death-grip.html" />
    <id>tag:www.anuff.com,2010://1.24</id>

    <published>2010-07-19T00:45:13Z</published>
    <updated>2010-07-19T00:50:58Z</updated>

    <summary><![CDATA[ Should I return it and get a new one or just use the bumper?&nbsp; Still need to install iOS 4.1......]]></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="death_grip.png" src="http://www.anuff.com/images/death_grip.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" height="320" width="643" /></span> <div>Should I return it and get a new one or just use the bumper?&nbsp; Still need to install iOS 4.1...<br /><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Secondary indexes in Cassandra</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/07/secondary-indexes-in-cassandra.html" />
    <id>tag:www.anuff.com,2010://1.23</id>

    <published>2010-07-15T18:55:05Z</published>
    <updated>2010-07-19T01:23:35Z</updated>

    <summary> .cftable * { font:12px arial,sans-serif; color: black; } .cftype { font-weight: bold; } .cftable { border-collapse:collapse; border: 1px solid black; margin-top: 8px; margin-bottom: 16px; margin-left: auto; margin-right: auto; } .cftable tr td { border: 1px solid black; } .cftable...</summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[ <style>
.cftable * {
	font:12px arial,sans-serif;
        color: black;
}
.cftype {
	font-weight: bold;
}
.cftable
{
	border-collapse:collapse;
	border: 1px solid black;
	margin-top: 8px;
	margin-bottom: 16px;
        margin-left: auto;
        margin-right: auto;
}
.cftable tr td {
	border: 1px solid black;
}
.cftable td {
	padding: 2px;
}
.cfname {
	width: 350px;
}
.cfvalue {
	width: 150px;
}
.cfsteps li {
	margin-top: 8px;
	margin-bottom: 8px;
}
</style>

<p>One of the common issues of dealing with the <a href="http://cassandra.apache.org/">Apache Cassandra</a> database is how to do secondary indexes of columns within a row.  This post will discuss one technique, far from the only one, for
	how to manage this.  One thing that experienced Cassandra users will hopefully find interesting is that SuperColumns will not be used at all to accomplish this in order to
	avoid the complexity and limitations they introduce.  Also, it should also be pointed out that Cassandra will have native secondary index support in the upcoming 0.7 release (see <a href="https://issues.apache.org/jira/browse/CASSANDRA-749">CASSANDRA-749</a>), which will make this all much simpler, but the idea is still valid for how to think about about this sort of thing, and will still be applicable in some situations.  Once that version gets closer to release, I'll do a follow up post looking at it.</p>
	
<p>So, to start, let's assume a scenario where we have a container (ex. a group) of items (ex. users in the group), each of which has an arbitrary set of properties, which 
	are searchable by value in the context of the container.  Items might also be members of other containers, but we won't explicitly deal with that in this
	scenario.</p>
	
]]>
        <![CDATA[<p>One way to model this in Cassandra is to have two Column Families (Cassandra-speak for table-like entities) which we'll just call CF's for short.  The first
	CF would be for the item's properties, which we'll call Item_Properties.  This is the simplest form of using Cassandra's data model.  Rows in
	Item_Properties will be looked up by a key, which in this example will be UUID's.  The columns inside the CF are the property names and the values stored
	in the columns are the property values.</p>

<table class="cftable">
<tr><td colspan="2"><span class="cftype">CF:</span> Item_Properties</td></tr>
<tr><td colspan="2"><span class="cftype">Key:</span> item_id</td></tr>
<tr><td colspan="2"><span class="cftype">Compare with:</span> BytesType</td></tr>
<tr><td class="cfname cftype">Name</td><td class="cfvalue cftype">Value</td></tr>
<tr><td>property_name</td><td>property_value</td></tr>
<tr><td>...</td><td>...</td></tr>
</table>

<p>The next CF is for the containers that will hold sets of items, and is appropriately named Container_Items.  Each column in a Container_Items row is
	the key of an row in Item_Properties.  This is one of the first things that trips people up in using Cassandra.  While you can use Column Families
	as simple tables and use each row the same way you'd use a row as a record in a normal database, each row can be used as a simple table in and of 
	itself, particularly for modeling join tables.  In the Container_Items CF, each column uses the key of an row in Item_Properties as it's name
	and the timestamp of when it was added to the collection as the column value.  This row can grow quite large as more and more items are added
	to it, but since each column is about 42 bytes for the UUID and the timestamp, this is going to hit a limit of 40M+ items in a group under pre-0.7
	limitations.  For a container of users in a group, this might be a reasonable limitation, but you'd also use this same mechanism for collecting
	things like status updates (i.e. &quot;tweets&quot;).  The 0.7 release of Cassandra will remove this limitation.</p>


<table class="cftable">
<tr><td colspan="2"><span class="cftype">CF:</span> Container_Items</td></tr>
<tr><td colspan="2"><span class="cftype">Key:</span> container_id</td></tr>
<tr><td colspan="2"><span class="cftype">Compare with:</span> TimeUUIDType</td></tr>
<tr><td class="cfname cftype">Name</td><td class="cfvalue cftype">Value</td></tr>
<tr><td>item_id</td><td>insertion_timestamp</td></tr>
<tr><td>...</td><td>...</td></tr>
</table>

<p>So far, this is fairly basic Cassandra data modeling.  Where things get complicated is when one wants to start to retrieve items from
	the group by querying against specific property values.  For this, you'll need to manage your own indexes as this is outside
	of the purposefully minimalist design of Cassandra.  To do this, we'll create two more column families.  This first
	CF holds the actual index, and we use the container ID with the property name we want to index as the key to look it
	up.  It would look something like this:</p>

<table class="cftable">
<tr><td colspan="2"><span class="cftype">CF:</span> Container_Items_Property_Index</td></tr>
<tr><td colspan="2"><span class="cftype">Key:</span> container_id + property_name</td></tr>
<tr><td colspan="2"><span class="cftype">Compare with:</span> compositecomparer.CompositeType</td></tr>
<tr><td class="cfname cftype">Name</td><td class="cfvalue cftype">Value</td></tr>
<tr><td>composite(property_value, item_id, change_timestamp)</td><td>item_id</td></tr>
<tr><td>...</td><td>...</td></tr>
</table>

<p>Where this indexing technique departs a bit from techniques described elsewhere is how each column in the index is constructed.
	Cassandra provides a set of column types that it can use to sort the columns in a row.  You can only specify one and
	it's defined at column family creation time.  Cassandra also lets you define your own column types and in what we've done here
	is create a CompositeType (see <a href="http://github.com/edanuff/CassandraCompositeType">http://github.com/edanuff/CassandraCompositeType</a>).
	This will let us define columns that Cassandra will sort for us that combine several component values into a single composite type.
	This lets us create unique column entries for potentially (and probably) non-unique property values by adding additional values to the
	column as discriminators.</p>
	
<p>So, now, in order to query a container for all the items where a property equals a certain value, we'd take the key of the container and append
	the property name to it, and do a slice query against the value.  All columns where the value was the first component in the composite type
	would be returned, and the value of each column would be the key of the appropriate row in Item_Properties.  Not that it doesn't actually have to be precise
	equality, range queries will work with this technique too.</p>

<p>The final issue to deal with is what happens when the value of a property is changed and the index has to be updated.  The simple answer is that you'd
	introduce a column for the new value in the Container_Items_Property_Index column family and remove the column for the old value.  However,
	for a number of reasons related to Cassandra's model of eventual consistency, simply reading the previous value from Item_Properties
	before updating it and then removing the index entry for that value from Container_Items_Property_Index will not reliably work.  To do this
	we maintain a list of previous values for the specific property of a given item and use that to remove these values from the index before adding the
	new value to the index.  These are stored in the following CF:<p>

<table class="cftable">
<tr><td colspan="2"><span class="cftype">CF:</span> Container_Item_Property_Changes</td></tr>
<tr><td colspan="2"><span class="cftype">Key:</span> container_id + item_id + property_name</td></tr>
<tr><td colspan="2"><span class="cftype">Compare with:</span> LongType</td></tr>
<tr><td class="cfname cftype">Name</td><td class="cfvalue cftype">Value</td></tr>
<tr><td>change_timestamp</td><td>property_value</td></tr>
<tr><td>...</td><td>...</td></tr>
</table>

<p>We remove these columns from the CF after we retrieving them, so this row never gets too large, in most cases probably never grows much larger than one or two
	columns, more if frequent changes are being made.<p>
		
<p>So, to wrap it up, there are two basic operations that you'll end up wanting to peform - setting a property value for an item in a collection, and getting items
	in the collection that match a certain value.  These would look like this:</p>

<em>Set Property(property_name) For Item(item_id) In Container(container_id) To Value(property_value)</em>

<ol class="cfsteps">
<li> Get the change_timestamp as the current timestamp value.</li>
<li>Get_Slice all columns on CF Container_Item_Property_Changes for key (container_id + item_id + property_name)</li>
<li>Do batch_mutate with the following:<br>
	<ul>
		<li>Delete all matching columns in Container_Items_Property_Index from the entries retrieved from Container_Item_Property_Changes in the previous step</li>
		<li>Insert column named property_name with column value of property_value in Item_Properties</li>
		<li>Insert new entry in Container_Items_Property_Index</li>
		<li>Insert new entry in Container_Item_Property_Changes</li>
	</ul>
</li>
</ol>

<em>Get Items In Container(container_id) Where Property(property_name) Equals Value(property_value)</em>

<ol class="cfsteps">
<li>Get_slice range on CF Container_Items_Property_Index for key (container_id + property_name) for columns matching property_value</li>
</ol>

<p>This may all seem like a lot of work, but in practice, this all gets wrapped up in middleware that hides it.  I've been using this technique in an application which
	I'll eventually release the code for, but it should be fairly straightforward to implement this using the code I've already put on <a href="http://github.com/edanuff/CassandraCompositeType">GitHub</a>.</p>

<p><b>Update:</b> <a href="http://twitter.com/mjmalone">Mike Malone</a> points out that, since Cassandra already stores a timestamp along with the column value, that it's redundant to store in the column value as well and can be omitted in the Container_Items and Container_Item_Property_Changes column families, which would reduce storage space by about 20%.</p>
]]>
    </content>
</entry>

<entry>
    <title>&quot;False Clouds&quot;</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/06/false-clouds.html" />
    <id>tag:www.anuff.com,2010://1.22</id>

    <published>2010-06-26T05:10:37Z</published>
    <updated>2010-06-26T05:31:32Z</updated>

    <summary><![CDATA[At Structure 2010 this week, both Werner Vogels from Amazon and Marc Benioff of Salesforce both described the so-called "private cloud" solutions being offered by a large percentage of the companies at the conference as "false clouds".&nbsp; I had the...]]></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[At Structure 2010 this week, both Werner Vogels from Amazon and Marc Benioff of Salesforce both described the so-called "private cloud" solutions being offered by a large percentage of the companies at the conference as "false clouds".&nbsp; I had the sneaking suspicion that the real reason many of these companies were all focusing on these private clouds was not so much due to the allegedly unique needs of corporate customers such as security or legacy integration as much as it was due to the fact that most of them were being built on the classic enterprise sales business model with it's inherent dependency on trying to front load as much of the sale as possible.&nbsp; Unfortunately, while this leads to start-ups that are able to show great early revenue traction, the challenges of scaling that sort of business are very well known.&nbsp; The lessons to learn from Amazon and Salesforce aren't about the technologies of the cloud, they're about the business model, but there were only a handful of start-ups that seemed willing to follow in their footsteps. ]]>
        
    </content>
</entry>

<entry>
    <title>How I&apos;d build a car computer today</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/06/how-id-build-a-car-computer-today.html" />
    <id>tag:www.anuff.com,2010://1.21</id>

    <published>2010-06-14T23:17:28Z</published>
    <updated>2010-06-15T17:22:03Z</updated>

    <summary><![CDATA[Not something I actually plan to do, but if I was revisiting my car computer project from five years ago, I'd probably take this approach.&nbsp; Use a small, low-power single board computer like the Beagle Board that can run Android.&nbsp;...]]></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[Not something I actually plan to do, but if I was revisiting my <a href="http://www.anuff.com/2009/05/old-projects-uploaded-to-flickr.html">car computer project</a> from five years ago, I'd probably take this approach.&nbsp; Use a small, low-power single board computer like the <a href="http://www.beagleboard.org/">Beagle Board</a> that can run Android.&nbsp; Have it able to talk to an app on the iPhone via WiFi for application communications and use the Bluetooth stereo headset and hands-free capabilities to be able to wirelessly digitally play iTunes DRM music out of the iPhone through the car's speakers as well as potentially put phone call audio though the same system.<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="car_computer_2010.png" src="http://www.anuff.com/images/car_computer_2010.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" height="207" width="630" /></span><br /><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Good Advice</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/05/good-advice.html" />
    <id>tag:www.anuff.com,2010://1.20</id>

    <published>2010-05-28T20:17:36Z</published>
    <updated>2010-05-28T20:23:33Z</updated>

    <summary></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[<div style="width: 480px; margin-left: auto; margin-right: auto;">
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/wNYHoI47fw0&hl=en_US&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/wNYHoI47fw0&hl=en_US&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></div>]]>
        
    </content>
</entry>

<entry>
    <title>It&apos;s here</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/04/its-here.html" />
    <id>tag:www.anuff.com,2010://1.19</id>

    <published>2010-04-03T19:31:36Z</published>
    <updated>2010-04-03T19:32:28Z</updated>

    <summary></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ipad_delivered.png" src="http://www.anuff.com/2010/04/03/ipad_delivered.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" height="320" width="533" /></span> <div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Distance iPad must travel today: 0.8 miles</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/04/distance-ipad-must-travel-today.html" />
    <id>tag:www.anuff.com,2010://1.18</id>

    <published>2010-04-03T17:32:33Z</published>
    <updated>2010-04-03T17:47:29Z</updated>

    <summary>Come on, UPS, you can do it!...</summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="delivery_route.png" src="http://www.anuff.com/2010/04/03/delivery_route.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" height="307" width="213" /></span><div align="center">Come on, UPS, you can do it!<br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>It ships!</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2010/03/it-ships.html" />
    <id>tag:www.anuff.com,2010://1.17</id>

    <published>2010-03-30T18:43:09Z</published>
    <updated>2010-03-30T18:46:25Z</updated>

    <summary>Like there was ever any real doubt that I&apos;d finally give in and order one... Tracking says they&apos;re shipping them directly from Shenzhen, China....</summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[Like there was ever any real doubt that I'd finally give in and order one...<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="shipment.png" src="http://www.anuff.com/2010/03/30/shipment.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" height="360" width="450" /></span> <div>Tracking says they're shipping them directly from Shenzhen, China.<br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Old projects uploaded to Flickr</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2009/05/old-projects-uploaded-to-flickr.html" />
    <id>tag:www.anuff.com,2009://1.16</id>

    <published>2009-05-31T04:36:57Z</published>
    <updated>2009-05-31T06:09:33Z</updated>

    <summary><![CDATA[In honor of Maker Faire this weekend, I'm uploading some of the old photos from the various projects I've hacked around on over the years.&nbsp; These used to be on several old sites and blogs that I let lapse: The...]]></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[In honor of <a href="http://makerfaire.com/">Maker Faire</a> this weekend, I'm uploading some of the old photos from the various projects I've hacked around on over the years.&nbsp; These used to be on several old sites and blogs that I let lapse:<br /><br /><br />
<object width="400" height="300"> <param name="flashvars" value="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fedanuff%2Fsets%2F72157618942758407%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fedanuff%2Fsets%2F72157618942758407%2F&amp;set_id=72157618942758407&amp;jump_to=" /> <param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649" /> <param name="allowFullScreen" value="true" /><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowfullscreen="true" flashvars="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fedanuff%2Fsets%2F72157618942758407%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fedanuff%2Fsets%2F72157618942758407%2F&amp;set_id=72157618942758407&amp;jump_to=" width="400" height="300"></object>
<br /><br /><br />
<br />
<object width="400" height="300"> <param name="flashvars" value="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fedanuff%2Fsets%2F72157619029279570%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fedanuff%2Fsets%2F72157619029279570%2F&amp;set_id=72157619029279570&amp;jump_to=" /> <param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649" /> <param name="allowFullScreen" value="true" /><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowfullscreen="true" flashvars="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fedanuff%2Fsets%2F72157619029279570%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fedanuff%2Fsets%2F72157619029279570%2F&amp;set_id=72157619029279570&amp;jump_to=" width="400" height="300"></object>
<br /><br /><br />The installation of the navigation system took place of the course of two days in the garage of my apartment building back in October of 2001.&nbsp; One of my neighbors became very concerned when she saw me disassembling the interior of my car and alerted the building security.&nbsp; Apparently she thought I was turning the car into some sort of terrorist weapon, go figure.&nbsp; Most of this project was documented along with a lot of other interesting information on the now-defunct openbmw.org site and a Yahoo Group.&nbsp; At the time, if you didn't purchase the car from the factory with the navigation system installed, BMW refusted to install it afterwords, claiming that it wasn't possible, and would refuse to provide information to people who wanted to install it themselves.&nbsp; I found a CD-ROM database of part numbers and identified every part used by the navigation system and ordered them from the repair departments of three different dealerships over the course of several months.&nbsp; Eventually, after a number of people printed out the instructions from my site and went to their local dealers asking them to perform the retrofit, BMW relented and packaged all the parts into an installation kit that could be installed by the repair centers.<br /><br />The car computer project was primarily focused on building an interface board that would tap into the navigation system and allow an in-car PC to take over the display and interface with the dashboard knobs and buttons.&nbsp; I designed the circuit boards and sent the files to China to be manufactured and assembled.&nbsp; When I got the boards delivered back to me, I'd usually find at least one chip would be mounted incorrectly and I'd have to resolder it by hand, which would unfortunately often result in me ruining the board.&nbsp; Once the interface board was installed, I used a trunk-mounted Linux PC running software that I'd written on top of Mozilla to provide a user interface for things like an MP3 jukebox and web access.&nbsp; Maybe I'll turn it into an iPhone app at some point.<br /><br />Navigation Installation Project - 2001<br />
<a href="http://www.flickr.com/photos/edanuff/sets/72157618942758407/">http://www.flickr.com/photos/edanuff/sets/72157618942758407/</a><br /><br />Car Computer Project - 2004/2005<br /><a href="http://www.flickr.com/photos/edanuff/sets/72157619029279570/">http://www.flickr.com/photos/edanuff/sets/72157619029279570/</a><br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>Yes, I am a geek</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2009/04/yes-i-am-a-geek.html" />
    <id>tag:www.anuff.com,2009://1.15</id>

    <published>2009-04-04T03:33:38Z</published>
    <updated>2009-04-04T03:33:38Z</updated>

    <summary> Yes, I am a geek, originally uploaded by Ed Anuff....</summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[
<div style="text-align: left; padding: 3px;">
<a href="http://www.flickr.com/photos/edanuff/3411047864/" title="photo sharing"><img src="http://farm4.static.flickr.com/3354/3411047864_8796165f21.jpg" style="border: solid 2px #000000;" alt="" /></a>
<br />
<span style="font-size: 0.8em; margin-top: 0px;"><a href="http://www.flickr.com/photos/edanuff/3411047864/">Yes, I am a geek</a>, originally uploaded by <a href="http://www.flickr.com/people/edanuff/">Ed Anuff</a>.</span>
</div>
<p>

</p>]]>
        
    </content>
</entry>

<entry>
    <title>iPhone Experiments</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2009/03/iphone-experiments.html" />
    <id>tag:www.anuff.com,2009://1.14</id>

    <published>2009-03-16T17:25:52Z</published>
    <updated>2009-03-16T17:25:52Z</updated>

    <summary> Game, originally uploaded by Ed Anuff. iPhone programming isn&apos;t that hard once you get the hang of it....</summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[
<div style="text-align: left; padding: 3px;">
<a href="http://www.flickr.com/photos/edanuff/3360215338/" title="photo sharing"><img src="http://farm4.static.flickr.com/3422/3360215338_f545813b9f.jpg" style="border: solid 2px #000000;" alt="" /></a>
<br />
<span style="font-size: 0.8em; margin-top: 0px;"><a href="http://www.flickr.com/photos/edanuff/3360215338/">Game</a>, originally uploaded by <a href="http://www.flickr.com/people/edanuff/">Ed Anuff</a>.</span>
</div>
<p>
iPhone programming isn't that hard once you get the hang of it.
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Unwidgetizing the web (or at least my Twitter feed)</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2008/08/unwidgetizing-the-web-or-at-least-my-twitter-feed.html" />
    <id>tag:www.anuff.com,2008://1.9</id>

    <published>2008-08-25T00:53:03Z</published>
    <updated>2008-08-25T15:39:55Z</updated>

    <summary><![CDATA[When I started this blog on Movable Type 4, I used the Action Streams plug-in to put a list of Twitter and Facebook activities in the right hand column.&nbsp; I did this out of habit, treating the list of tweets...]]></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    <category term="actionstreams" label="action streams" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="disqus" label="disqus" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="epicentric" label="epicentric" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="google" label="google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="javascript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="movable type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pluck" label="pluck" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vignette" label="vignette" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="widgetbox" label="widgetbox" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="widgets" label="widgets" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[When I started this blog on Movable Type 4, <a href="http://www.anuff.com/2008/08/just-installed-action-streams.html">I used the Action Streams plug-in</a> to put a list of Twitter and Facebook activities in the right hand column.&nbsp; I did this out of habit, treating the list of tweets as a black-box in the form of a widget rather than something actually integrated into the content of my blog.&nbsp; Over the last couple of week, I realized that while this made sense from a technical perspective, it didn't really reflect the true relationship between the content generated through lifestreaming and long-form blog posts that expounded on a particular idea, never mind that fact that the former are going to outnumber the latter due to my lackadaisical efforts to compose interesting posts.&nbsp; But, more importantly, it demonstrated some of the limitations of using widgets as the fundamental building blocks of web publishing.<br /> ]]>
        <![CDATA[<br />This isn't particularly an epiphany for me, although
I've spent many years advocating the idea that web publishing should be
component-oriented.&nbsp; In 1998, <a href="http://www.infoworld.com/article/02/08/13/020813hnepicentric_1.html">Oliver Muoto and I started a company called Epicentric</a>,
that we built up to a $40 million a year business and sold to Vignette
that was based on the idea that corporate intranets and extranets could
be replaced by "My Yahoo"-style corporate portals.&nbsp; It made sense at
the time, because it represented a much more efficient alternative to
the cumbersome content management systems or hand-edited web sites that
many businesses were trying to use as the basis of their web publishing
efforts.&nbsp; Corporate America was trying to use the tools that had been
developed for Internet sites whose primary business was the web to
internal communications where these activities were supposed to be used
in support of some other primary business and the end-result was at
best overkill, and at worse a sinkhole of time and money.&nbsp; So,
corporate portals where you simply assembled your page out of a
collection of "portlets" (what we now call "widgets"), was a welcome
alternative.&nbsp; Even then, we knew that there were some limitations to
this, though.&nbsp; Each portlet was an isolated silo of content, we knew
that eventually these things would need to talk to each other, and
ideas like standards for "inter-portlet communications" were discussed
at enterprise software conferences.<br /><br />Seven years later, in the
fall of 2005, I saw that Web 2.0 was recapitulating many of the
developments of the enterprise software world.&nbsp; Content management
systems, service-oriented architectures, and <a href="http://www.google.com/patents?vid=USPAT6327628">some of the work I'd done related to portals and portlets</a>
were now being redescovered in the form of blogging, mashups, and
widgets.&nbsp; Teaming up with some of my former Epicentric colleagues, I
started a company called <a href="http://www.widgetbox.com/">Widgetbox</a> that tried to implement some of the things we'd learned in the portal space <a href="http://link.brightcove.com/services/link/bcpid1127798146/bclid1184497748/bctid1199157543">to make widgets easier to build, find, and use</a>.&nbsp;
That company has since gone on to become the largest destination site
for widgets on the web, with over 70,000 widgets available, and
platform technologies like OpenSocial and Facebook's Application API
are built on many of the concepts that Widgetbox pioneered.<br /><br />However,
we still come back to the fundamental challenge of using widgets, which
as that their strength is also their limitation.&nbsp; Widgets are
componentized content, and components, by definition,
compartmentalize.&nbsp; So, when I started this blog, and used Action
Streams as a widget to segregate my microblogging activities from the
rest of the content, I was falling into the trap of letting expediency
drive information flow and the end result was a much less effective web
site.&nbsp; Luckily, Action Streams is implemented as a plug-in and even
though it can be used as a widget for quick integration, it can also be
used within Movable Type's powerful templating mechanism to let me
easily create a single blog stream that merges my lifestreaming with
posts like this.&nbsp; You can see the end results if you <a href="http://www.anuff.com/">visit the main page of the site</a> and see the blog posts intermixed with tweets on it.&nbsp; I really think that even a simple type of mash-up like this is a lot more interesting, especially when it can be accomplished without any coding just by editing a template. <br /><br />Today, we're seeing more and more services being delivered in the form of widgets.&nbsp; Services like <a href="http://disqus.com/">Disqus</a> and <a href="http://www.pluck.com/">Pluck</a> and <a href="http://www.google.com/friendconnect/">Google Friend Connect</a>
provide entire commenting systems and social media features in the form
of a simple line of Javascript.&nbsp; These services are very convenient,
but it's important to ensure that any such service has a robust API
that can be used to think outside the box, or at least the widget, and
to full leverage these within the overall experience of your site
rather than just jamming together a set of boxes on a web page and
calling it a day.<br /> ]]>
    </content>
</entry>

<entry>
    <title>A few more thoughts about blogging and social networks</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2008/08/a-few-more-thoughts-about-blogging-and-social-networks.html" />
    <id>tag:www.anuff.com,2008://1.7</id>

    <published>2008-08-15T14:45:22Z</published>
    <updated>2008-08-25T01:50:11Z</updated>

    <summary>Om Malik did a good job today of summing up the conversation about the convergence of blogging and social networks that was started by Six Apart&apos;s launch of Movable Type Pro on Wednesday, with a full set of features aimed...</summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    <category term="actionstreams" label="action streams" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="blogging" label="blogging" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="facebook" label="facebook" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="friendfeed" label="friendfeed" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="openid" label="openid" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="socialnetworks" label="social networks" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[<a href="http://gigaom.com/2008/08/14/why-blogs-need-to-be-social/">Om Malik did a good job today</a> of <a href="http://www.readwriteweb.com/archives/the_next_social_networks_powered_by_wordpress_movable_type.php">summing</a> <a href="http://www.problogger.net/archives/2008/08/14/movable-type-launch-version-42-and-movable-type-pro/">up</a> <a href="http://www.webmonkey.com/blog/New_Movable_Type_Pro_Wants_to_Turn_Your_Blog_in_a_Social_Network">the</a> <a href="http://www.internetnews.com/webcontent/article.php/3764946/Movable+Type+Moves+Toward+the+Social.htm">conversation</a> about the convergence of blogging and social networks that was started by <a href="http://www.movabletype.com/blog/2008/08/movable-type-pro-42.html">Six Apart's launch of Movable Type Pro on Wednesday</a>, with a full set of features aimed at allowing bloggers to create social network-like communities around their blogs.&nbsp; A couple of things worth adding, though.&nbsp; First, as I mentioned in <a href="http://www.anuff.com/2008/08/how-is-blogging-changing-the-content-management-market.html">my previous blog post</a>, the "social" aspect of blogging platforms is one of the main things that differentiated them from the previous generation of content management systems.&nbsp; Second, is that there seems to be a perception that the social network around a blog is meant to replace or compete with the mainstream social networks such as MySpace or Facebook.&nbsp; Fostering community discussion and interaction wherever a focus of interest occurs is a good thing, and the blogosphere is a perpetual source of these focus points.&nbsp; This is the inevitable evolution of blog commenting, which is what makes sites like GigaOm so interesting.&nbsp; The social network capabilities will allow these blogs to take that to the next level.&nbsp; However, these communities will be linked to each other and to the large social networks like Facebook through a variety of mechanisms, such as all the emerging standards like OpenID, aggregation tools such as FriendFeed and Movable Type's <a href="http://plugins.movabletype.org/action-streams/">Action Streams</a> capabilities, and other forms of data portability.&nbsp; The nice thing is it's not going to be an either or choice, sometimes more is more. ]]>
        
    </content>
</entry>

<entry>
    <title>How is blogging changing the content management market?</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2008/08/how-is-blogging-changing-the-content-management-market.html" />
    <id>tag:www.anuff.com,2008://1.5</id>

    <published>2008-08-14T00:34:32Z</published>
    <updated>2008-08-25T04:59:46Z</updated>

    <summary><![CDATA[I had an interesting conversation today with an analyst that was trying to understand how tools like Movable Type and blogging fit into the general category of content management.&nbsp; When I was at Vignette, we had seen the content management...]]></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    <category term="cms" label="cms" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="contentmanagement" label="content management" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ecm" label="ecm" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="epicentric" label="epicentric" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="movable type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plumtree" label="plumtree" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sharepoint" label="sharepoint" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sixapart" label="six apart" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vignette" label="vignette" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wcm" label="wcm" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[I had an interesting conversation today with an analyst that was trying to understand how tools like Movable Type and blogging fit into the general category of content management.&nbsp; When I was at Vignette, we had seen the content management space splitting into web content management (WCM), document management and enterprise content management (ECM), and collaborative intranet portals.&nbsp; Although Vignette, through various acquisitions, had strong products in each of those categories, it was hard to see the relationship between how content managed in the WCM and ECM worlds related to the more ad-hoc collaborative content that was created and interacted with on a daily basis within the increasingly-popular intranets and corporate portals.&nbsp; Companies were increasingly choosing corporate portals such as Epicentric, Plumtree, and Microsoft's incredibly successful SharePoint product, which offered "lightweight" content management in conjunction with strong collaboration capabilities over the more powerful, large-scale content management systems.&nbsp; For Internet publishing, the same thing was occurring in the web content management space as well, but it was happening under the radar screen of most of the WCM vendors in the form of the emergence of blogging.&nbsp; The reason why it wasn't immediately understood was because WCM vendors have historically been driven by the needs of the large media publishers, and as we all know, those publishers had no idea just how much the principals of blogging would transform their businesses at the time.<br />]]>
        <![CDATA[<br />What was occurring on
the Internet in the form of blogging and in the intranets in the form
of corporate portals and intranet collaboration tools was the result of
a sea change that had occurred in terms of how people thought about web
content creation.&nbsp; The original content management systems, whether for
internal or external content, were designed to address what was
perceived as the overriding need to impose control over the process of
how content was published.&nbsp; This was because web technology was still
relatively new in the overall scheme of things, and the fear of the
wrong content going live was the number one concern of anyone involved
in professional web publishing.&nbsp; Fast forward five or so years, and the
web is taken for granted, there isn't the same fear of disaster every
time someone hits the "publish" button, spelling errors can be
corrected later, broken links fixed, etc.&nbsp; The&nbsp; concern now isn't about
enforcing process, it's about making it faster and easier to get your
ideas out there.&nbsp; And most importantly, it's about getting a
conversation going.&nbsp; This is the social factor that essentially took a
market that was previous bifurcated by internal versus external usage
and split it again along process-driven and social-oriented
applications.&nbsp; Needless to say, the products that have focused on the
social side of the equation have seen rapid growth.<br /><br />This is a cleaned-up version of what I drew on the whiteboard to illustrate this concept in a recent meeting:<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="cms_landscape3.png" src="http://www.anuff.com/images/cms_landscape3.png/cms_landscape3.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="384" width="512" /></span>
The goal here isn't to catalog and categorize every vendor in the
space, there are literally hundreds of vendors providing content
management solutions, and even the products listed here have
functionality that straddles these categories.&nbsp; It is, however, a good
way to understand how and why a new category has emerged which is led
by smaller vendors as well as open source projects, in reaction to the
needs of users who are more interested in ad-hoc collaboration rather
than formal processes as they create and interact around the content
and ideas they want to communicate.&nbsp; <a href="http://www.movabletype.com/">Movable Type Pro</a>, which <a href="http://www.movabletype.com/blog/2008/08/movable-type-pro-42.html">Six Apart made available today</a>,
and which I'm excited to have been part of the launch of, is very much
part of that trend, designed from the ground up to serve large scale
Internet communities with content at the core.&nbsp; I think it's going to
be an interesting and exciting time as the lessons that have been
learned in the blogging world start to permeate and transform the rest
of the content management market.<br />]]>
    </content>
</entry>

<entry>
    <title>I&apos;ve joined Six Apart</title>
    <link rel="alternate" type="text/html" href="http://www.anuff.com/2008/08/its-been-about-a-month.html" />
    <id>tag:www.anuff.com,2008://1.4</id>

    <published>2008-08-12T03:34:32Z</published>
    <updated>2008-08-25T04:53:30Z</updated>

    <summary><![CDATA[It's been just under a month since I joined Six Apart as the EVP of Movable Type and Six Apart Services, and I'm sorry to say I'm just getting around to blogging about it.&nbsp; It's always a tug of ware...]]></summary>
    <author>
        <name>Ed Anuff</name>
        
    </author>
    
    <category term="movabletype" label="movable type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sixapart" label="six apart" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="work" label="work" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://www.anuff.com/">
        <![CDATA[It's been just under a month since I joined <a href="http://www.sixapart.com/">Six Apart</a> as the EVP of <a href="http://www.movabletype.com/">Movable Type</a> and <a href="http://www.sixapart.com/services/media-companies-enterprises/">Six Apart Services</a>, and I'm sorry to say I'm just getting around to blogging about it.&nbsp; It's always a tug of ware between the clichés of "eating your own dog food" and "the cobbler's kids going barefoot".&nbsp; I'm not going to get too much into what the company is up to just yet, other than to say we've got a lot of good stuff that will be coming out very soon now.&nbsp; As for as the job itself, I'm enjoying it quite a bit.&nbsp; The company has a great culture and great people, and it's refreshing to be at an Internet company that's revenue focused.&nbsp; I really like the markets the company serves, and there are a lot of things I see that make me confident that the space is going to enter a new phase of growth as the changes brought about by blogging start to permeate and reshape the rest of the media industry.&nbsp; I'll share more thoughts about that here over time.<br />]]>
        
    </content>
</entry>

</feed>
