<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
    <title>Developer Network</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/" />
    
    <id>tag:www.sixapart.com,2009:/developers//52</id>
    <updated>2007-05-30T23:04:35Z</updated>
    <subtitle>Six Apart's Developer Network and web site.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.33</generator>
 
<link rel="self" href="http://feeds.feedburner.com/SixApartDeveloperCenter" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
    <title>wp.deletePage</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/xmlrpc/pages_api/wpdeletepage.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/xmlrpc/pages-api/wpdeletepage-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2007:/developers//52.10390</id>
    
    <published>2007-05-30T01:41:42Z</published>
    <updated>2007-05-30T23:04:35Z</updated>
    
    <summary>Deletes a page identified by the page ID in the request. Method will return true if successful or a fault otherwise....</summary>
    <author>
        <name>Mark Paschal</name>
        <uri>http://markpasc.org/</uri>
    </author>
            <category term="Pages" />
            <category term="Pages API" />
            <category term="TypePad" />
            <category term="XML-RPC" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>Deletes a page identified by the page ID in the request. Method will return true if successful or a fault otherwise.</p>
]]>
        <![CDATA[<h3>Parameters</h3>

<ul>
<li>String blogid</li>
<li>String username</li>
<li>String password</li>
<li>String pageid</li>
</ul>
]]>
    </content>
</entry>
<entry>
    <title>wp.getPages</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/xmlrpc/pages_api/wpgetpages.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/xmlrpc/pages-api/wpgetpages-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2007:/developers//52.10389</id>
    
    <published>2007-05-30T01:28:26Z</published>
    <updated>2007-05-30T23:04:35Z</updated>
    
    <summary>Returns a list of the most recent pages in the system....</summary>
    <author>
        <name>Mark Paschal</name>
        <uri>http://markpasc.org/</uri>
    </author>
            <category term="Pages" />
            <category term="Pages API" />
            <category term="TypePad" />
            <category term="XML-RPC" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>Returns a list of the most recent pages in the system.</p>
]]>
        <![CDATA[<h3>Parameters</h3>

<ul>
<li>String blogid</li>
<li>String username</li>
<li>String password</li>
</ul>

<h3>Return value</h3>

<p>on success, array of structs containing ISO.8601 dateCreated, String page_id, String description, String title, String permaLink; on failure, fault</p>

<h3>Notes</h3>

<p>dateCreated is in the timezone of the weblog blogid; permaLink is the URL pointing to the page</p>
]]>
    </content>
</entry>
<entry>
    <title>wp.editPage</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/xmlrpc/pages_api/wpeditpage.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/xmlrpc/pages-api/wpeditpage-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2007:/developers//52.10388</id>
    
    <published>2007-05-30T01:22:11Z</published>
    <updated>2007-05-30T23:04:35Z</updated>
    
    <summary>Updates a page identified by the page ID in the request. Method returns true if successful, or a fault otherwise....</summary>
    <author>
        <name>Mark Paschal</name>
        <uri>http://markpasc.org/</uri>
    </author>
            <category term="Pages" />
            <category term="Pages API" />
            <category term="TypePad" />
            <category term="XML-RPC" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>Updates a page identified by the page ID in the request. Method returns true if successful, or a fault otherwise.</p>
]]>
        <![CDATA[<p>Notes: the struct content can contain the following standard keys: </p>

<ul>
<li>title, for the title of the page; </li>
<li>description, for the body of the page; </li>
<li>permaLink, for the desired URL of the page; </li>
<li>dateCreated, to set the created-on date of the page. </li>
</ul>

<p>In addition, TypePad&#8217;s implementation allows you to pass in values for one other key: </p>

<ul>
<li>String mt_convert_breaks, the value for the convert_breaks field;</li>
</ul>

<p>If specified, dateCreated should be in ISO.8601 format.</p>

<h3>Parameters</h3>

<ul>
<li>String blogid</li>
<li>String pageid</li>
<li>String username</li>
<li>String password</li>
<li>struct content</li>
<li>boolean publish</li>
</ul>
]]>
    </content>
</entry>
<entry>
    <title>wp.newPage</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/xmlrpc/pages_api/wpnewpage.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/xmlrpc/pages-api/wpnewpage-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2007:/developers//52.10386</id>
    
    <published>2007-05-30T01:01:00Z</published>
    <updated>2007-05-30T23:04:35Z</updated>
    
    <summary>Creates a new page, and optionally publishes it. If the post is successful, this method will return the ID assigned to the page by the publishing system. Otherwise, it will return a fault....</summary>
    <author>
        <name>Mark Paschal</name>
        <uri>http://markpasc.org/</uri>
    </author>
            <category term="Pages" />
            <category term="Pages API" />
            <category term="TypePad" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>Creates a new page, and optionally publishes it. If the post is successful, this method will return the ID assigned to the page by the publishing system. Otherwise, it will return a fault.</p>
]]>
        <![CDATA[<h3>Parameters</h3>

<ul>
<li>String blogid</li>
<li>String username</li>
<li>String password</li>
<li>struct content</li>
<li>boolean publish</li>
</ul>

<h3>Notes</h3>

<p>The struct content can contain the following standard keys:</p>

<ul>
<li>title, for the title of the page; </li>
<li>description, for the body of the page; </li>
<li>dateCreated, to set the created-on date of the page; </li>
<li>permaLink, the desired URL for the page;</li>
</ul>

<p>In addition, TypePad&#8217;s implementation allows you to pass in values for one other key: </p>

<ul>
<li>String mt_convert_breaks, the value for the convert_breaks field;</li>
</ul>

<p>If specified, dateCreated should be in ISO.8601 format.</p>
]]>
    </content>
</entry>
<entry>
    <title>wp.getPage</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/xmlrpc/pages_api/wpgetpage.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/xmlrpc/pages-api/wpgetpage-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2007:/developers//52.10387</id>
    
    <published>2007-05-30T00:43:22Z</published>
    <updated>2007-05-30T23:04:35Z</updated>
    
    <summary>Retrieves a page identified by the page ID in the request. Returns the page if successful, or a fault otherwise....</summary>
    <author>
        <name>Mark Paschal</name>
        <uri>http://markpasc.org/</uri>
    </author>
            <category term="Pages" />
            <category term="Pages API" />
            <category term="TypePad" />
            <category term="XML-RPC" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>Retrieves a page identified by the page ID in the request. Returns the page if successful, or a fault otherwise.</p>
]]>
        <![CDATA[<h3>Parameters</h3>

<ul>
<li>String blogid</li>
<li>String pageid</li>
<li>String username</li>
<li>String password</li>
</ul>

<h3>Return value:</h3>

<p>struct containing ISO.8601 dateCreated, String page_id, String description, String title, String permaLink, String mt_convert_breaks, String mt_keywords;</p>

<h3>Notes</h3>

<p>The fields prefixed with mt_ are Movable Type extensions to the metaWeblog.getPost API.</p>
]]>
    </content>
</entry>
<entry>
    <title>How to insert a header for your widgets</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/product_documentation/typepad/how_to_insert_a_header_for_you.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/product-documentation/typepad/how_to_insert_a_header_for_you-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2006:/developers//52.8671</id>
    
    <published>2006-12-05T19:33:09Z</published>
    <updated>2006-12-05T19:53:26Z</updated>
    
    <summary>When a widget is added to your TypePad weblog, TypePad automatically wraps the widget in a little HTML to assist in styling and your widget's layout. However, a widget developer recently pointed out that by wrapping the widget in this...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="TypePad" />
            <category term="Widget API" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>When a <a href="http://www.sixapart.com/developers/product_documentation/typepad/widget_api/typepad_widget_api.html">widget</a> is added to your TypePad weblog, TypePad automatically wraps the widget in a little HTML to assist in styling and your widget's layout. However, a widget developer recently pointed out that by wrapping the widget in this way, they were unable to insert an HTML H2 header in the proper location so as to make the widget's header appear identical to the other headers in the user's sidebar.</p>

<p>To circumvent this little nuance, <a href="http://www.iwalt.com/">Walt</a> wrote a little Javascript that can be included in your widget code that inserts a module header in the proper location within the page:</p>

<textarea style="display: none;" name="code" class="html" cols="60" rows="1">
     <div class="module-widget module" id="widget-iWalt_com_netflix">
         <div class="module-content">
             <div id="widget-iWalt_com_netflix-walt">
                 <script type="text/javascript" src="http://URL.TO.YOUR.WIDGET"></script>
                 <script type="text/javascript" defer="defer">
                      var wrapper = document.getElementById( 'widget- iWalt_com_netflix' );
                      if( !wrapper )
                          return false;
                      var header = document.createElement( 'h2' );
                      header.className = 'module-header';
                      var header_text = document.createTextNode( 'Netflix Queue' );
                      header.appendChild( header_text );
                      wrapper.insertBefore( header, wrapper.firstChild );
                 </script>
             </div>
         </div>
     </div>
</textarea>

<p>This script above builds a `module-header` H2 and inserts it before anything else in the `widget-iWalt_com_netflix` DIV.</p>]]>
        
    </content>
</entry>
<entry>
    <title>FastCGI Benchmarks for Movable Type</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/product_documentation/movable_type/fastcgi_benchmarks_for_movable.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/product-documentation/movable-type/fastcgi_benchmarks_for_movable-comments.xml" thr:count="1" thr:when="2009-10-27T19:04:54Z" />
    <id>tag:www.sixapart.com,2006:/developers//52.8543</id>
    
    <published>2006-11-17T17:25:32Z</published>
    <updated>2006-11-17T17:52:09Z</updated>
    
    <summary>We here at Six Apart have been advocating and encouraging users to run Movable Type under FastCGI ever since our own personal experiences showed how much faster Movable Type becomes when run within a persistent application server environment. The practice...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Movable Type" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>We here at Six Apart have been advocating and encouraging users to run Movable Type under FastCGI ever since our own <a href="http://www.majordojo.com/movable_type/making_movable.php">personal experiences</a> showed how much faster <a href="http://www.sixapart.com/movabletype/">Movable Type</a> becomes when run within a persistent application server environment. The practice has been widely adopted by businesses and it is the #1 recommendation on the <a href="http://www.lifewiki.net/sixapart/MTPerformanceTuning">Movable Type Performance Tuning wiki page</a>. However, while the performance gains have been undeniable, they have never been quatified.</p>
]]>
        <![CDATA[<p>Until recently that is. <a href="http://www.jayallen.org/">Jay Allen</a> recently conducted his own benchmarking tests<sup>*</sup> and the results are just what we expected, and at the same time surprising. A 15-fold increase in performance is pretty incredible.</p>

<table width="100%">
<tr>
<th>Description</th>
<th>Time</th>
<th># of Requests</th>
<th>Requests/Sec</th>
</tr>
<tr>
<td>MT under normal CGI</td>
<td>121.319342 secs</td>
<td>224</td>
<td>1.85</td>
</tr>
<tr>
<td>MT under mod_fastcgi</td>
<td>120.18768 secs</td>
<td>2344</td>
<td>19.53</td>
</tr>
<tr>
<td>MT under mod_fgcid</td>
<td>120.55752 secs</td>
<td>3410</td>
<td>28.40</td>
</tr>
</table>

<p><sup>*</sup> All tests were run under a load of 10 concurrent threads.</p>

<h2>Resources</h2>

<ul>
<li><a href="http://jayallen.org/journey/2006/10/dreamhost_movable_type_and_fastcgi">Getting FastCGI setup on Dreamhost</a> - Jay Allen</li>
<li><a href="http://www.neilturner.me.uk/2005/Dec/14/running_movable_type_on_o.html">Running Movable Type on OS X with FastCGI</a> - Neil Turner</li>
</ul>
]]>
    </content>
</entry>
<entry>
    <title>Google Sitemaps Template</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/product_documentation/movable_type/google_sitemaps.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/product-documentation/movable-type/google_sitemaps-comments.xml" thr:count="1" thr:when="2009-10-27T19:04:54Z" />
    <id>tag:www.sixapart.com,2006:/developers//52.8376</id>
    
    <published>2006-11-16T21:54:24Z</published>
    <updated>2006-11-16T23:06:19Z</updated>
    
    <summary>Google pioneered the simple concept of a site map published in XML that that could be uploaded into Google Webmaster Central to help Google quickly obtain a list of all the pages on a web site that they needed to...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Examples" />
            <category term="Movable Type" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>Google <a href="http://googleblog.blogspot.com/2005/06/webmaster-friendly.html">pioneered</a> the simple concept of a site map published in XML that that could be uploaded into <a href="http://www.google.com/webmasters/">Google Webmaster Central</a> to help Google quickly obtain a list of all the pages on a web site that they needed to spider. It is also provided web masters with the ability of indicating the update frequency of content on their site so that Google could better schedule their spidering software to keep their index up to date. Finally web masters could hint as to the priority a page should take in Google's spidering queue relative to other pages on the site.</p>

<p>And now, <a href="http://www.techcrunch.com/2006/11/15/google-yahoo-and-microsoft-agree-to-standard-sitemaps-protocol/">Yahoo and Microsoft have agreed to adopt the site map protocol</a> as a <a href="http://www.sitemaps.org/">standard</a> within their own search engines. Now there is no better way to help search engines stay up to date with your blog's content.</p>

<p>To assist Movable Type administrators we have provided you with the following Movable Type template code which you can cut and paste into a new Index Template in your installation.</p>]]>
        <![CDATA[<h2>Movable Type Template Code</h2>

<textarea style="display: none;" name="code" class="xml" cols="60" rows="1">
&lt;?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
      <loc><$MTBlogURL$></loc>
      <changefreq>daily</changefreq>
   </url>
<MTEntries lastn="0">   <url>
      <loc><$MTEntryPermalink$></loc>
      <lastmod><$MTEntryModifiedDate format="%Y-%m-%d"$></lastmod>
   </url>
</MTEntries>
</urlset>
</textarea>

<h2>Resources</h2>

<ul>
<li><a href="http://www.sitemaps.org/">Official SiteMaps Site</a></li>
<li><a href="http://googlewebmastercentral.blogspot.com/2006/11/joint-support-for-sitemap-protocol.html">Google's Announcement</a></li>
<li><a href="http://www.sitemaps.org/protocol.html">SiteMaps Protocol</a></li>
<li><a href="http://www.google.com/webmasters/">Google Webmaster Central</a></li>
</ul>]]>
    </content>
</entry>
<entry>
    <title>Open Media Profile for Open Search</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/product_documentation/vox/open_media_profile.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/product-documentation/vox/open_media_profile-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2006:/developers//52.8363</id>
    
    <published>2006-11-07T20:00:21Z</published>
    <updated>2006-11-08T20:00:00Z</updated>
    
    <summary>Vox&amp;#8217;s innovative compose screen allows users to search and find content to blog about from all over the Internet. It allows them to search their personal Flickr accounts, to search YouTube, Photo Bucket and more, with the promise of adding...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Vox" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>Vox&#8217;s innovative compose screen allows users to search and find content to blog about from all over the Internet. It allows them to search their personal <a href="http://www.flickr.com">Flickr</a> accounts, to search <a href="http://www.youtube.com">YouTube</a>, <a href="http://www.photobucket.com/">Photo Bucket</a> and more, with the promise of adding more and more of these &#8220;conduits&#8221; over time. That is why we are architected these Vox compose conduits around well establish Internet standards, like <a href="http://search.yahoo.com/mrss">RSS</a>, <a href="http://tools.ietf.org/html/rfc4287">Atom</a> and <a href="http://www.opensearch.org/Specifications/OpenSearch/1.1">Open Search</a>.</p>

<p>The Open Media Profile for Open Search specification was written for people and companies wishing to integrate their content into <a href="http://www.vox.com/">Vox</a> and outlines the components and protocols necessary to achieve a successful integration.</p>
]]>
        <![CDATA[<h1>An Overview and Introduction to the Open Media Profile for Open Search</h1>

<p>This is a specification for Vox&#8217;s Open Media Profile for Open Search.</p>

<p><em>Originally authored by <a href="http://bulknews.typepad.com/">Tatsuhiko Miyagawa</a>, edited by <a href="http://www.majordojo.com/">Byrne Reese</a>.</em></p>

<h3>What your API should implement</h3>

<p>What information do we need to integrate your service to Vox? Here&#8217;s the brief list:</p>

<ul>
<li>The URL endpoint of API (e.g. http://yourhost.example.com/api/search)</li>
<li>The format of API request and responses (e.g. URL parameters as request and Atom/1.0 response)</li>
<li>Which media data you&#8217;d like us to integrate on Vox (e.g. Photo, Video, Book, Audio)</li>
<li>What query parameter is needed to search for specific terms</li>
<li>Metadata of each item found: Title, URL, Thumbnail URL, width, height, file size etc.</li>
</ul>

<p>We have chosen to utilize existing open protocols and standards, OpenSearch 1.1 with Atom 1.0, as we feel they provide the most flexibility. They also have plenty of existing tools available to developer to ease the process of integration.</p>

<h3>OpenSearch Description Document</h3>

<p>The first step is to author an XML document that specifies the URL that will act as the endpoint for the OpenSearch API protocol. You might optionally specify names of the parameters and response format. Here&#8217;s an example:</p>

<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"&gt;
  &lt;ShortName&gt;Video Search&lt;/ShortName&gt;
  &lt;Description&gt;Use Example.com to search the Video.&lt;/Description&gt;
  &lt;Tags&gt;video foo&lt;/Tags&gt;
  &lt;Contact&gt;admin@example.com&lt;/Contact&gt;
  &lt;Url type="application/atom+xml"
       template="http://example.com/?q={searchTerms}&amp;amp;pw={startPage?}&amp;amp;format=atom"/&gt;
  &lt;OutputEncoding&gt;UTF-8&lt;/OutputEncoding&gt;
  &lt;InputEncoding&gt;UTF-8&lt;/InputEncoding&gt;
&lt;/OpenSearchDescription&gt;
</code></pre>

<p>Save this XML and publish it so that it is accessible via a publicly accessible URL, like &#8221;http://example.com/opensearch.xml&#8221;, and make sure it declares a MIME type of &#8221;application/opensearchdescription+xml&#8221;. Technically speaking, Vox will ignore the MIME type, but we consider it important to adhere to the requirements of the OpenSearch API and encourage you to setup the MIME type anyway.</p>

<h3>Search API</h3>

<p>Once this Open Search document has been published we&#8217;ll be able to introspect your interface in order to query your endpoint. The query is accomplished by sending an HTTP GET request to the URI specified in the OpenSearch description document above. Using the example above, the URL we would query would be &#8221;http://example.com/?q=Vox&amp;pw=1&amp;format=atom&#8221;, if we use &#8221;Vox&#8221; as a search query. Your application searches the assets (e.g. Video) matching with the query (&#8221;Vox&#8221;) and returns the response in Atom 1.0 format.</p>

<h4>Example Search Response</h4>

<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;feed xmlns="http://www.w3.org/2005/Atom"
    xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
    xmlns:media="http://search.yahoo.com/mrss/"&gt;
  &lt;title&gt;Example.com Search: Vox&lt;/title&gt;
  &lt;link href="http://example.com/search/Vox" /&gt;
  &lt;updated&gt;2003-12-13T18:30:02Z&lt;/updated&gt;
  &lt;author&gt;
    &lt;name&gt;Example.com, Inc.&lt;/name&gt;
  &lt;/author&gt;
  &lt;id&gt;urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6&lt;/id&gt;
  &lt;opensearch:totalResults&gt;4230000&lt;/opensearch:totalResults&gt;
  &lt;opensearch:startIndex&gt;1&lt;/opensearch:startIndex&gt;
  &lt;opensearch:itemsPerPage&gt;10&lt;/opensearch:itemsPerPage&gt;
  &lt;opensearch:Query role="request" searchTerms="Vox" startPage="1" /&gt;
  &lt;link rel="alternate" href="http://example.com/search/Vox" type="text/html"/&gt;
  &lt;link rel="self" href="http://example.com/?q=Vox&amp;amp;pw=1&amp;amp;format=atom" type="application/atom+xml"/&gt;
  &lt;link rel="search" type="application/opensearchdescription+xml" href="http://example.com/opensearch.xml"/&gt;
  &lt;entry&gt;
    &lt;title&gt;Foo bar baz&lt;/title&gt;
    &lt;link href="http://example.com/show/video/123" /&gt;
    &lt;link rel="alternate" type="application/atom+xml" href="http://example.com/atom/123" /&gt;
    &lt;id&gt;tag:example.com,2006:video-123&lt;/id&gt;
    &lt;updated&gt;2003-12-13T18:30:02Z&lt;/updated&gt;
    &lt;content type="text"&gt;
      Vox rocks blah blah blah ...
    &lt;/content&gt;
    &lt;category term="Vox" scheme="http://example.com/tags/Vox/" label="Vox" /&gt;
    &lt;category term="cat" scheme="http://example.com/tags/Cat/" label="cat" /&gt;
    &lt;link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/2.5/" /&gt;
    &lt;media:content url="http://example.com/data/123.flv" fileSize="123456" type="video/x-flv" /&gt;
    &lt;media:player url="http://example.com/data/123.swf" height="200" width="400" /&gt;
    &lt;media:thumbnail url="http://example.com/thumb/1223.jpg" width="75" height="50" /&gt;
  &lt;/entry&gt;
  &lt;entry&gt;
  ...
  &lt;/entry&gt;
&lt;/feed&gt;
</code></pre>

<p>That is a lot of XML to digest. So let&#8217;s step through the document looking at it a little bit at a time.</p>

<pre><code>&lt;opensearch:totalResults&gt;4230000&lt;/opensearch:totalResults&gt;
&lt;opensearch:startIndex&gt;1&lt;/opensearch:startIndex&gt;
&lt;opensearch:itemsPerPage&gt;10&lt;/opensearch:itemsPerPage&gt;
&lt;opensearch:Query role="request" searchTerms="Vox" startPage="1" /&gt;
</code></pre>

<p>This says the search for &#8221;Vox&#8221; might have 423,000 results in total, and the current response is returning the first page of the search results with 10 items per page. It also describes what the current request is. We&#8217;d need these information to paginate to the next page (with &#8221;pw=2&#8221; parameter set) if users want to get more data.</p>

<pre><code>&lt;link rel="alternate" href="http://example.com/search/Vox" type="text/html"/&gt;
</code></pre>

<p>You can optionally have a link to the HTML version of the search result. Currently it&#8217;s ignored on Vox.</p>

<pre><code>&lt;link rel="self" href="http://example.com/?q=Vox&amp;amp;pw=1&amp;amp;format=atom" type="application/atom+xml"/&gt;
&lt;link rel="search" type="application/opensearchdescription+xml" href="http://example.com/opensearch.xml"/&gt;
</code></pre>

<p>These link tags declare the current URL of the response itself, and the URL of the original OpenSearch description document. We&#8217;re currently ignoring these data but would like to use them for a sanity check in the future.</p>

<pre><code>&lt;entry&gt;
...
&lt;/entry&gt;
</code></pre>

<p>The &lt;entry&gt; element describes each item found in your database. You can have multiple entries in one feed so be sure that you set the opensearch:itemsPerPage element as described above.</p>

<pre><code>&lt;title&gt;Foo bar baz&lt;/title&gt;
&lt;link href="http://example.com/show/video/123" /&gt;
</code></pre>

<p>The title and link (HTML version) of the item are essential. We use these fields as the name of the asset as it appears within their Vox Library (under the Organize tab). If it has a link element we&#8217;ll add a link to the original site on the asset details page.</p>

<pre><code>&lt;link rel="alternate" type="application/atom+xml" href="http://example.com/atom/123" /&gt;
</code></pre>

<p>This link element represents the &#8221;alternate&#8221; form of the entry, as Atom format. It is critical to have a representation of every item within your search results, as it allows Vox to get more specific information about any specific item in the search results. In the example URL above (&#8221;http://example.com/atom/123&#8221;) Vox will be able to retrieve a document that looks similar to the following (as defined by the Atom Publishing Protocol):</p>

<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;entry xmlns="http://www.w3.org/2005/Atom"
       xmlns:media="http://search.yahoo.com/mrss/"&gt;
  &lt;title&gt;Foo bar baz&lt;/title&gt;
  &lt;link href="http://example.com/show/video/123" /&gt;
  &lt;link rel="alternate" type="application/atom+xml" href="http://example.com/atom/123" /&gt;
  &lt;id&gt;tag:example.com,2006:video-123&lt;/id&gt;
  &lt;updated&gt;2003-12-13T18:30:02Z&lt;/updated&gt;
  ...
&lt;/entry&gt;
</code></pre>

<p>The URL form of the alternative Atom representation would be arbitrary. It could be something like &#8221;http://example.com/atom?id=123&#8221; or whatever, as far as we can programatically access via link rel=&#8221;alternate&#8221; element.</p>

<pre><code>&lt;id&gt;tag:example.com,2006:video-123&lt;/id&gt;
</code></pre>

<p>atom:id is another very important element under the entry. This needs to be something unique in your system. This examle uses Tag URI (RFC 4151) to indicate that this video has the ID 123 in your site. You can also use the permanent link of the HTML version, like</p>

<pre><code>&lt;id&gt;http://example.com/video/123&lt;/id&gt;
</code></pre>

<p>That is of course if you can guarantee that the URL is unique and will always refer to the same object.  Vox parses this id element to associate a unique and permanent identifier for the asset within your system. Vox will then be able to detect duplicates in the user&#8217;s library, and to retrieve rich metadata about the asset at a later point in time.</p>

<pre><code>&lt;updated&gt;2003-12-13T18:30:02Z&lt;/updated&gt;
</code></pre>

<p>This shows when this asset was last modified in a significant way. You can also refer to the &lt;published&gt; element to determine when the asset was created.</p>

<pre><code>&lt;content type="text"&gt;
  Vox rocks blah blah blah ...
&lt;/content&gt;
</code></pre>

<p>The text content of the asset.</p>

<pre><code>&lt;category term="Vox" scheme="http://example.com/tags/Vox/" label="Vox" /&gt;
&lt;category term="cat" scheme="http://example.com/tags/Cat/" label="cat" /&gt;
</code></pre>

<p>The &lt;category&gt; elements are used to list the &#8216;tags&#8217; associated with the asset. </p>

<pre><code>&lt;link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/2.5/" /&gt;
</code></pre>

<p>You can optionally declare the license of the item using the corresponding Creative Commons URI.</p>

<pre><code>&lt;media:content url="http://example.com/data/123.flv" fileSize="123456" type="video/x-flv" /&gt;
</code></pre>

<p>Elements prefixed with the &#8220;media&#8221; namespace/prefix are part of the Media RSS components of the feed. The &lt;media:content&gt; element is used to indicate the URL at which the original content associated with the asset can be found. In this example the URL is a Flash Video file. We&#8217;re not currently downloading Video data like this on Vox, but we are doing it for image files if you&#8217;re providing Photo assets. This is necessary for us to create a better thumbnail on our end, without linking photos directly to your site.</p>

<pre><code>&lt;media:player url="http://example.com/data/123.swf" height="200" width="400" /&gt;
</code></pre>

<p>The &lt;media:player&gt; element specifies the embeddable Flash player URL, if you&#8217;re providing Videos or Audio assets.</p>

<pre><code>&lt;media:thumbnail url="http://example.com/thumb/1223.jpg" width="75" height="50" /&gt;
</code></pre>

<p>The &lt;media:thumbnail&gt; element specifies the thumbnail URL we show to the user when a search is conducted. The width and height attributes express the width and height for those thumbnail images.</p>

<h3>References</h3>

<ul>
<li><a href="http://www.opensearch.org/Specifications/OpenSearch/1.1">OpenSearch 1.1</a></li>
<li><a href="http://tools.ietf.org/html/rfc4287">RFC 4287 The Atom Syndication Format</a></li>
<li><a href="http://tools.ietf.org/html/rfc4151">RFC 4151 Tag URI</a></li>
<li><a href="http://code.google.com/apis/gdata/protocol.html">Google GData API Protocol</a></li>
<li><a href="http://search.yahoo.com/mrss">Media RSS</a></li>
<li><a href="http://ietfreport.isoc.org/idref/draft-snell-atompub-feed-license/">Atom License Extension</a></li>
</ul>
]]>
    </content>
</entry>
<entry>
    <title>Widget Manager Hack #1 - Inserting WidgetManager tags</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/product_documentation/movable_type/plugins/widget_manager_hack.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/product-documentation/movable-type/plugins/widget_manager_hack-comments.xml" thr:count="1" thr:when="2009-10-27T19:04:54Z" />
    <id>tag:www.sixapart.com,2006:/developers//52.7584</id>
    
    <published>2006-07-27T02:13:47Z</published>
    <updated>2006-08-05T05:37:16Z</updated>
    
    <summary>Brad shared with me this cool Widget Manager hack that surfaces a drop down menu in the template editing interface allowing developers to easily insert the template tags necessary to insert a collection of widgets into their blog. Of course...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Plugins" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p><a href="http://www.bradchoate.com/">Brad</a> shared with me this cool <a href="http://www.majordojo.com/projects/SidebarManager/archives/2006/06/sidebar_manager_1.php">Widget Manager</a> hack that surfaces a drop down menu in the template editing interface allowing developers to easily insert the template tags necessary to insert a collection of widgets into their blog.</p>

<div style="text-align: center;">
<a href="http://www.sixapart.com/developers/i/wm-hack-1.png"><img alt="wm-hack-1.png" src="http://www.sixapart.com/developers/i/wm-hack-1-thumb.png" width="300" height="112" /></a>
</div>

<p>Of course I use the term "hack" loosely here because there is nothing hackish about it - the technique utilizes completely kosher plugin API calls introduced in <a href="http://www.sixapart.com/movabletype/news/2006/07/a_blog_for_ever.html">Movable Type 3.3</a>.</p>]]>
        <![CDATA[<p>To install this hack, insert the following code in your <tt>plugins/WidgetManager/WidgetManager.pl</tt> file:</p>

<textarea style="display: none;" name="code" class="c#" cols="60" rows="1">    MT->add_callback('MT::App::CMS::AppTemplateParam.edit_template', 
     9, $plugin, \&widget_tag_inserts);</textarea>

<p>And insert this at the bottom of the same file:</p>

<textarea style="display: none;" name="code" class="c#" cols="60" rows="1">sub widget_tag_inserts {
    my ($eh, $app, $param, $tmpl) = @_;
    my $modulesets = $plugin->load_selected_modules($app->blog->id)
        or return;
    my $i = 1;
    $param->{tag_insert_loop} ||= [];
    foreach my $name (sort keys %$modulesets) {
        push @{$param->{tag_insert_loop}}, {
          id => 'widgetmanager_' . $i++,
          label => $plugin->translate('WidgetManager: [_1]', $name),
          content => qq{<\$MTWidgetManager name="$name"\$>}
        };
    }
}</textarea>
]]>
    </content>
</entry>
<entry>
    <title>Movable Type man pages online!</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/product_documentation/movable_type/movable_type_man_pages_online.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/product-documentation/movable-type/movable_type_man_pages_online-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2006:/developers//52.7564</id>
    
    <published>2006-07-20T17:41:09Z</published>
    <updated>2006-07-20T18:22:47Z</updated>
    
    <summary>One of the most invaluable resources available to Movable Type developers is the documentation embedded within the numerous Perl modules of MT. Developers have grown accustomed to accessing this documentation via the command line tool "perldoc," but we are happy...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Movable Type" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>One of the most invaluable resources available to <a href="http://www.sixapart.com/movabletype/">Movable Type</a> developers is the documentation embedded within the numerous Perl modules of MT. Developers have grown accustomed to accessing this documentation via the command line tool "<a href="http://search.cpan.org/dist/Pod-Perldoc/lib/perldoc.pod">perldoc</a>," but we are happy to [finally] have this documentation made available to developers in <a href="http://code.sixapart.com/docs/movabletype/">an easy to read, easy to navigate HTML format</a> on <a href="http://code.sixapart.com/">code.sixapart.com</a>, one of our many Six Apart developer resources.</p>
]]>
        

    </content>
</entry>
<entry>
    <title>Easy code and syntax highlighting for the web</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/design/syntax_highlighting.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/design/syntax_highlighting-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2006:/developers//52.6870</id>
    
    <published>2006-06-20T16:50:49Z</published>
    <updated>2006-06-20T18:39:14Z</updated>
    
    <summary>As someone who writes about code, or at least provides a lot of code samples, I have been in pursuit of a quick and easy way to turn a block of code into something that will render nicely on the...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Design" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>As someone who writes about code, or at least provides a lot of code samples, I have been in pursuit of a quick and easy way to turn a block of code into something that will render nicely on the web. Traditionally doing so was very cumbersome because I would have to escape special characters, and in cases where I wanted to display line numbers I would have to embed my code in a table which was tedious to say the least. Then forget about syntax highlighting - who wants to manually wrap text blocks in span tags and then style them?</p>]]>
        <![CDATA[<p>Then when first building the <a href="http://www.sixapart.com/developers/">Six Apart Developer Center</a> it occured to me that I could build a text filter in Movable Type that would allow me to automate this whole process. So in a couple of minutes I whipped together a <a href="http://code.sixapart.com/svn/mtplugins/trunk/SyntaxHighlighter/">Movable Type plugin</a> (available at <a href="http://code.sixapart.com/">code.sixapart.com</a>) that could filter a block of text through the <a href="http://www.beautifier.org/perlqs.php">Beautifier Perl Module</a> and thus produce some pretty decent looking code. I was happy.</p>

<p>But then I saw the code samples at <a href="http://developer.yahoo.com/yui/">Yahoo's User Interface Library</a>. Not only did their code samples have syntax highlighting, but they also included:</p>

<ul>
<li>line numbers</li>
<li>alternating background colors for each line of code</li>
<li>a facility to print the code sample</li>
<li>the ability to quickly view the raw text of the code</li>
</ul>

<p>Curious as to how they may have achieved these effects I discovered that the code sample "widget" (for lack of a better term) was the product of an <a href="http://www.dreamprojections.com/syntaxhighlighter/">open source Javascript Syntax Highllighter utility</a>. Not only that, but using the tool was dead simple.</p>

<p>All one has to do is wrap a block of code in a textarea HTML element according to the tools instructions, and then run a javascript function will convert the text within the textarea into a nicely formated, fully functional, highlighted block of code. Let's see it in action.</p>

<p>Here is how I used to publish code samples online: I would take my text, escape special characters, and then wrap the code in a &lt;pre&gt; tag and a &lt;code&gt; tag. Then with a little CSS I would style the block of text like so:</p>

<pre style="background: #CCCCCC; padding: 5px;"><code>#!/usr/bin/perl
# This is a test script written in Perl
my $who = "World";
if (@ARGV) {
  $who = $ARGV[0];
}
print "Hello $who!\n";</code></pre>

<p>Here is the same code sample wrapped in a textarea element and processed through the Syntax Highlighter:</p>

<textarea style="display: none;" name="code" class="c#" cols="60" rows="1">#!/usr/bin/perl
# This is a test script written in Perl
my $who = "World";
if (@ARGV) {
  $who = $ARGV[0];
}
print "Hello $who!\n";</textarea>

<p>The HTML used to produce this output is as follows:</p>

<textarea style="display: none;" name="code" class="xml" cols="60" rows="1">
&lt;textarea style="display: none;" name="code" class="c#" 
     cols="60" rows="1">
#!/usr/bin/perl
# This is a test script written in Perl
my $who = "World";
if (@ARGV) {
  $who = $ARGV[0];
}
print "Hello $who!\n";
&lt;/textarea></textarea>

<p>It didn't take long for me to apply this style across all the code samples on the developer site. And not just code samples, I also used to make it easier to read HTML and XML fragments as well because the utility is capable of highlighting a number of languages and markup.</p>

<p>It is an excellent tool and one I plan to use more of in more of my projects. It just makes writing about code easier and it makes the code I write about prettier. What's not to like?</p>]]>
    </content>
</entry>
<entry>
    <title>Consuming the Six Apart Update Stream</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/projects/update_stream.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/projects/update_stream-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2006:/developers//52.6868</id>
    
    <published>2006-06-16T17:16:13Z</published>
    <updated>2006-06-16T18:17:57Z</updated>
    
    <summary>As Six Apart&amp;#8217;s services have grown in popularity and size we have had increasingly more and more people and companies wanting to stay abreast of new content being made available on our network. Traditionally this has been handled by us...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Projects" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>As Six Apart&#8217;s services have grown in popularity and size we have had increasingly more and more people and companies wanting to stay abreast of new content being made available on our network. Traditionally this has been handled by us &#8220;pinging,&#8221; a process by which we send the content to their server over a very simple protocol. But this model has not proven very scalable for us. We have on occasion made the really tough decision not to ping someone wanting to be notified because of the impacts it might have on performance and because of the resources it would take to build out an infrastructure scalable enough to handle pinging upwards of 40 or so endpoints at a rate of 15-20 posts per second, which is about the volume of posts Six Apart deals with on any given day. On the flip side, we have had partners keel over because our pinging them overwhelmed their systems.</p>

<p>So how do we keep all of our customers and partners up to date in a way that is cost effective, scalable, easy to implement (for everyone) and easy to support?</p>
]]>
        <![CDATA[<p>First, we had to <a href="http://btrott.typepad.com/typepad/2005/08/the_folly_of_th.html">break the model</a> where Six Apart was responsible for sending its content independently to all its subscribers. That model would be tantamount to Federal Express implementing a point-to-point package delivery service with no centralized distribution system - such a system might work, but it can&#8217;t scale, and its not cost effective.</p>

<p>So we did what FedEx did, we centralized our content distribution system by creating the &#8220;Six Apart Update Stream.&#8221; <a href="http://updates.sixapart.com/">Six Apart Updates</a> allows anyone to connect to steady and endless stream of content generated by our users. The content of the stream is broadcast using the <a href="http://www.sixapart.com/developers/atom/syndication/atom_syndication.html">Atom Syndication Format</a> so that subscribers can easily parse out and listen for the content that is of interest to them.</p>

<p>But be warned, we have often referred internally to this &#8220;stream&#8221; as a &#8220;fire hose&#8221; because there is still a tremendous amount of data that is broadcast through this service. But despite the torrent you can at least rest assured that the stream is extraordinarily unlikely to overwhelm your system. Why? Because as soon as your client falls behind in reading the stream&#8217;s contents, the service will <a href="http://updates.sixapart.com/#keepup">stop transmitting</a> to your client until it can catch up; and as soon as it does the service will indicate to your client how many posts they missed.</p>

<p>What follows is a simple Perl script, that illustrates how easy it is connect and consume the stream. It utilizes <a href="http://bulknews.typepad.com/">Miyagawa</a>&#8217;s <a href="http://search.cpan.org/dist/XML-Atom-Stream/">XML::Atom::Stream</a> perl module to connect to the stream and display all the titles of all the posts created by Six Apart users and customers.</p>

<p><em>Note: We would love to build a library of clients capable of consuming this stream, so if you have written a client in <a href="http://www.microsoft.com/net/default.mspx">.NET</a>, <a href="http://www.php.net/">PHP</a>, <a href="http://www.ruby-lang.org/en/">Ruby</a>, <a href="http://java.sun.com/">Java</a>, or any other language, please share it with us. We would love to link to it and share it with others.</em></p>

<h3>Resources</h3>

<ul>
<li><a href="http://updates.sixapart.com/">Six Apart Updates Homepage</a></li>
</ul>

<h4>Clients</h4>

<ul>
<li><a href="http://search.cpan.org/dist/XML-Atom-Stream/">Perl</a> </li>
<li><a href="http://www.aaronsw.com/2002/atomstream/atomstream.py">Python</a></li>
</ul>
]]>
    </content>
</entry>
<entry>
    <title>Introducing Net::Feedburner</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/projects/feedburner-module.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/projects/feedburner-module-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2006:/developers//52.6859</id>
    
    <published>2006-06-12T20:14:08Z</published>
    <updated>2006-06-13T19:54:10Z</updated>
    
    <summary>One thing we don&amp;#8217;t do enough of at Six Apart is promote the amazing work that our employees contribute to the Open Source community. Most recently, Nick Gerakines, who is an engineer on our TypePad team wrote a Perl module...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="Projects" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<p>One thing we don&#8217;t do enough of at Six Apart is promote the amazing work that our employees contribute to the Open Source community. Most recently, <a href="http://blog.socklabs.com/">Nick Gerakines</a>, who is an engineer on our <a href="http://www.typepad.com/">TypePad</a> team wrote a Perl module called <a href="http://search.cpan.org/dist/Net-FeedBurner/">Net::FeedBurner</a> which provides a wonderful abstraction layer for managing and burning your feeds using the <a href="http://www.feedburner.com/fb/a/developers/feedapiquick">FeedBurner API</a>. Modules like these are great because they obviate the need for developers to wade through a bunch of XML in order to perform simple functions, plus they provide a cleaner more intuitive set of semantics to use when interacting with third party services like these.</p>
]]>
        <![CDATA[<h3>A Brief Talk with Nick, the Creator</h3>

<p>I emailed with <a href="http://blog.socklabs.com/bio">Nick</a> about this new module briefly and asked him a few questions. Nick is in email, as he is person: to the point.</p>

<p><strong>Because people may not be familiar with you, what tags would you use to describe yourself?</strong></p>

<blockquote>married, software engineer, perl hacker, blogger, cocoa developer</blockquote>

<strong>What was your role on the <a href="http://www.sixapart.com/typepad/news/2006/06/typepad_and_feedburner.html">recent TypePad release</a>, and what led you to create this perl module?</strong>

<blockquote>I developed the interface that allows us to communicate with <a href="http://www.feedburner.com/">FeedBurner</a> in a way which enables our users to effortlessly use both FeedBurner and TypePad together.

Like most of the people that I work with, I&#8217;ve always been a big supporter of giving back to the community. Creating a library that other developers could use just felt like a good idea.</blockquote>

<strong>What is your philosophy when building APIs such as Net::FeedBurner?</strong>

<blockquote>Write as little code as possible and keep the footprint small. When modules like this are used in larger applications I try to keep things simple for the sake of the developer using it.

I also have a tendancy to write test code first. It allows me to plan the behavior and logic beforehand.</blockquote>

<strong>What features or plans do you have for the module?</strong>

<blockquote>Immediately on the TODO is to add support for the <a href="http://www.feedburner.com/fb/a/api/awareness">FeedBurner Awareness API</a>. I think being able to get statistical information on your feeds can go a long way. Everybody likes to see the numbers, or at least know they are they if they <em>did</em> want to see them.</blockquote>

<strong>Are you aware of any other people making use of this toolkit other than Six Apart?</strong>

<blockquote>I don&#8217;t know of anyone outside of Six Apart using this module, but I hope I&#8217;ve made it easy to integrate.</blockquote>

<strong>Do you have any &#8220;special tip or tricks&#8221; you would like to share with people using the module?</strong>

<blockquote>The test suite &#8216;<a href="http://code.sixapart.com/svn/Net-FeedBurner/trunk/t/">Net-FeedBurner/t/*</a>&#8217; covers most all of the common tasks performed with the API. Use it as a quick reference.
</blockquote>

<h3>Resources</h3>

<ul>
<li><a href="http://search.cpan.org/dist/Net-FeedBurner/">Net::FeedBurner on CPAN</a></li>
<li><a href="http://blog.socklabs.com/">Nick Gerakines&#8217; Homepage</a></li>
<li><a href="http://www.feedburner.com">FeedBurner&#8217;s Homepage</a></li>
<li><a href="http://www.feedburner.com/fb/a/developers/feedapi">FeedBurner&#8217;s Feed Management API Reference</a></li>
</ul>
]]>
    </content>
</entry>
<entry>
    <title>TypePad Widget API</title>
    <link rel="alternate" type="text/html" href="http://www.sixapart.com/developers/product_documentation/typepad/widget_api/typepad_widget_api.html" />
    <link rel="replies" type="application/atom+xml" href="http://www.sixapart.com/developers/product-documentation/typepad/widget-api/typepad_widget_api-comments.xml" thr:count="0" />
    <id>tag:www.sixapart.com,2006:/developers//52.6811</id>
    
    <published>2006-05-26T00:43:49Z</published>
    <updated>2006-12-05T19:39:37Z</updated>
    
    <summary> TypePad provides a simple form-based API that allows third parties to create a Widget on the sidebar of a user’s weblog. A Widget is a block of HTML and/or JavaScript that can add content or functionality to a user’s...</summary>
    <author>
        <name>Byrne Reese</name>
        <uri>http://www.majordojo.com</uri>
    </author>
            <category term="TypePad" />
            <category term="Widget API" />
    
    <content type="html" xml:lang="en" xml:base="http://www.sixapart.com/developers/">
        <![CDATA[<a name="overview"></a>
<p>
TypePad provides a simple form-based API that allows third parties to create a Widget on the sidebar of a user’s weblog.  A Widget is a block of HTML and/or JavaScript that can add content or functionality to a user’s weblog, and be managed by the user through TypePad’s drag-and-drop weblog design functionality. 
</p>]]>
        <![CDATA[<h3>Overview</h3>

<p>
The process for adding a new Widget to a weblog is very simple:
</p>

<ol>
  <li>Your application embeds an HTML form on their website that contains information within a few hidden form fields that will provide TypePad with everything necessary to embed a Widget within a user’s weblog, including the HTML that will be inserted into the weblog.</li>
  <li>A user visits your application and clicks a button that submits the form to TypePad.</li>
  <li>The user is taken to TypePad and is prompted to login with their username and password.</li>
  <li>The user previews the content Widget provided by your application posting, and is asked to select the weblog or weblogs that they would like to add the widget to.</li>
  <li>The user is given the option to preview what the Widget will look like on their weblog, and then confirm their selection.</li>
  <li>The user is then able to return to your application, or continue on in TypePad to reposition the widget on their weblog.</li>
</ol>

<p>
That’s it. The user’s weblog now has a new widget installed in their weblog.
</p>

<h3>Table of Contents</h3>

<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#user-add">How a User Adds a Widget to their Blog</a></li>
<li><a href="#building-widgets">Building Widgets for TypePad</a></li>
<li><a href="#example-web-form">Example Web Form</a></li>
<li><a href="#about-the-published-widget">About the Published Widget</a></li>
<li><a href="#best-practices">Widget Design Best Practices</a></li>
<li><a href="#faq">Frequently Asked Questions</li>
</ul>

<a name="user-add"></a>
<h3>How a User Adds a Widget to Their Blog</h3>

<p>
<strong>Step 1: User clicks a button to submit the widget form, and begins the Widget Installation Wizard.</strong>
</p>

<p>
From anywhere on your website a user can submit the form discussed above to begin the wizard installation process.
</p>

<p>
If a user has already installed your widget, then the widget installation wizard will allow them to update the widget’s HTML with any new HTML you wish to provide.
</p>


<p>
<a href="http://www.sixapart.com/pronet/breese/i/widgetapi/screen2.PNG"><img alt="screen2.PNG" src="http://www.sixapart.com/pronet/breese/i/widgetapi/screen2-thumb.PNG" /></a>
</p>

<p>
<em>Note to implementers: The button text can say anything you want. Just change the value of the “value” attribute in the button element.</em>
</p>

<br />

<p>
<strong>Step 2: User logs into TypePad.</strong>
</p>

<p>
If the user does not have an active TypePad session, they will be prompted to login. Once they successfully login to the application they will immediately be taken to the first step in the widget installation wizard.
</p>

<p>
<a href="http://www.sixapart.com/pronet/breese/i/widgetapi/screen3.PNG"><img alt="screen3.PNG" src="http://www.sixapart.com/pronet/breese/i/widgetapi/screen3-thumb.PNG" /></a>
</p>


<br />

<p> 
<strong>Step 3: User selects the weblog or weblogs that they wish to add the widget to.</strong>
</p>

<p>
At this step the user can select as many weblogs as they wish to install the widget onto, and they can preview the widget on their live weblog before committing the change by clicking the “Preview” link.
</p>

<p>
Users are also allowed to change the name of the widget if they prefer another name.
</p>

<p>
<a href="http://www.sixapart.com/pronet/breese/i/widgetapi/screen4.PNG"><img alt="screen4.PNG" src="http://www.sixapart.com/pronet/breese/i/widgetapi/screen4-thumb.PNG" /></a>
</p>

<p>
<em>Note to implementers: The values associated with the ‘service_name’ and ‘service_url’ form elements are used to display the text and link “Provided by: Service Name Here.”</em>
</p>

<br />

<p> 
<strong>Step 4: User completes the process.</strong>
</p>

<p>
From here the user is free to place the widget in a specific location in their sidebar by clicking “Change Content Ordering” which will take them to an easy to use drag-and-drop interface. Users can also view the finished product by clicking the “View Weblog” link.
</p>

<p>
<a href="http://www.sixapart.com/pronet/breese/i/widgetapi/screen5.PNG"><img alt="screen5.PNG" src="http://www.sixapart.com/pronet/breese/i/widgetapi/screen5-thumb.PNG" /></a>
</p>

<p>
<em>Note to implementers: The values associated with the ‘service_name’ and ‘return_url’ form elements are used to display the button labeled “Return to Service Name Here.” Clicking this button will then send the user to a landing page of your choosing.</em>
</p>

<br />

<p>
<strong>Restrictions</strong>
</p>

<ul>
<li>This mechanism cannot be used to install widgets in weblogs that utilize Advanced Templates or Mixed Media Layouts.</li>
</ul>
 
<br /><br />


<a name="buildling-widgets"></a>
<h3>Building Widgets for TypePad</h3>

<p>
The widget installation process is driven by a single HTML form that is published on a third party’s website. This form contains all the information necessary for TypePad to install a widget on someone’s weblog.
</p>

<p>
Listed below are the form fields that must be included in this form.  See Section N, Widget Design Best Practices below for more information about these fields. 
</p>


<table border="1">
<tr valign="top">
<th>Element Name</th><th>Type</th><th>Description</th>
</tr>
<tr valign="top">
<td>service_key</d><td>Hidden</td><td>The variable contains the API key assigned to you by Six Apart.</td>
</tr>
<tr valign="top">
<td>service_name</td><td>Hidden</td><td>The name of the service that installed the widget. This variable is used in the installation process to inform the user of the source of the widget and the name of the service they will return to when they are finished. This element is also used in conjunction with the short_name variable to formulate a unique identifier for the widget.
**Notes: The value of this field must be alpha numeric.**</td>
</tr>

<tr valign="top">
<td>short_name</td><td>Hidden</td><td>This variable contains the name of the widget as it will be referenced internally. This variable will never be displayed to the user, and is used by TypePad, in combination with the service_name to formulate a unique identifier for the widget. **Notes: The value of this field must be alpha numeric, and must be less than 64 characters.**</td>
</tr>

<tr valign="top">
<td>long_name</td><td>Hidden</td><td>This variable contains the display name for the widget being created. It is used extensively in the widget installation wizard and throughout the TypePad user interface to help the user position the widget using a drag-and-drop interface, and to turn on and off the widget in the weblog design area of TypePad.</td>
</tr>

<tr valignt="top">
<td>content</td><td>Hidden</td><td>This variable contains the raw HTML and/or JavaScript to be inserted into the user’s weblog. The user will be unable to edit this content once it has been inserted into their weblog and will appear unaltered in the user’s weblog.</td>
</tr>

<tr valign="top">
<td>return_url</td><td>Hidden</td><td>This variable contains the URL to which the user may be directed if they cancel or complete the widget installation process.</td>
</tr>

<tr valign="top">
<td>n/a</td><td>Button or Image</td><td>This is typically the only visible form element on the page. The value of this variable will appear as the button text on the button the user will press in order to submit the form and begin the widget installation process.</td>
</tr>

</table>

<br /><br />


<a name="example-web-form"></a>
<h3>Example Web Form</h3>

<p>
The following is an example web form utilizing the fields discussed above:
</p>



<font size="-1"><pre style="overflow: auto">

&lt;form action="https://www.typepad.com/t/app/weblog/design/widgets" method="post"&gt;
  &lt;input type="hidden" name="service_key" value="YOUR API KEY HERE" /&gt;
  &lt;input type="hidden" name="service_name" value="Six Apart" /&gt;
  &lt;input type="hidden" name="service_url" value="http://www.sixapart.com/" /&gt;
  &lt;input type="hidden" name="long_name" value="I love Six Apart" /&gt;
  &lt;input type="hidden" name="short_name" value="i_heart_6a" /&gt;
  &lt;input type="hidden" name="content" value=" &lt;img alt=&amp;quot;I Love 6A&amp;quot; 
           src=&amp;quot;http://www.sixapart.com/pronet/i/I-heart-6a-horizontal.gif&amp;quot; 
           width=&amp;quot;150&amp;quot; height=&amp;quot;63&amp;quot; /&gt;" /&gt;
  &lt;input type="hidden" name="return_url" value="http://www.sixapart.com/" /&gt;
  &lt;input type="submit" name="submit" value="Install Widget on TypePad" /&gt;
&lt;/form&gt;

</pre></font>

<p>
The HTML form above produces a single button that reads, “Install Widget on TypePad.” At the end of the process, the user will have added the following widget to their TypePad weblog.
</p>

<p><strong>Tip:</strong><br />One requirement for the content submitted to TypePad is that it be properly escaped. However, escaping quote marks, ampersands, and other special characters can be cumbersome. One way to work around this is to encapsulate the content, HTML and javascript you want to post to TypePad in an HTML &lt;textarea&gt; element unescaped. When the form is submitted, the user's browser will escape the content within the textarea automatically! Then all you need to do is hide the textarea field in the browser using CSS (specifically, the "display: none" property). That way the content you are submitting to TypePad is hidden from the user, but is still submitted with the form. For example:</p>

<font size="-1"><pre style="overflow: auto">
&lt;form action="https://www.typepad.com/t/app/weblog/design/widgets" method="post"&gt;
  &lt;input type="hidden" name="service_key" value="YOUR API KEY HERE" /&gt;
  &lt;input type="hidden" name="service_name" value="Six Apart" /&gt;
  &lt;input type="hidden" name="service_url" value="http://www.sixapart.com/" /&gt;
  &lt;input type="hidden" name="long_name" value="I love Six Apart" /&gt;
  &lt;input type="hidden" name="short_name" value="i_heart_6a" /&gt;
  <strong>&lt;textarea name="content" style="display: none"&gt;
    &lt;img alt="I Love 6A" 
       src="http://www.sixapart.com/pronet/i/I-heart-6a-horizontal.gif" 
       width="150" height="63" /&gt;
  &lt;/textarea&gt;</strong>
  &lt;input type="hidden" name="return_url" value="http://www.sixapart.com/" /&gt;
  &lt;input type="submit" name="submit" value="Install Widget on TypePad" /&gt;
&lt;/form&gt;
</pre></font>

<br /><br />
 
<a name="about-the-published-widget"></a>
<h3>About the Published Widget</h3>

<p>
All widgets created through this interface will be wrapped in an HTML &lt;div&gt; element automatically by TypePad. This is to ensure that all widgets interoperate with as many browsers as possible, and to provide users with a predictable mechanism for styling widgets via TypePad’s Custom CSS feature.
</p>

<p>
Below is an example of the HTML TypePad uses when publishing widgets:
</p>

<font size="-1"><pre>
  &lt;div id="<!-- UNIQUE WIDGET ID HERE -->" class="module-widget module"&gt;
    &lt;div class="module-content"&gt;
      &lt;!-- YOUR WIDGET’S HTML HERE --&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</pre></font>

<p>The "unique widget id" is constructed from the information passed through the `service_name` and `short_name` fields. For example, a widget with the service name "iWalt.com" and the short name "netflix" would get the ID `widget-iWalt_com_netflix`.</p>

<br /><br />

<a name="best-practices"></a>
<h3>Widget Design Best Practices</h3>

<p>
Design your widgets to scale 100%, but to scale gracefully to a minimum width of 160 pixels. This will ensure the broadest support for your widget across all possible TypePad styles, designs and layouts.
</p>

<p>
There are no height restrictions for the widgets being installed, but Widget providers should be sensitive to the fact that blog owners may be conflicted in installing a widget that is too tall and therefore displaces too much content on their published blog.
</p>

<p>
The long_name parameter submitted with your form contains the name of the Widget as it will be displayed within TypePad. In order to maintain the integrity of the TypePad interface it is recommended to keep the length of this field within 50 characters.
</p>

<p>
For optimal interoperability with TypePad, make sure that the long_name and short_name parameters you provide TypePad consist of only alpha numeric characters (a-Z, A-Z, 0-9).
</p>

<br /><br />

<a name="faq"></a>
<h3>Frequently Asked Questions</h3>

<p>
<strong>What is the “service key” or “API key” used for?</strong>
</p>

<p>
The service key, or “API key” is a unique identifier assigned to you by Six Apart. It is used to track the creation of widgets within the system as well as for security purposes.
</p>

<p>
<strong>Can I obtain usage statistics on my widget?</strong>
</p>

<p>
The program does not currently support the ability for partners to obtain usage statistics for the widgets they create.
</p>

<p>
<strong>Where does the widget get installed? Can I change the location of the widget on a user’s weblog?</strong>
</p>

<p>
By default, all new widgets are installed at the bottom of the user’s sidebar, or if the user has a three column layout, at the bottom of their right sidebar. Users are free to re-arrange the contents of their sidebars at any time and are given the option to do so at the end of the widget installation wizard.  Widget providers are not allowed to change this default behavior.
</p>

<p>
<strong>What is a user permitted to do with the widget once it has been created?</strong>
</p>

<p>
Users are allowed to perform the following actions in regards to the widgets installed via the widget installation wizard:
</p>

<ul>

<li>Position the widget in their weblog</li>
<li>Delete the widget from their weblog</li>
<li>Show/hide the widget in their weblog</li>

</ul>

<p>
Users are not allowed to:
</p>

<ul>
<li>Edit the content of the widget</li>
<li>Change the name of the widget</li>
</ul>

<p>
<strong>What happens if a user tries to install the same widget twice?</strong>
</p>

<p>
A widget is uniquely identified within a user’s account using the service name and short name of the widget. If a user attempts to create a new widget using the exact same service name and short name of a widget that is already installed, then the older widget’s contents will be replaced using the new widget’s content and widget name.
</p>

<p>
<strong>What happens if the user wishing to create the widget does not have a TypePad account?</strong>
</p>

<p>
Users wishing to use your widget in a weblog are free to create a free trial account on TypePad. A link to register for a new account will be available on the same screen that prompts the user to login to an existing account.
</p>

<p>
Tip: Have you considered signing up for <a href="http://www.sixapart.com/pronet/affiliate/">Six Apart’s Affiliate Program</a> which rewards companies and individuals that refer customers to TypePad and then subsequently sign up for a free trial account.
</p>

<p>
<strong>How do I obtain an API key?</strong>
</p>

<p>
Your API key is provided to you by Six Apart upon successfully <a href="http://www.sixapart.com/typepad/widgets/developers/">registering within the Widget API program</a>. If you ever forget or lose this key, contact Six Apart’s Technical Support team, and they can resend them to you.
</p>

<p>
<strong>Is the TypePad Widget API "open?"</strong>
</p>

<p>
The TypePad Widget API is available to anyone and everyone who is interested. However, in order to ensure the highest standard for quality and security, widgets must go through a brief review process prior to being added to the <a href="http://www.sixapart.com/typepad/widgets/">TypePad Widget Directory</a>.
</p>]]>
    </content>
</entry>

</feed>
