<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Stu says stuff</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.stucharlton.com/blog/atom.xml" />
    <id>tag:www.stucharlton.com,2010-03-03:/blog//3</id>
    <updated>2012-08-22T16:22:20Z</updated>
    <subtitle>Partially-baked ideas and commentary on technology and society.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.34-en</generator>

<entry>
    <title>RESTfest 2012</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2012/08/restzfest.html" />
    <id>tag:www.stucharlton.com,2012:/blog//3.606</id>

    <published>2012-08-22T16:15:23Z</published>
    <updated>2012-08-22T16:22:20Z</updated>

    <summary>I will be giving the Friday night keynote at the RESTfest unconference in Greenville SC on September 14. The topic should come as no surprise to those who have read my (admittedly stale) entries over the past few years. There...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>I will be giving the Friday night keynote at the <a href="http://www.restfest.org/keynote">RESTfest unconference</a> in Greenville SC on September 14.  The topic should come as no surprise to those who have read my (admittedly stale) entries over the past few years.   There are still a couple of spots open if you'd like a weekend of REST-related discussion in a relaxed environment...</p>

<p><strong>Linking Data and Actions on the Web</strong></p>

<p>Everywhere we look, there's a REST API popping up. For better or worse, we have massive proliferation of Web APIs, and a reasonable bench of developers who know how to design a "good" RESTful API (whatever that means).</p>

<p>The next progression for REST practitioners, in my opinion, is to find ways to ease integration headaches. There's a hole that exists between a site exposing a new API for their startup, and a fully approved media type RFC. This is where a good idea, exposed by an API, transcends its origins but isn't quite at the scale that it can survive 38 draft rounds within the IETF. This is also the area where enterprise integration lies - systems of limited scale and scope that might be able to take advantage of the constraints and emergent properties that the REST style offers.</p>

<p>Two areas of development would be helpful: firstly, a general purpose data model and associated media types for the web. Given the evolution of the semantic web and linked data, this is a hot area of interest, but one fraught with difficulty bringing to the mainstream. Secondly, and less explored, are media types that encourage programming models to shift developer's habits away from remote procedure calls (RPCs). There are Web programming models to explore: today's predominant model being dynamic RPC, but also event-driven, data access (CRUD), and state machine processors. Ideally a Web programming model should avoid the pitfalls of orienting all "write-side" communication in terms of flat actions or generic CRUD actions, but rather should encourage exposing side-effect inducing actions as something that can be extended & shared across the web via hyperlinks and URIs. This talk will explore approaches to linked data and actions on the web, their tradeoffs, and their possible future.</p>]]>
        
    </content>
</entry>

<entry>
    <title>The Montreal Smoked Meat Journey</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2012/04/the-montreal-smoked-meat-journ.html" />
    <id>tag:www.stucharlton.com,2012:/blog//3.605</id>

    <published>2012-04-03T19:05:53Z</published>
    <updated>2012-08-27T18:57:17Z</updated>

    <summary> Montreal Smoked Meat (MSM) is a bit of a religion in Canada, particular for those who live in or around Montreal, Quebec. During my recent time off, I&apos;ve been learning to cook with an outdoor smoker, and one of...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Society" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>
<a href="http://en.wikipedia.org/wiki/Montreal-style_smoked_meat">Montreal Smoked Meat</a> (MSM) is a bit of a religion in Canada, particular for those who live in or around Montreal, Quebec.   During my recent time off, I've been learning to cook with an outdoor smoker, and one of my projects was to try to recreate some quality MSM like the best Jewish delis in montreal such as <a href="http://www.schwartzsdeli.com/">Schwartz's</a> are known for, or perhaps even a Pastrami of NYC <a href="http://katzsdelicatessen.com/">Katz's Deli</a> quality (a religion onto itself).
</p>
<P>
<b>My Recipe (as of April 3, 2012)</b>
</P>
<p>
I didn't invent this recipe, but amalgamated it from several sources (discussed below).
</P>
<p>
<b>Equipment</b><br>
<ol>
<li><b>A kitchen scale.</b> I use one of the smaller, flat digital ones that my girlfriend bought at our local <a href="https://www.philsebastian.com/">gourmet coffee shop</a>.  It measures up to 5kg and has a tare (zeroing) function to remove the weight of containers from the tally. I don't recommend using volume measurements when curing meat, especially with the variability of salt volume available out there.
<li><b>A large sharp knife and fork</b>.  For cutting and serving the meat.
<li><b><a href="http://www.google.com/products/catalog?client=safari&rls=en&q=ziploc+big+bag&oe=UTF-8&um=1&ie=UTF-8&tbm=shop&cid=11277090652388974634&sa=X&ei=10x7T53MLs_UiALO6b0g&ved=0CGoQ8wIwAQ#ps-sellers">Ziplock Big Bags XXL</a></b>.  These are mammoth bags, nearly 2 x 3 feet, food safe, and large enough to seal in a full 15 pound packer brisket during its dry cure.   They can be found at Canadian Tire stores in Canada, or Wal-Mart in the US.    If you are using smaller cuts of meat, you can downward adjust your Ziploc size accordingly.    If you have a big enough tupperware container, that's also usable.
<li><b>A steamer or sous vide immersion circulator.</b>   This could be a stovetop steamer, rice steamer, roasting pan with a rack for the oven, or a large bamboo steamer.  This is for finishing the meat, usually 3 hours.  <i>Note the sous vide approach I will describe below, based on the method in <a href="http://modernistcuisine.com/">Modernist Cuisine</a>.  It requires a suitable bag + sealer that holds a 1:1 ratio of water to meat (thus is only appropriate for smaller cuts) and will require up to 72 hours.</i>
<li><b>An outdoor smoker <i>(optional)</I>.</b>  I use the <a href="http://www.weber.com/explore/grills/smokers-series/smokey-mountain-cooker-18-1">18.5" Weber Smokey Mountain Cooker</a>, which in my opinion the best bang for the buck in terms versatility for a charcoal-fired smoker.  It also has a great <a href="http://virtualweberbullet.com/">online community</a> behind it, dating back to 1997.   <a href="http://www.bradleysmoker.com/">Bradley Smoker</a> makes a great electric smoker which is less versatile but dead simple to use.     <I>Note this is optional because there is some debate as to whether some establishments <b>actually smoke</b> their meat rather than just roast it.   Smokers lead to better flavour, but using the oven will do in a pinch.</I>
<li><b>A digital probe thermometer <i>(optional)</i></b>  For inserting into the meat - it's the reliable way to check doneness reliably.   Every cut of meat is different and may takes way longer or way shorter to get to the desired temperature.  Some ovens run hot, some smokers run hot.    In my case, one brisket took only 3 hours to get to 165 F, another took 5.5 hours.     Overcooking mainly means you may have stringier meat at the end.
<li><b>A moderately cold refrigerator with room or a cold room.</b>  You don't want the meat to rot, you want it to cure, so you don't want to to be super cold.  38-40F or 3C-4.4C.  Try not to go colder than 37F/2.5C.
</ol>
</p>
<p>
<b>Ingredient Summary</b><br>
These are <b>hypothetical</b> quantities based on ratios from the initial cut of meat.   I'm using the <a href="http://modernistcuisine.com/">Modernist Cuisine format</a> due to its ease of reading once you know the recipe; details on these ingredients below.
</p>
<p>
<b>For the Dry Cure</b><br>
<table>
<tr><th>Weight</th><th>Description</th><th>Ratio</th></tr>
<tr><td>5 kg [11 lb]</td><td>Beef Brisket, with fat cap</td><td>100%</td></tr>
<tr><td>0.2 kg [7.04 oz]</td><td>Diamond Crystal Kosher Salt</td><td>4%</td></tr>
<tr><td colspan="3">Note:  Dry cure salt guideline is 1 lb per 25 lb of meat</td></tr>
<tr><td>0.0125 kg [0.44 oz]</td><td>Curing (pink) salt</td><td>0.25%</td></tr>
<tr><td colspan="3">Note: Assuming pink salt is 6.25% nitrate - the guideline is 1 oz per 25 lb of meat</td></tr>
<tr><td>0.1 kg [3.52 oz]</td><td>White Sugar</td><td>2%</td></tr>
<tr><td colspan="3">Note:  Adjust sugar to taste -- down to 0.6%, up to 2.7%; MSM usually has less sugar than pastrami</td></tr>
<tr><td>0.03 kg [1.18 oz]</td><td>Ground Black Peppercorns</td><td>0.67%</td></tr>
<tr><td>0.03 kg [1.18 oz]</td><td>Ground Coriander Seeds</td><td>0.67%</td></tr>
<tr><td>0.025 kg [0.88 oz]</td><td>Mustard Seeds</td><td>0.5%</td></tr>
<tr><td>0.01 kg [0.35 oz]</td><td>Garlic powder</td><td>0.2%</td></tr>
<tr><td>0.01 kg [0.35 oz]</td><td>Ground Cinnamon</td><td>0.2%</td></tr>
<tr><td>0.01 kg [0.35 oz]</td><td>Fennel Seed</td><td>0.2%</td></tr>
<tr><td>0.005 kg [0.18 oz]</td><td>Ground Cloves</td><td>0.1%</td></tr>
<tr><td>0.0025 kg [0.09 oz]</td><td>Chile Pepper Flakes</td><td>0.05%</td></tr>
<tr><td>0.0025 kg [0.09 oz]</td><td>Ground Bay Leaves</td><td>0.05%</td></tr>
</table>
</p>
<p>
<b>For the Rub</b><br>
<table>
<tr><th>Weight</th><th>Description</th><th>Ratio</th></tr>
<tr><td>0.36 kg [12.7 oz]</td><td>Ground Black Peppercorns</td><td>7.2%</td></tr>
<tr><td>0.21 kg [7.4 oz]</td><td>Ground Coriander Seeds</td><td>4.2%</td></tr>
<tr><td colspan="3">Note:  Pepper to Coriander ratio is usually 2:1, this one adds a bit more Coriander</td></tr>
<tr><td>0.1875 kg [6.6 oz]</td><td>White Sugar</td><td>3.75%</td></tr>
<tr><td colspan="3">Note:  Adjust sugar to taste -- down to 0%, up to 7.5%; MSM should have less sugar than pastrami</td></tr>
<tr><td>0.05 kg [1.76 oz]</td><td>Garlic powder</td><td>1%</td></tr>
<tr><td>0.0325 kg [1.14 oz]</td><td>Chile Pepper Flakes</td><td>0.65%</td></tr>
</table>
</p>
<p>
<b>For Smoking</b><br>
<ol>
<li>Charcoal - lump or briquettes, depending on your smoker, enough for 4-5 hours of low heat (250F)
<li>Smoke wood - about 4 to 6 fist-sized chunks of fruit wood (apple/cherry), pecan or maple.  Hickory can be mixed in but sparingly (say 2 pieces out of 6).  MSM traditionally used maple but in modern times isn't smoked at all.  I like pecan.
</ol>
</b>
</p>
<p>
<b>For Serving</b><br>
<ol>
<li>Rye bread
<lI>Mustard
<lI>Pickles (optional)
<lI>A large sharp knife
<li>A large fork
</ol>

</p>
<p>

<b>Dry Cure Procedure</b><br>
<ol>
<li>Trim some fat off the brisket, particularly on sides and top.  Leave at least 1/4 to 1/2" of the fat cap on the bottom.  </lI>
<li>Rub the garlic powder on the brisket. 
<li>Combine the kosher salt with the curing salt, being mindful of meat to salt ratios.   Rub the brisket with the salt mixture.   If there's excess, throw it in the bottom of the ziplock bag.
<li>Grind the remaining dry cure ingredients and mix together in a large bowl.  Rub the meat with the dry cure spices.   There shouldn't be much excess, but it can go in the ziplock.
<li>Place the brisket in the bottom of the ziplock back, try to ensure any excess that was in the bag is evenly distributed on the meat.
<lI>Squeeze the air out of the bag and close the zipper; store the ziplock bag in a cold room or refrigerator, around 38-40F (not super cold).
<lI>Overhaul (turn over) the brisket every 12 hours or so, for 7 days.  Smaller briskets can take less time (roughly, I'd estimate a 6 lb brisket for 5 days, a 15 lb brisket for 9 days).
<li>After the cure, take the brisket out of the bag, and rinse off the curing spices. 
<li>Fill a large sink with water and soak the brisket for 3 hours, changing water every 1/2 hour.   Pat the brisket dry with paper towels.
</ol>
</P>
<p>
<b>Rub and Smoke Procedure</b>
<ol>
<li>Grind the rub ingredients and mix together in a large bowl.  Rub the meat with the dry rub.   
<li>Optionally, wrap the brisket in ziplock again and let it sit in the dry rub in a fridge or cold room for 6-8 hours.   (I skip this sometimes)
<li>Light the smoker with the smoke wood, to 225-250F
<li>Smoke the brisket until it reaches 165F internal temperature - around 4 to 5 hours, depending on the brisket size and temperature of your smoker 
<li>Remove from smoker, and either proceed with steaming, or wrap in foil, then ziplock or plastic wrap, and refrigerate until ready to eat
</ol>
</p>
<p>
<b>Steaming and Serving</b>
<ol>
<li>Carve the fatty (thicker, point end) of the brisket to separate it from the leaner (flat end) meat, and carve again into smaller chunks to fit in your preferred steamer.
<li>If using a stovetop steamer, get the water steaming, and keep on low.   Oven roasting pans should be filled with water up to the rack and the oven set to 200F.   If using sous-vide, set your immersion circulator for 140F.  
<li>Steam for 3 hours, until the brisket is fork tender.  
<li>If using sous vide, you have two options.  (a) Vaccuum pack your chunk and cook for up to 72 hours.  I found this didn't work as well as straight steaming, hence ...   (b) The modernist cuisine way calls for putting an equal weight of the pastrami brine (water would be fine) in the bag with the pastrami, seal it (this may be difficult with non-chamber sealers), and cooking for 72 hours.   I have not personally tried this approach yet.
<lI>Once tender, grab the chunk with a large fork, carve brisket chunks against the grain with a sharp knife, serve on rye bread with mustard.
</ol>
</p>
<p>
<b>Ingredient notes</b>
<ol>
<li><b>Beef cuts</b>.  In order of preference:   Full packer brisket, beef cheeks, boneless short ribs.   Most MSM is from the brisket, and has widest variety of "fatty vs. lean" cuts.   I will be discussing brisket in this recipe, but other cuts are great for beginners (and have great flavour).   Ensure you get a good cut:  USDA Prime or Choice and/or Canada AAA or Prime.  Note that brisket in the USA is much cheaper than in Canada, UDSA Choice runs for $2/pound whereas Canada AAA can be $6-7/pound.   That means in Canada you'd be dropping a C-note for a full packer brisket.
<li><b>Salt</b>.  I prefer Diamond Crystal Kosher Salt's feel and density, but use whatever you can get.   Make sure it's just non-iodized sodium chloride, it isn't a mix.   A 3/4 full box should be sufficient (i.e. a brisket will use up to 2/3 of a pound).   <b>Always measure salt by weight</b> when curing - 2 cups of diamond crystal have the same weight of 1 cup of table salt!  It's the same stuff, but the flakes / crystals are of a different size.
<li><b>Curing (pink) Salt</b> .This is usually a 6.25% Sodium Nitrate (cure) to 93.75% Sodium Chloride (salt) mixture, and died pink to ensure you don't mistake it for regular salt.   This is available at most <a href="http://www.basspro.com/">Bass Pro Shops</a> as <a href="http://www.lemproducts.com/product/169/seasonings_cure_spices">LEM Cure</a>, and one packet will cure up to 100 pounds of meat.   For those worried about the health effects of nitrates, please see <a href=".http://ruhlman.com/2011/05/the-no-nitrites-added-hoax/">this blog post from Michael Ruhlman</a>.   In short:  don't worry about it.  Use only the amount required, and it is safe.
<li><b>Sugar</b>.  White refined is fine; demerara or turbinado sugar also is fine and you may prefer the more molasses-y taste.
</ol>
</p>
<p>
<b>Sources of Recipe Inspiration</b></p><p>
This is a direct derivation of what I learned from these sources, and all credit goes to them for pioneering home smoked MSM / Pastrami:
<ol>
<li>This <a href="http://chowhound.chow.com/topics/794033">Chowhound thread</a>
<li>This <a href="http://forums.egullet.org/topic/24820-the-great-pastrami-smoked-meat-experiment/">eGullet thread</a>
<li> The <a href="http://modernistcuisine.com">Modernist Cuisine</a> bookset, which has a very similar ingredient list to mine, but uses a brine instead of a dry cure, and has more sugar, since it is Pastrami.
<li>The <a href="http://www.threesquabblingasians.com/making-my-own-pastrami/">Three Squabbling Asians</a>
<li>The <a href="http://virtualweberbullet.com/pastrami.html">Virtual Weber Bullet</a> recipe from Chris Allingham
<li>The <a href="http://tvwbb.com">Virtual Weber Bulletin Board</a> threads on Pastrami and MSM
<lI> And last but not least, <a href="http://ruhlman.com/2011/09/how-to-make-pastrami/">Michael Ruhlman</a>
</ol>
</p>
<p>
<b>Photos</b></p><p>
<ol>
<li> See my <a href="http://www.flickr.com/photos/91782525@N00/sets/72157631275547536/">Flickr photoset</a> for a few of photos of the ziplock bag , brisket, and yummy results from a couple of attempts.
</ol>
</p>

]]>
        
    </content>
</entry>

<entry>
    <title>Returning to the living</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2012/04/returning-to-the-living.html" />
    <id>tag:www.stucharlton.com,2012:/blog//3.604</id>

    <published>2012-04-03T19:04:47Z</published>
    <updated>2012-04-03T19:05:30Z</updated>

    <summary>I&apos;ve been off the past few months recovering from illness and just generally relaxing. Blogging to recommence....</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Blather" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>I've been off the past few months recovering from illness and just generally relaxing.   Blogging to recommence.</p>]]>
        
    </content>
</entry>

<entry>
    <title>The trouble with APIs</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2011/06/the-trouble-with-apis.html" />
    <id>tag:www.stucharlton.com,2011:/blog//3.603</id>

    <published>2011-06-09T13:45:20Z</published>
    <updated>2011-06-10T13:45:29Z</updated>

    <summary>I posted a couple of thoughts on Twitter and a few comments elsewhere recently as a results of a discussion on George Reese&apos;s blog and William&apos;s followup. I thought I&apos;d repost these thoughts here with annotation as it seems to...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>I posted a couple of thoughts on Twitter and a few comments elsewhere recently as a results of a discussion <a href="http://broadcast.oreilly.com/2011/06/the-good-the-bad-the-ugly-of-rest-apis.html">on George Reese's blog</a> and <a href="http://stage.vambenepe.com/archives/1777">William's followup</a>.   I thought I'd repost these thoughts here with annotation as it seems to be evolving an interesting discussion.</p>

<p><B>1. REST APIs are a case of good intentions run amok. The point of REST was to *eliminate* specific APIs. Not cause their proliferation.  </p>

<p>2. When someone says you shouldn't document a REST API, they're saying you shouldn't have an API. Not that you shouldn't document.<br />
</B></p>

<p>I mean by this, Network APIs.   I also mean APIs that aren't re-implementable across sites.    The point is that the uniform interface isn't just HTTP - it's a small number of evolving media types, and the goal is to enable <i>sharing of information</i> at a global scale.  Your pet JSON format may not be the way to do this.</p>

<p><B>3.   That said, RESTians saying you shouldn't have an API are somewhat vacuous because they offer no good alternative. Custom media types ain't.</p>

<p>4.  Thus, IMO, until we have a workable generic media type or two for the 80% case of "REST APIs", we're just growing a frustrating mess.</B></p>

<p> In other words, I completely recognize that crafting a media type is a bit heady, and even still a custom media type for generic use is quite hard.    With a REST API at least you get the benefits of HTTP GET (to some degree).    It does the job, if all you want is a trendy vaguely hopeful way of building something for the long term without getting too bogged down in philosophy.   I get it.</p>

<p>What I would like to see is a generic media type (above & beyond a "format" like JSON) to cover the 80/20 cases.   This is seemingly contrary to where many RESTheads are at - they prefer often prefer opinionated media types, media types that "say something".    </p>

<p>I'm actually asking for that too, I think -- say something about the <b>programming model</b> that breaks people's habits away from RPCs.   Find a programming model that doesn't orient all "write-side" communication in terms of a flat list of actions, and into something that can be extended & shared across the web via hyperlinks and URIs.  Hierarchical statecharts is my stab at this.   There may be others.</p>

<p><b>5.   From William's blog (with a couple tweaks)....</b></p>

<p>I've sort of half given up on REST advocacy because it's pretty impossible these days. People want to ship APIs that will be valid for the next next 6 months, not build systems that will evolve over a decade or more.</p>

<p>Jan Algermissen's comment about how when you've documented an API, you're not really doing REST, is actually spot on, fundamentally, but is met with ridicule. I can completely understand how vacuous the comment sounds if you just want to ship an API nownownow, are being short-term practically minded, or are just playing buzzword bingo with architectural styles. But if we actually want to leverage the benefits of the style, we'd work on the core issue of having a generic media type or two for these sorts of use cases.</p>

<p>If one is thinking of "how to methods map to my URI structures", we've basically lost the plot as to why we have HTTP, URIs and media types in the first place. The goal is to *eliminate* the API as we normally think of it.   (It's not about a library of calls over a network).</p>

<p>Five points. The consequences of REST changes some rules:</p>

<p>1. The assumption can't be that the end user of your information service is going to be a programmer. Building an API bakes that assumption in how you expose your information or controls to manipulate it. The assumption rather should be that "this can be any agent of any sort". If your goal really is "I want a programmer to learn my API and program against this", then there's really no reason to use REST other than that it's trendy (and HTTP GET).</p>

<p>2. The assumption can't be that you will be the only site implementing your interface. The whole point of the Web is sharing information - publishing an API bakes in the assumption that YOU, the publisher, are in control. It is the consumer, on the other hand - the agent itself, that's in control of how/what the information is consumed or manipulated.</p>

<p>3. The semantics of the interface that need to be documented are the media type that you use to describe your data and links. The structure of your URIs really shouldn't be a part of said semantics.</p>

<p>4. But doing this in a custom media type implies #2, that you're the only person implementing your interface. Of course, every media type has to start somewhere, but it really doesn't help matters unless you understand that others may be *implementing* your interface, not just *talking* to it. Facebook's Open Graph, for example, is an example of a custom overlay media type that takes great pains to be generic in either direction.</p>

<p>5. All of the above is really heady stuff that is above most developer's pay grades, so it won't ever happen. The best we can hope for is some person/organization to step up with a generic media type or two + guidelines that help describe and document a Web of Data interface for accessibility by programmers. Call it a description language, if you'd like. Some RESTians don't like the idea of a description language. I think it's an essential 80/20 piece if developers are going to actually *use* the architecture the way it was meant to be used.</p>

<p>Currently (as I mentioned in my WS-REST keynote) I think some kind of hierarchical lifecycle/state machine might be the right abstraction for such an interface. I'd like to demonstrate this if I ever got past my day job sucking up most of my time.   (But I may have an opportunity to work on this there soon.)</p>]]>
        
    </content>
</entry>

<entry>
    <title>WS-REST Keynote Slides and Recording</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2011/03/ws-rest-keynote-slides-and-rec.html" />
    <id>tag:www.stucharlton.com,2011:/blog//3.602</id>

    <published>2011-03-28T16:56:37Z</published>
    <updated>2011-03-29T07:44:35Z</updated>

    <summary>Slides for my keynote, &quot;I&apos;ll See you on the Write Side of the Web&quot; at the 2nd International Workshop for RESTful Design, WWW 2011 in Hyderabad, India are available here. Recording (75 minutes) is now available at this link. (It&apos;s...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>Slides for my keynote, <a href="http://ws-rest.org/2011/program/keynote">"I'll See you on the Write Side of the Web"</a> at the 2nd International Workshop for RESTful Design, WWW 2011 in Hyderabad, India are <a href="/stuff/WSREST2011Keynote.pdf">available here.</a>   </p>

<p>Recording (75 minutes) is now <a href="http://stucharlton.com/stuff/WSREST2011.m4a">available at this link.</a>   (It's an M4A / AAC file, sorry).</p>

<p>I'll eventually post my thoughts on the workshop along with feedback & discussion from this keynote.</p>]]>
        
    </content>
</entry>

<entry>
    <title>WS-REST 2011 Keynote</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2011/02/ws-rest-2011-keynote.html" />
    <id>tag:www.stucharlton.com,2011:/blog//3.601</id>

    <published>2011-02-21T22:52:45Z</published>
    <updated>2011-02-21T22:56:35Z</updated>

    <summary>I will be giving the keynote at the 2nd International Workshop on RESTful Design, entitled: I&apos;ll See You on the Write Side of the Web. Yes, I do wonder if I have Brain Damage some days ;) Here&apos;s the abstract:...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>I will be giving the keynote at the 2nd International Workshop on RESTful Design, entitled:  <B>I'll See You on the Write Side of the Web</B>.  </p>

<p>Yes, I do wonder if I have <a href="http://www.youtube.com/watch?v=T1bgxfxchkQ">Brain Damage</a> some days ;)</p>

<p>Here's the abstract:</p>

<p>While global-scale digital information sharing has become synonymous with REST, <br />
state manipulation remains an inconsistent experience.  Many so-called "RESTful <br />
APIs" are specified out of band, through documentation, rather than in <br />
hypermedia.  Developers struggle with constructing their own custom <br />
hypermedia-driven media types, falling back on lightweight site-specific data <br />
structures.  And the few standardized publishing media types, such as the Atom <br />
Publishing Protocol, have had limited adoption.  All of this serves to undermine <br />
the serendipitous reuse of "writes", a quality we take for granted when dealing <br />
with "reads".  Of course, state-changing actions are semantically much more <br />
difficult to describe generically than a simple HTTP GET, and it is an open <br />
question as to whether it's even possible to do so practically.  </p>

<p>This talk will explore whether there's an opportunity to provide generalized <br />
media types and programming frameworks to assist with resource state <br />
manipulation, and what they might look like, drawing inspiration from other <br />
computing domains with dynamic environments, such as video games, robotics, and <br />
embedded systems controllers.</p>

<p><br />
Slides will be posted around the same time as the keynote.</p>

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

<entry>
    <title>WS-REST 2011 Workshop Call for Papers</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2011/01/ws-rest-2011-workshop-call-for.html" />
    <id>tag:www.stucharlton.com,2011:/blog//3.600</id>

    <published>2011-01-06T15:14:25Z</published>
    <updated>2011-01-06T15:24:12Z</updated>

    <summary>The Second International Workshop on RESTful Design (WS-REST 2011) is a forum for discussion and dissemination of research on the the Web&apos;s architectural style, Representational State Transfer (REST). It will be held on March 28, 2011 as part of WWW...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>The Second International Workshop on RESTful Design (WS-REST 2011) is a forum for discussion and dissemination of research on the the Web's architectural style, Representational State Transfer (REST).  It will be held on March 28, 2011 as part of WWW 2011 in Hyderabad, India.</p>

<p>Last year had a high quality set of attendees and submissions, and was a great opportunity to meet those involved in this community. </p>

<p>I'm on the program committee again this year.  We are accepting four-page position papers, or eight-page full research papers on your favourite REST topic.  <a href="http://ws-rest.org/2011/cfp">Send your papers in by Jan 31st!</a>  Even if you can't make it to India, it will be a great forum to disseminate your research!<br />
  </p>]]>
        
    </content>
</entry>

<entry>
    <title>Time for REST is over</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/11/time-for-rest-is-over.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.599</id>

    <published>2010-11-12T15:05:59Z</published>
    <updated>2010-11-16T18:09:35Z</updated>

    <summary>Just read William&apos;s Partial resource update, one more time, which is another kick at the partial resource update can. The problem is that few web services or RESTful hypermedia describe a data model. Representations themselves don&apos;t often describe a data...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>Just read William's <a href="http://stage.vambenepe.com/archives/1665"> Partial resource update, one more time</a>, which is another kick at the partial resource update can.</p>

<p>The problem is that few web services or RESTful hypermedia describe a data model.   Representations themselves don't often describe a data model, they describe a format.    This is the same problem as WS-RT, in that they're trying to describe updates to a format (XML), not a data model.   </p>

<p>In Atom, this doesn't matter, as it kicks the responsibility to the entry.<br />
In HTML, this doesn't matter, as the machinery of browser & server only needs the format for interoperability.</p>

<p>In systems-to-systems communication, this matters a whole lot, as you're coupling your expectations differently with every media type.</p>

<p>A data model is foundational, it describes the mathematical basis for how <b>data is managed</b>.  Examples (for better or worse) include:<br />
<OL><br />
<LI>Key/Value</LI><br />
<LI>Arrays</LI><br />
<LI>Relations</LI><br />
<LI>Logical Graph</LI><br />
<LI>Inverted List</LI><br />
</OL></p>

<p><a href="http://odata.org/">OData</a> describes an implicit data model, based on relations.   <a href="http://en.wikipedia.org/wiki/Resource_Description_Framework">RDF</a> and OWL describe graph data models with an explicit theoretic foundation that makes them more powerful than Relations.    </p>

<p>"Your New JSON Service" probably has a data model, but I bet it's unpublished, and in your head.  And even if you did publish it, it probably is different from "this other guy's JSON Service".</p>

<p>What does all of this mean?   I think it means that there's two big pieces of work to be done to help evolve RESTful web services to better interoperability:</p>

<p>(a) a data model that covers 80% of common use cases and can be formatted with JSON and XML.  This needs to be a closed-world model, like most databases, and thus I don't think RDF qualifies. </p>

<p>(b) a media type that covers 80% of common use cases to describe a resource's lifecycle and state transitions -- in other words, to make POSTs self-descriptive in hypermedia.   Because the world of computing isn't just about updating data, it's about abstractions.  </p>

<p>It is passe' to perform SQL updates directly from your GUI.  It's just as passe' to expect every RESTful hypermedia API to just behave like a database entity.  So, we need something in between, something that gives POST meaning to systems.   POST is the method which powers most of what we DO (vs. read) on the Web anyway.  This "roll your own media type" trend works for simple situations, but really isn't sustainable in the long run, in my opinion.</p>

<p>p.s. yes, that "Part 2" of building a hypermedia agent article is coming ;-)</p>]]>
        
    </content>
</entry>

<entry>
    <title>Put on your Thinking CAP</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/10/put-on-your-thinking-cap.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.598</id>

    <published>2010-10-28T17:35:55Z</published>
    <updated>2010-10-28T19:17:31Z</updated>

    <summary>In light of some interesting twitter, blog, and IM discussions over yesterday&apos;s post (thanks to Chad Walters, Billy Newport, Ryan Rawson, Bill de hOra, Jeff Darcy, and others), I&apos;ve been pondering three CAP points. Last post on this topic (for...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>In light of some interesting twitter, blog, and IM discussions over yesterday's post (thanks to <a href="http://twitter.com/chad_walters">Chad Walters</a>, <a href="http://twitter.com/billynewport">Billy Newport</a>, <a href="http://twitter.com/ryanobjc">Ryan Rawson</a>, <a href="http://twitter.com/dehora">Bill de hOra</a>, <a href="http://twitter.com/obdurodon">Jeff Darcy</a>, and others), I've been pondering three CAP points.  Last post on this topic (for a bit), I promise, before I return to your regularly scheduled RESTful programming.</p>

<p><B>1.  Definitions Matter.  Or, are CA/CP are the same thing?</B></p>

<p>Gilbert & Lynch's paper defines the following (I'm not going to use their exact terms, so as to keep this accessible)</p>

<p><UL><LI><B>Consistency (big-C)</B>- aka Atomicity, or a total order on operations (as visible to any user); aka. by database practitioners as serializable isolation.  Makes distributed systems look like a single system.</LI></p>

<p><LI><B>Eventual Consistency (little-C)</B>- aka Delayed-t Consistency, or a bounded amount of time before a data object is consistent, also implies a minimum latency between writes on a single piece of data (without specialized conflict resolution)</LI></p>

<p><LI><B>Weak Availability (little-A)</B>- every request received  from a non-failing node must result in a response, but this response may take forever to come  (i.e. latency is not a part of this definition)</LI></p>

<p><LI><B>Strong Availability (big-A)</B>- every request received from a non-failing node must result in a response even when network partitions occur, but this response may take forever to come (i.e. latency is not a part of this definition)</LI></p>

<p><LI><B>Strong Network Partition Tolerance (big-P)</B>- the network will be allowed to lose arbitrarily many messages sent from one node to another (not counting total network outage).  When a network is partitioned, all messages sent across the partition are lost.   </p>

<p></UL><br />
I'm going to add the following:<br />
<UL><br />
<LI><B>Weak Network Partition Tolerance (little-P)</B>- a system that can tolerate some network partitions, but not all combinations of them. </LI><br />
</UL></p>

<p>I add this due to my reading of their definition of Big-P and sections 3.2.1 and 3.2.2:  "If there are no partitions, it is clearly possible to provide atomic, available data.  In fact the centralized algorithm described in Section 3.2.1 meets these requirements.  Systems that run on intranets and LANs are an example of these type of algorithms".    Section 3.2.1 defines an algorithm for Consistent & Partition Tolerant systems.    Hang on to this one, I'll finish my point in a moment.</p>

<p>So, by these definitions, you basically can have (assuming mixed reads & writes):<br />
- AP:  eventual consistency, strong availability, strong partition tolerance<br />
- CP:  strong consistency, weak availability, strong partition tolerance<br />
- CA:  strong consistency, strong availability, weak partition tolerance</p>

<p>Clearly an AP system is different from CP/CA.  But the crux is whether CA and CP are the same kind of system.   If you consider the idea of weak vs. strong partition tolerance, the difference becomes clear (to me, anyway, but I'm admittedly blonde).</p>

<p>A CA system might be able to handle <b>some</b> partitions, but not <b>all</b>.  Simply put, it has a single point of failure, somewhere.  The example I like to give is a shared-disk cluster database with a SAN.   Partition the SAN, and you're hosed.  Partition the nodes, or even the interconnect, and you will still be available, albeit with higher latency.  Redundancy is the common way to reduce this risk.</p>

<p>Whereas a CP system is designed to handle <b>all</b> partitions, i.e. it has no single point of failure.   But some non-failed nodes may not be able to service clients at all during a partition.  This can suck.    Anyone who's managed a synchronous log shipping setup or EMC SRDF probably knows about this one.</p>

<p><br />
<B>2.  Scope matters</B></p>

<p>The definition of "node" and "network" can vary depending on your granularity and scope.   </p>

<p>The above definitions only make sense if the scope of the system is the server-side of a client/server relationship.   (i.e. How can non-failed nodes experiencing a partition still receive and respond to a request?  Only if the client isn't the one being partitioned.)</p>

<p>A database that's normally a CA system can be considered CP if you zoom out to notice that it's in a multi-node synchronous replication ring.   Or AP if it's in an asynchronous multi-node replication ring.   But notice that, probabilistically, it's behaving like a CA system for 99.9% of the time (or however long your MTBF is).</p>

<p>An AP system on the other hand has one big drawback, one that's not spoken about often.   It's about the scope of the partition: is it recoverable or not?</p>

<p>An unrecoverable partition in a CP or CA system is "no data loss", even if you can't get at the system.   That's not true in an AP system, if there's an unrecoverable error in a certain set of nodes during the "delayed consistency" time window.   This occurs during catastrophic media failures, like a bug in the SAN controller corrupting all the disks, trucks driving through a data center, or floods, or bombs, hurricanes, etc.   </p>

<p>Even with backups, during this "replication latency", you have to re-enter those transactions, or hope that a CP or CA system somewhere has a copy.</p>

<p><B>3.  Definitions are too easy to get hung up on.</B></p>

<p>One of the main reasons I'm talking about this is because I see bolded, underlined claims that can be easily misconstrued, like, "you can't choose consistency and availability together in a distributed system".  This gives me The Fear.</p>

<p>This point of the above quote, is not to say you can't have <b>some consistency</b>.   You just can't have <b>fully serializable consistency and isolation</b>.  </p>

<p>But in practice, when you think about it, this claim is actually rather banal.   Practitioners have long understood that there are a spectrum of consistency & isolation tradeoffs at scale, even at a single node.    Why?   </p>

<p>Because the definition of availability arguably <b>needs to also include latency</b>, which is something Daniel Abadi brought up.   Serializability means locks, in practice, and that means increased latency, and thus reduced availability.  This is why we don't like Two Phased-Commit very much these days.   </p>

<p>But, for kicks,  go back to the <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.50.9657&rep=rep1&type=ps">ANSI SQL isolation level debate</a> that Jim Gray stirred up.   It was because databases like Oracle (gasp) don't provide serializable consistency, and haven't since the late 1980s!   They provide snapshot consistency, which is a different beast where readers don't block writers, and arguably was the primary technical reason for Oracle's success in the market place through the 1990s.   Amusingly, this is the same argument that Jim Starkey keeps bringing up when discussing CAP, having invented the idea of multi-version concurrency control, when he's talking about his new baby, Nimbus DB.</p>

<p>So the idea that you can't have fully serializable consistency at scale -- even in a single node database -- is completely uncontroversial.   It's when the followup feels like "...and therefore you need to throw out your RDBMS", that cognitive dissonance and tempests in a tweetpot stirs up.  </p>]]>
        
    </content>
</entry>

<entry>
    <title>Confused CAP Arguments</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/10/confused-cap-arguments.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.597</id>

    <published>2010-10-27T19:13:27Z</published>
    <updated>2010-10-27T22:58:34Z</updated>

    <summary>A bit of a Twittergasm lately over the CAP Theorem, with relevant blog posts You Can&apos;t Sacrifice Partition Tolerance by coda hale Problems with CAP by Daniel Abadi Clarifications on the CAP Theorem by Mike Stonebraker Reactions to Coda&apos;s CAP...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>A bit of a Twittergasm lately over the CAP Theorem, with relevant blog posts<br />
<UL><br />
<LI><A href="http://codahale.com/you-cant-sacrifice-partition-tolerance/">You Can't Sacrifice Partition Tolerance</A> by coda hale </LI><br />
<LI><A href="http://dbmsmusings.blogspot.com/2010/04/problems-with-cap-and-yahoos-little.html">Problems with CAP</A> by Daniel Abadi</LI><br />
<LI><A href="http://voltdb.com/blog/clarifications-cap-theorem-and-data-related-errors">Clarifications on the CAP Theorem</A> by Mike Stonebraker</LI><br />
<LI><A href="http://pl.atyp.us/wordpress/?p=3068">Reactions to Coda's CAP Post</A> by Jeff Darcy</LI><br />
<LI><a href="http://pl.atyp.us/wordpress/?p=3110">Someone is Wrong on the Internet</A> by Jeff Darcy</LI><br />
</UL></p>

<p>I am confused.   I've narrowed it down to 7 matters.</p>

<p><B>Confusion #1:  Changing system scope from underneath our feet</B><br />
The biggest confusion I have is that the scope of "distributed system" under the CAP theorem seems to have changed, silently.  </p>

<p>If you look at the original papers:<br />
<UL><br />
<LI><a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.4274&rep=rep1&type=pdf">Lessons from Giant-Scale Services</a> by Brewer</LI><br />
<LI><a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.24.3690&rep=rep1&type=pdf">Harvest, Yield, and Scalable Tolerant Services</a> by Fox & Brewer</LI><br />
<LI><a href="http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf">Toward Robust Distributed Systems</A> presentation by Brewer</LI><br />
<LI><a href="http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=A0C9E7FE6DCCECF8844DBB1358D399CB?doi=10.1.1.20.1495&rep=rep1&type=pdf">Brewer's Conjecture and the Feasibility of Consistent Available Partition-Tolerant Web Services</a></LI> by Gilbert & Lynch</LI><br />
</UL></p>

<p>All of them seem to scope the CAP theorem to the <B>server side of a client/server relationship</B>.   That is, it's assumed that the distributed system under consideration is a client/server architecture, but the server-side is distributed in some way.   This is a reasonable assumption, since the Web is a client/server architecture variation, and CAP was originally about the tradeoffs in huge scale web sites.  </p>

<p>But practically speaking, this is particularly important when considering Partition Tolerance.   In the original papers, CA (Consistent, Available) was absolutely common, and in fact, the most common scenario, with Brewer giving examples like cluster databases (on a LAN), single-site databases, LDAP, etc.   The most popular commercial cluster databases today arguably retain this definition of CA, such as Oracle's RAC.   </p>

<p>But now, AP (availability, partition tolerance) advocates are questioning if CA distributed systems are even possible, or merely just something that insane people do.    It's a very strange, extreme view, and I don't think it offers any enlightenment to this debate.   It would be good to clarify or at least offer two scopes of CAP, one within a server scope, and another in a system-wide scope.</p>

<p><B>Confusion #2:  What is Partition Intolerance?</B></p>

<p>This is never well defined.   Like lactose intolerance, the results, can be, err, unpredictable.   It seems to imply one of: complete system unavailability, data  inconsistency, or both.   It's also unclear if this is recoverable or not.   Generally it seems to depend on the implementation of the specific system.    </p>

<p>But because of this confusion, it's easy to let one's mind wander and say that a CA system "acts like" an AP or CP system when experiencing a partition.  That leads to more confusion as to whether a CA system really was just a CP system in drag all along.</p>

<p><B>Confusion #3:  Referring to Failures Uniformly</B></p>

<p>It seems to be a simplifying assumption to equate failures with network partitions, but the challenge is that there are many kinds of failures:   node failures, network failures, media failures, and each are handled differently in practice.    </p>

<p>Secondly, there are systems with many different kinds of nodes, where they tolerate partitions in one kind of node, but not another kind, or just maybe just not a "full" partition" across two distinct sets of nodes.   Surely this is an interesting property, worthy of study? </p>

<p>Taking Oracle RAC or IBM DB2 pureScale, as an example.  It actually tolerates partitions of many sorts - cluster interconnect failures, node failures, media failures, etc.  What it doesn't tolerate is a total network partition of the SAN.    That's a very specific kind of partition.   Even given such a partition, the failure is generally predictable in that it still prefers consistency over availability.</p>

<p><B>Confusion #4:  Rejecting Weak vs. Strong Properties</B></p>

<p>Coda hale sez: "You cannot, however, choose both consistency and availability in a distributed system [that also tolerates partitions]".</p>

<p>Yet this seems very misleading.  Brewer's original papers and Gilbert/Lynch talk about Strong vs. Weak consistency and availability.    The above statement makes it sound as if there is no such thing.</p>

<p>Furthermore, most distributed systems are layered or modular.   One part of that system may be CA-focused, the other may be AP-focused.   How does this translate to a global system?</p>

<p><B>Confusion #5:  Conflating Reads & Writes</B></p>

<p>Consider the Web Architecture.   The Web is arguably an AP system for reads, due to caching proxies, but is a CP system for writes.    </p>

<p>Is it useful to categorize a system flatly as binary one or the other?</p>

<p><br />
<B>Confusion #6:   Whether AP systems can be a generic or the "default" database for people to choose </B></p>

<p>AP systems to my understanding are application-specific, as weak consistency is difficult to correct without deep application knowledge or business involvement.   </p>

<p>The question and debate is, what's the default database for most IT systems... should it be a traditional RDBMS that's still a CA system, like MySQL or Oracle?   Or should it be an AP system like a hacked-MySQL setup with Memcached (as AP), or Cassandra?</p>

<p> When I see claims that CA advocates as "not getting it", or "not in their right mind", I have a severe case of cognitive dissonance.   Most IT systems don't require the scale of an AP system.   There are plenty of cases of rather scalable, highly available CA systems, if one looks at the TPC benchmarks.    They're not Google or Amazon scale, and I completely agree that an AP system is necessary under those circumstances.   I even agree that consistency needs to be sacrificed, especially as you move to multi-site continuous availability.   But it's very debatable that the <b> basic database itself </b> should be CA by default or AP by default.</p>

<p>For example, many IT shops have built their mission-critical applications in a CA manner within a single LAN/rack/data-centre, and an AP manner across racks or data-centres via asynchronous log shipping.   Some can't tolerate any data loss and maintain a CP system with synchronous log shipping (using things like WAN accelerators to keep latency down).       And not just for RDBMS - this is generally how I've seen Elastic Data Cache systems (Gigaspaces or Coherence or IBM WebSphere ExtremeScale) deployed.    They deal with the lack of partition tolerance at a LAN level through redundancy.    </p>

<p>It's useful to critique the CA single-site / AP multi-site architecture, since it's so common, but it's still not clear this should be replaced with AP-everywhere as a useful default.</p>

<p><B>Confusion #7:   Why people are being a mixture of dismissive and douchey in their arguments with Stonebraker</B></p>

<p>Stonebraker's arguments make a lot of sense to IT practitioners (I count myself as one).   He speaks their language.  Yes, he can be condescending, but he's a rich entrepreneur - they get that way.  Yes, he gets distracted and talks about somewhat off-topic matters.  Neither of those things implies he's wrong overall.   Neither of these things imply that you're going to get your point across more by being dismissive or douchey, however good it feels.   (I'm not referring to anyone specifically here, just a general tone of twitter and some of the snark in the blog posts.  )</p>

<p><br />
One particular complaint I find rather naive - that he's characterizing CAP theorem (more AP system) proponents as <b>only</b> using CAP theorem to evaluate distributed system availability.   Clearly that's not true, but on the other hand, it is kind of true.</p>

<p>Here's the problem:   when I hear venture capitalists discussing the CAP theorem over cocktails because of their NoSQL investments, or young newly-graduated devs bugging their IT managers to use Cassandra, you can bet that plenty of people are making decisions based on a twisted version of the new fad, rather than reality.   But that's how <b>every technology fad</b> plays out.   I think Stonebraker has seen his share of them, so he's coming from that angle, from my view.   Or he could just be an out of touch dinosaur like many seem fond of snarking.   I personally doubt it.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Still Hunting for that Silver Lining</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/10/still-hunting-for-that-silver.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.596</id>

    <published>2010-10-27T19:01:37Z</published>
    <updated>2010-10-28T03:53:54Z</updated>

    <summary>Yeah, I&apos;ve been kind of silent lately. Hopefully that will change now that I&apos;m out of my cave. I&apos;m no longer involved full-time with Elastra; I do remain a part time advisor. One day the story will be told. Until...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Blather" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>Yeah, I've been kind of silent lately.  Hopefully that will change now that I'm out of my cave.</p>

<p>I'm no longer involved full-time with Elastra; I do remain a part time advisor.   One day the story will be told.   Until then, I highly recommend reading <a href="http://steveblank.com/">Steve Blank's</a> blog & books for an apropos understanding of how startups often struggle and remain stubborn in the face of said struggle.  On the bright side, the current team has their head screwed on straight and is still doing great work.</p>

<p>What am I up to?   Consulting, for now at least!  Jetstream Cirrus is my company, and yes, there are intentionally many ways of reading into that name.   I'm offering independent advice & implementation on integration architecture, REST, agile operations, scalable systems, and cloud computing consulting in the U.S. and Canada.</p>]]>
        
    </content>
</entry>

<entry>
    <title>WS-REST Musings:  Interoperability is Hard Work</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/05/wsrest.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.591</id>

    <published>2010-05-11T15:43:00Z</published>
    <updated>2010-05-11T15:52:25Z</updated>

    <summary>Part of my continued series of reflections on the WS-REST workshop. It may continue to amaze, but the most basic aspects of interoperability continue to have a common problem: the implementation almost always violates the protocol specs that it supports....</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="interoperability" label="interoperability" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rest" label="rest" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="workshop" label="workshop" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wsrest" label="ws-rest" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>Part of my <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html">continued series</a> of reflections on the WS-REST workshop.</p>

<p>It may continue to amaze, but the most basic aspects of interoperability continue to have a common problem:   the implementation almost always violates the protocol specs that it supports.	And that violation often gets encoded into practice, and back into the spec.  Sometimes this is for good reasons, sometimes not.</p>

<p><a href="intertwingly.net/">Sam</a> drew from his experience with early SOAP interoperability to illustrate the problem.	Apache SOAP, for example, a descendent of IBM SOAP4J, and the predecessor to Apache Axis, had a history of supporting the early SOAP spec, when it was a vendor-led W3C note. It had encoded data with the SOAP encoding section of the SOAP specification, because the <a ref="http://www.w3.org/2001/XMLSchema">XML Schema</a> data type system was not due to be out until mid 2001.</p>

<p>Of course, early specifications often under-specify, and that leads to implementation leaking through.   A classic borderline cases is representing "Infinity".	XML Schema suggests that infinity should be represented as the characters "INF". Apache SOAP, predating this, used the java.util.Number class, whose toString() method generated "Infinity".	</p>

<p>The fix is simple enough, but there were deployed systems out there already. The solution was to continue to produce "Infinity", but to accept both "INF" and "Infinity".   Future SOAP stacks, like Axis, which were built around XSD in mind, both produced and consumed INF.</p>

<p>My first reaction to a lot of this was, "conform to the (damn) specification".	If it were only so simple.    Sometimes the spec is wrong or incomplete.	Sometimes a boundary condition is missed by implementers.	And organizational inertia makes it hard to upgrade.	So, documenting what is implemented becomes the preference.</p>

<p>None of the above has really any difference with REST.	   One of the takeways:  <strong>contracts matter</strong>.   <br />
 <br />
I know that there's trepidation about the term "contract" among those in the REST community, in that it may envision a rigid interface.  I think it's a price worth paying -- you cannot eliminate the notion of "contract" when interoperability is a concern.  Contracts are not about how rigid or flexible the interface is. They are about ensuring complete, understood, and compliant expectations.	And, frustratingly, they cannot be well-specified if there isn't any implementation experience.</p>

<p>One might argue that the Web has proven very good at composing contracts together -- transfer protocol, media types, identifiers, etc.   It didn't eliminate the painstaking need for agreement, it depends on it.   Those interested in philosophy might find this an interesting paradox, that the explosion of freedom & diversity of web content and applications requires strong control at the lower layers -- an idea Alexander Galloway explores in his book, <a href="http://books.google.com/books?id=7ePFlE5oo7kC&printsec=frontcover&dq=protocol+galloway&source=bl&ots=9oEAYx5auW&sig=ZIL5rRs7mfQ6KGgxuSIzLVGoHJg&hl=en&ei=HXjpS-SRN5HStgPFwsHNBw&sa=X&oi=book_result&ct=result&resnum=2&ved=0CB0Q6AEwAQ#v=onepage&q&f=false">Protocol:  how control exists after decentralization</a>.  Practically speaking, the areas of the Web where there was lax specification and/or complex implementation compromises are the areas where there's not a lot of diversity - such as browsers, which have to deal with HTML, CSS, JS, etc.   Servers haven't been immune from this, but they have somewhat more understandable specs to follow, with HTTP, MIME, URI, etc., though ambiguity with HTTP has led to a dearth of complete HTTP 1.1 deployments (most use a subset).  This has led to the work on <a href="http://datatracker.ietf.org/wg/httpbis/charter/">HTTPbis</a> to clean up and clarify the spec based on over a decade of experience.   </p>

<p>Considering today's new generation of RESTful APIs on social media & cloud platforms, there are some curious trends.  JSON-based RESTful services, for example, do not specify dates, or formal decimals.  XML (schemas) do have standardized simple types, but the syntax and infoset is off-putting due to its lack of fidelity with popular programming languages.    Which is better for interoperability?   Maybe the answer is because JSON is so easy to parse, it's ok that each endpoint needs to adapt to a particular set of quirks, like differing date/time formats.	But that sounds like a very developer-centric argument, something that serves the lazy side of the brain.  We can do better.</p>]]>
        
    </content>
</entry>

<entry>
    <title>WS-REST musings:  Put Down the Gun, Son</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-put-down-the-g.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.595</id>

    <published>2010-05-07T16:25:59Z</published>
    <updated>2010-05-07T17:24:35Z</updated>

    <summary>Part of my continuing series of reflections on the REST workshop at WWW 2010... Sam Ruby&apos;s keynote began with a call for technologists to back off the extreme positions often taken in technical arguments (likely because he&apos;s knee deep in...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="post" label="post" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rest" label="rest" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="workshop" label="workshop" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="writeweb" label="write web" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wsrest" label="ws-rest" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>Part of my continuing <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html">series</a> of reflections on the REST workshop at WWW 2010...</p>

<p>Sam Ruby's <a href="http://intertwingly.net/blog/2010/04/26/WS-Rest-Slides">keynote</a> began with a call for technologists to back off the extreme positions often taken in technical arguments (likely because he's knee deep in the middle of the <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/">mother of all technical standards debates</a>).	Using Mark Pilgrim's parable of the <a href="http://diveintomark.org/archives/2004/07/06/nfc">web services spec developer</a> fighting to the death over Unicode Normalization Forms, he illustrates that technical advocacy can lead to knee jerk, us vs. them reactions on very minute details, especially when different mindsets collide and have to work out a path to interoperability.</p>

<p>Relating this to the "REST community" (whatever that means), I think we seem to have a built-in defensive posture, and aren't quite used to being in the driver's seat for innovation. There were so many attempts to "fix" the Web into some other architecture: HTTP-ng <a href="http://www.w3.org/Protocols/HTTP-NG/1998/08/draft-frystyk-httpng-arch-00.txt">tried with a distributed object model</a>, the Web Services crowd <a href="http://www.w3.org/TR/ws-arch/">tried again</a>. The slow counter-revolution of "using the Web" was largely grown out of Mark Baker's <a href="http://www.markbaker.ca/blog/2008/01/rest-vs-soap-the-personal-cost/">health and savings account</a>.  And now, REST is now a technical pop culture buzzword, being perverted in meaning as all buzzwords are prone to.     Roy's <a href="http://permalink.gmane.org/gmane.comp.web.services.rest/3995">gotta defend</a> the meaning of the word if it's to mean anything.  So, in a way, it's completely understandable why RESTafarians honed a defence mechanism against misleading arguments that they fought ad nauseam.</p>

<p>Unfortunately, today, this defence mechanism seems to have limited free discussion of the limitations of REST, the areas of useful extension, the design of media types, and the ability to relate or objectively discuss extensions to REST that may evaluate the benefits of decades-old ideas like transactions, reliable messaging, or content-level security, without being patronizing ("you don't need transactions", or "reliable messaging isn't really reliable", "use SSL, it's easier", etc.).  Researchers and standards working groups try to follow the style, or publish extensions, but anticipate the dreaded <a href="http://roy.gbiv.com/untangled/2008/no-rest-in-cmis">Roy bitchslap</a>, perhaps because there seems to be a lack of resources (tools, documentation, frameworks, examples in different use cases) to learn how to apply the style, or perhaps because people are being lazy in applying the style (glomming onto a buzzword).   Hard to tell.</p>

<p>In short, this is a hard problem to resolve, as there are good reasons for people's strong opinions.   Compromise can only be achieved if there's shared understanding of the facts & shared values.   Mostly I see shared values in terms of the properties that people find desirable in a networked system (interoperability, extensibility, visibility, etc.), we still seem to be missing a shared understanding of the facts (such as the basic idea of "emergent properties" in software architecture, and the idea that they can be induced through constraints -- which I think many still reject.)</p>

<p>To be fair, there have been plenty of extensions out there, include the <a href="http://www.ics.uci.edu/~rohit/ARRESTED-ICSE.pdf">ARRESTED thesis</a> from Rohit Khare, various public <a href="http://developer.netflix.com/">RESTful</a> <a href="http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimbra_REST_API_Reference">APIs</a> and <a href="http://www.infoq.com/news/2009/11/restfulie-hypermedia-services">frameworks</a> out there, Henrik Nielsen's use of RESTful SOAP services in <a href="http://msdn.microsoft.com/en-us/robotics/default.aspx">Microsoft Robotics</a> studio, etc.</p>

<p>Look at the <a href="http://msdn.microsoft.com/en-us/library/bb905471(v=MSDN.10).aspx">reference to the latter</a>, for example. There are plenty of "specific methods" being defined while fitting under the POST semantics.	Some would have a problem with that, but I'm not sure what the alternative would be.	There are "state replacement" methods under the PUT semantics if you prefer that.	But some clients may prefer the more specific, precision state transfer of a POST method.	Would you consider this heresy?   Or would you stop and realize that Henrik was in the front row of the WS-REST workshop, and co-authored too many W3C notes and IETF RFC's to enumerate here?</p>

<p>I'll speak more about this problem with the "write side of the web" soon, but in short, we don't really have a good way of describing the pre-conditions, post-conditions and side-effects of a POST in a media type, which would be probably the more "RESTful" thing to do.   Mark Baker took a <a href="http://www.markbaker.ca/2002/05/GettingStuffDoneOnTheWeb/">stab at this 8 years ago</a>, but there's hasn't been much pickup.    In lieu of that, the simplest thing might be to make an engineering decision, slap a method name & documentation on the URI+POST interaction, and move on.   You'd be no worse than a WSDL-based Web Service, with the added benefit of GET and URIs.    Or, depending on your use case, it may mean crafting a full media type for your system, though I'm not sure that's "simple".   </p>

<p>This dilemma is why I tend not to have a problem with description languages like WSDL 2.0 or WADL -- they're not complete, certainly, but they're a start  to wrapping our heads around how to describe actions on the Web without breaking uniformity.</p>]]>
        
    </content>
</entry>

<entry>
    <title>WS-REST musings:  Investment in REST (it&apos;s not where we might have expected)</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-investment-in.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.593</id>

    <published>2010-05-06T18:32:01Z</published>
    <updated>2010-05-07T00:19:16Z</updated>

    <summary>Most of those I spoke to at WS-REST felt was that media types, tools, and frameworks for REST have been growing slowly and steadily since 2008, but lately there&apos;s been a major uptick in activity: HTML5 is giving browsers and...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="rest" label="rest" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="workshop" label="workshop" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wsrest" label="ws-rest" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>Most of those I spoke to at WS-REST felt was that media types, tools, and frameworks for REST have been growing slowly and steadily since 2008, but lately there's been a major uptick in activity: HTML5 is giving browsers and web applications a makeover, OAuth is an RFC, several Atom extensions have grown, Facebook has adopted RDFa, Jersey is looking at Hypermedia support, etc.</p>

<p>But, coming out of the WS-* vs. REST debates, it is interesting in noting what hasn't happened the past two years, since the W3C Workshop on the Web of Services, which was a call to bridge-building.	As expected, SOAP web services haven't really grown on the public-facing Internet.	And, also as expected, RESTful services have proliferated on the Internet, though with varying degrees of quality.	What hasn't happened is any real investment in REST on the part of traditional middleware vendors in their servers and toolsets.	Enterprises continue to mostly build and consume WSDL-based services, with REST being the exception. There has been, at best, "checkbox" level features for REST in toolkits ("Oh, ok, we'll enable PUT and DELETE methods").	Most enterprise developers still, wrongly, view REST as "a way of doing CRUD operations over HTTP".	The desire to apply REST to traditional integration and enterprise use- cases has remained somewhat elusive and limited in scope.</p>

<p>Why was this?</p>

<p>Some might say that REST is a fraud and can't be applied to enterprise integration use cases.	I've seen the counter-evidence, and obviously disagree with that assessment, though I think that REST-in-practice (tools, documentation, frameworks) could be improved on quite a lot for the mindset and skills of enterprise developers & architects. In particular, the data integration side of the Web seems confused, with the common practice being "make it really easy to perform the required neurosurgery" with JSON. I still hold out hope for reducing the total amount of point-to-point data mapping & transformation through SemWeb technologies like OWL or SKOS.</p>

<p>Perhaps it was the bad taste left from SOA, or a consequence of the recession. Independently of the REST vs. WS debate, SOA was oversold and under-performed in the market place.	Money was made, certainly, but no where near as much as BEA, IBM, TIBCO, or Oracle wanted, and certainly not enough for most Web Services-era middleware startups to thrive independently. It's kind of hard to spend money chasing a "new technology" after spending so much money on the SOAP stack (and seeing many of the advanced specs remain largely unimplemented and/or unused, similar to CORBA services in the 90's).</p>

<p>Or, maybe it was just the consequence of the REST community being a bunch of disjointed mailing list gadflys, standards committee wonks, and bloggers, who all decided to get back to "building stuff" after the AtomPub release, and haven't really had the time or inclination to build a "stack", as vendors are prone to.</p>

<p>Regardless the reason, the recent uptick in activity hasn't come from the enterprise or the enterprise software vendors offering a new stack. The nascent industries that have invested in REST are social computing, exemplified by Twitter, Facebook, etc. and cloud computing, with vCloud, OCCI and the Amazon S3 or EC2 APIs leading the way.</p>

<p>The result has been a number of uneven media types, use of generic formats (application/xml or application/json), mixed success in actually building hypermedia instead of "JSON CRUD over HTTP", and a proliferation of toolkits in JavaScript, Java, Ruby, Python, etc. </p>

<p>We're going to be living with the results of this first generation of HTTP Data APIs for quite some time.  It's time to apply our lessons learned into a new generation of tools and libraries.</p>]]>
        
    </content>
</entry>

<entry>
    <title>WS-REST Workshop Themes</title>
    <link rel="alternate" type="text/html" href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html" />
    <id>tag:www.stucharlton.com,2010:/blog//3.592</id>

    <published>2010-05-06T18:25:48Z</published>
    <updated>2010-05-11T15:47:35Z</updated>

    <summary>The First Workshop on RESTful Design (WS-REST, hur hur) was held at WWW 2010 in Raleigh last week. I attended and was also on the program committee. It was great to finally meet a number of folks from rest-discuss and...</summary>
    <author>
        <name>Stu</name>
        <uri>http://www.stucharlton.com/</uri>
    </author>
    
        <category term="Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="rest" label="rest" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="workshop" label="workshop" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wsrest" label="ws-rest" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.stucharlton.com/blog/">
        <![CDATA[<p>The First Workshop on RESTful Design (WS-REST, hur hur) was held at WWW 2010 in Raleigh last week.	I attended and was also on the program committee.	It was great to finally meet a number of folks from rest-discuss and the #rest IRC channel, along with seeing again folks working to improve REST in the trenches.</p>

<p>This turned into the mother of all blog posts, so I've chunked it up into a series.	The tl;dr version of my workshop takeaways are the following:</p>

<p>- <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-investment-in.html">Investment in RESTful technology</a> is growing, particularly with cloud and social computing. Enterprise and vendor investment has been low.</p>

<p>- <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-put-down-the-g.html">Technical disagreements and arguments</a> from authority are counter-productive, and seem to be ubiquitous. Now is the time to build stuff, and make stuff interoperate, not split hairs. On the other hand....</p>

<p>- In building interoperable systems, sometimes domain experts are wrong, sometimes they're right. Sometimes it's better to document and standardize what works, sometimes that's not good enough.</p>

<p>In short, <a href="http://www.stucharlton.com/blog/archives/2010/05/wsrest.html">interoperability is hard</a>, REST doesn't change that, better get a good helmet if you're in a group specification or standards body these days.	The most important thing is if you're going to willfully violate someone else's idea of "the Right Thing", then be explicit and honest about it, so that it can be discussed. (This is, in part, the saga of the <a class="zem_slink" href="http://en.wikipedia.org/wiki/HTML5" title="HTML5" rel="wikipedia">HTML5</a> standards effort.)</p>

<p>- REST has become a buzzword among those that aren't architects and don't want to be architects.	That means there needs to be better documentation, tools, and frameworks; most developers can't derive the right design from first principles.	Most published RESTful APIs published today are not as interoperable as they could be; there will be a price to pay to maintain these.</p>

<p>- Having said that, for architects, progress has been slow in driving a true discipline for architecture, though there is some great work afoot to make this easier</p>

<p>- Hypermedia tends to be a somewhat jarring user experience to those that still love their desktop applications, especially when we build small protocols like OAuth , but fall back on HTML to do other pieces like authentication and authorization policy selection.</p>

<p>- Developers tend to love dynamic binding nature of REST so long as they're not the ones that have to maintain the client.	We need a better way of handling dynamic binding (my suggestion is a work in progress) to hypermedia.</p>

<p>- It's high time to work on the "write side" of the web.	We know that HTTP GET works well for interoperability.	We have had less success with write actions, and need to think through interoperability there to a much greater degree than we have.	Enterprise<br />
integration use cases, for example, could really benefit from describing POST interfaces for domain application protocols.	The best we have is WSDL, WADL, and generic forms like XForms, HTML Forms, and generic publishing containers like AtomPub.	We can do better.</p>

<p>- You can use REST in the enterprise, for legacy integration, successfully.</p>

<p>- Peer to Peer systems quite achievable in RESTful systems.	The nature of hypermedia itself is peer-to-peer. And minor extensions to HTTP can lead to full data propagation style systems.</p>

<p>- Progress is being made to formally describe a RESTful Semantic Web, one that leverages the formal descriptions of tuple spaces with the <a class="zem_slink" href="http://en.wikipedia.org/wiki/Pi_calculus" title="Pi calculus" rel="wikipedia">polyadic pi-calculus</a> and extends them to RESTful architectures.</p>

<p>- While HTML 5 is progressing to be a rich platform for the next generation web, there's experimentation happening for alternatives. Some drive traditional desktop UIs through RESTful resources, others are describing mixed reality worlds.</p>

<p>I have some forthcoming blog posts musing on these themes.</p>

<div class="zemanta-pixie" style="margin-top:10px;height:15px"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/7eb3894b-4db5-499a-abcb-0ea4c06ba853/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=7eb3894b-4db5-499a-abcb-0ea4c06ba853" alt="Reblog this post [with Zemanta]" style="border:none;float:right"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>]]>
        
    </content>
</entry>

</feed>
