<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0" xml:base="http://fourkitchens.com/blog">
  <channel>
    <title>Four Kitchens blog</title>
    <link>http://fourkitchens.com/blog</link>
    <description />
    <language>en</language>
          <geo:lat>30.231252</geo:lat><geo:long>-97.716003</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/fourkitchens" type="application/rss+xml" /><item>
    <title>Co-presenting "960.gs theming overview" at DrupalCon Paris</title>
    <link>http://fourkitchens.com/blog/2009/06/24/co-presenting-960gs-theming-overview-drupalcon-paris</link>
    <description>&lt;p&gt;&lt;a href="http://fourkitchens.com/presentations"&gt;&lt;img src="/sites/default/files/accellerated-grid-theming-2009-06-13-screenshot.png" alt="Screenshot from the Four Kitchens presentation 'Accelerated grid theming using NineSixty'" class="floatright" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Jake Strawn of &lt;a href="http://drupaldynamics.com/" title="Drupal Dynamics' website" rel="nofollow"&gt;Drupal Dynamics&lt;/a&gt; and I are teaming up to propose a &lt;a href="http://paris2009.drupalcon.org/session/960gs-theming-overview" title="'960.gs theming overview' session proposal for DrupalCon Paris 2009" rel="nofollow"&gt;960.gs theming overview&lt;/a&gt; session for &lt;a href="http://paris2009.drupalcon.org/" title="DrupalCon Paris 2009 website" rel="nofollow"&gt;DrupalCon Paris&lt;/a&gt;. (To be fair, he beat me to it and was gracious enough to add me as a&amp;nbsp;co-presenter.)&lt;/p&gt;
&lt;p&gt;Our session will cover the following basics of the &lt;a href="http://960.gs/" title="960 grid system website" rel="nofollow"&gt;960 grid&amp;nbsp;system&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is&amp;nbsp;960.gs?&lt;/li&gt;
&lt;li&gt;Using the &lt;a href="http://drupal.org/project/ninesixty" title="NineSixty theme project page on Drupal.org" rel="nofollow"&gt;NineSixty theme&lt;/a&gt; as your starting point / parent&amp;nbsp;theme&lt;/li&gt;
&lt;li&gt;Understanding the &lt;code&gt;grid-x&lt;/code&gt;, &lt;code&gt;push-x&lt;/code&gt;, &lt;code&gt;pull-x&lt;/code&gt;&amp;nbsp;classes&lt;/li&gt;
&lt;li&gt;Why a grid-based system can help speed up theme&amp;nbsp;development&lt;/li&gt;
&lt;li&gt;How to break the 960-pixel&amp;nbsp;limit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the last month, I have presented sessions on 960.gs and the NineSixty theme at DrupalCamps in Copenhagen, Helsinki, and Stockholm. Most recently, I co-presented a session at Drupal Design Camp Boston with &lt;a href="http://sonspring.com/" title="Nathan Smith's website" rel="nofollow"&gt;Nathan Smith&lt;/a&gt;, creator of the 960 grid system. You can &lt;a href="http://fourkitchens.com/presentations" title="Four Kitchens' presentations on Drupal theming and grid-based design"&gt;download the slide decks on our &amp;#8220;Presentations&amp;#8221; page&lt;/a&gt;.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
Why should you care about 960.gs and grid-based theming? Easy: It will save you time, money, and frustration. Grid systems contain trim, robust, and reusable &lt;span class="caps"&gt;CSS&lt;/span&gt; that can handle virtually all positioning and cross-browser compatibility. Standardized design grids provide themers and developers a more solid jumping-off point when creating a new layout or&amp;nbsp;design.&lt;/p&gt;
&lt;p&gt;Interested? &lt;a href="http://paris2009.drupalcon.org/session/960gs-theming-overview" title="'960.gs theming overview' session proposal for DrupalCon Paris 2009" rel="nofollow"&gt;Vote for our&amp;nbsp;session!&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=2i-6tPhw9mc:jKuTL9LO7yw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=2i-6tPhw9mc:jKuTL9LO7yw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/06/24/co-presenting-960gs-theming-overview-drupalcon-paris#comments</comments>
 <category domain="http://fourkitchens.com/tags/design/grid-based-design">Grid-Based Design</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/design/drupal-themes">Drupal Themes</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/news">News</category>
 <pubDate>Wed, 24 Jun 2009 16:19:37 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">198 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Improvements to the Materialized View API</title>
    <link>http://fourkitchens.com/blog/2009/06/21/improvements-materialized-view-api</link>
    <description>&lt;p&gt;&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;span class="inline inline-right"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/scalability.thumbnail.jpg" alt="An eye-catching graphic, largely irrelevant to this blog post." title="An eye-catching graphic, largely irrelevant to this blog post."  class="image image-thumbnail " width="100" height="71" /&gt;&lt;span class="caption" style="width: 98px;"&gt;&lt;strong&gt;An eye-catching graphic, largely irrelevant to this blog&amp;nbsp;post.&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The Materialized View &lt;span class="caps"&gt;API&lt;/span&gt; (&lt;a href="/tags/databases/materialized-views"&gt;related posts&lt;/a&gt;) provides resources for pre-aggregation and indexing of data for use in complex queries. It does this by managing denormalized tables based on data living elsewhere in the database (and possibly elsewhere). As such, materialized views (MVs) must be populated and updated using large amounts of data. As users change data on the site, MVs must be intelligently updated to avoid complete (read: very slow) rebuilds. Part of performing these intelligent updates is calculating how user changes to data affect MVs in use. Until now, these updates had limitations in scalability and&amp;nbsp;capability.&lt;/p&gt;
&lt;h2&gt;Update and deletion&amp;nbsp;propagation&lt;/h2&gt;
&lt;p&gt;In the first iteration of the Materialized View &lt;span class="caps"&gt;API&lt;/span&gt; (&lt;span class="caps"&gt;MV&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;), which is currently deployed to Drupal.org, update and deletion propagation were rather naïve: the hooks used to trap changes (hook_nodeapi and hook_comment) simply called the updater for both the entity itself and the updater for anything related. For example, hook_comment() called both the updaters for the comment itself and the node parent of the&amp;nbsp;comment:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;function materialized_view_comment($a1, $op) {&lt;br /&gt;&amp;nbsp; $comment = (array) $a1;&lt;br /&gt;&amp;nbsp; switch ($op) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;#039;insert&amp;#039;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;#039;update&amp;#039;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;#039;publish&amp;#039;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;#039;unpublish&amp;#039;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;#039;delete&amp;#039;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MVJobQueue::update(&amp;#039;comment&amp;#039;, $comment[&amp;#039;cid&amp;#039;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Also &amp;quot;update&amp;quot; the node for the comment.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MVJobQueue::update(&amp;#039;node&amp;#039;, $comment[&amp;#039;nid&amp;#039;]);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Calling updaters for related entities is important for aggregation-based data sources, like one that, for a given node, determines the later of when the node was changed and when the latest comment to the node was posted. A change to either the node or a comment related to the node may change the aggregated&amp;nbsp;value:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;class MVLastNodeActivityTimestamp extends MVColumn {&lt;br /&gt;&amp;nbsp; public function getValue($entity_type, $entity_id) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $timestamp = db_result(db_query(&amp;#039;&lt;span class="caps"&gt;SELECT&lt;/span&gt; &lt;span class="caps"&gt;MAX&lt;/span&gt;(c.timestamp) &lt;span class="caps"&gt;FROM&lt;/span&gt; {comments} c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="caps"&gt;WHERE&lt;/span&gt; c.nid = %d&amp;#039;, $entity_id));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$timestamp) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $timestamp = db_result(db_query(&amp;#039;&lt;span class="caps"&gt;SELECT&lt;/span&gt; n.changed &lt;span class="caps"&gt;FROM&lt;/span&gt; {node} n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="caps"&gt;WHERE&lt;/span&gt; n.nid = %d&amp;#039;, $entity_id));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $timestamp;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; [...]&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;The design of building propagation into the change-capture hooks proved sufficient for the initial &lt;span class="caps"&gt;MV&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt; uses, which were forum-centric. The design was sufficient because update propagation was highly predictable: nodes to themselves and comments to themselves and their parent&amp;nbsp;nodes.&lt;/p&gt;
&lt;p&gt;But a limitation quickly became apparent: this would not scale to more entity-entity relationships and introducing more &lt;span class="caps"&gt;MV&lt;/span&gt;-supported entity&amp;nbsp;types.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s&amp;nbsp;why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update notifications quickly became &lt;strong&gt;noisy&lt;/strong&gt;: MVs based on purely node data would be updated whenever comments for the node changed, even if the node-based &lt;span class="caps"&gt;MV&lt;/span&gt; didn&amp;#8217;t rely on comment&amp;nbsp;data. &lt;/li&gt;
&lt;li&gt;Mapping change propagation created &lt;strong&gt;misplaced burdens&lt;/strong&gt;. It&amp;#8217;s impossible for a change-capture hook to predict all the possible relationships &lt;span class="caps"&gt;MV&lt;/span&gt; data sources might introduce. For example, if we wanted an &lt;span class="caps"&gt;MV&lt;/span&gt; based on the number of replies to a comment, we would have to trigger updates for every parent comment walking up the tree. Do we update hook_comment yet&amp;nbsp;again?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution was to put the change-propagation burden on the data sources, with the default change-propagation algorithm being &amp;#8220;changes to X require updating rows related to X in the&amp;nbsp;MVs.&amp;#8221;&lt;/p&gt;
&lt;p&gt;The default covers the standard entity attribute (e.g. published status for a node) data sources while allowing aggregated sources to become much&amp;nbsp;smarter.&lt;/p&gt;
&lt;p&gt;The default change mapper in the MVColumn abstract&amp;nbsp;class:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;abstract class MVColumn {&lt;br /&gt;&amp;nbsp; [...]&lt;br /&gt;&amp;nbsp; public function getChangeMapping($entity_type, $entity_id) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $changed = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $changed[$entity_type] = array($entity_id);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $changed;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; [...]&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;But for data sources like MVLastNodeActivityTimestamp &amp;#8212; which provides a data sources for nodes which is the later of the last comment posting and the node change timestamp &amp;#8212; has more complex change-propagation logic. (This code admittedly assumes that comments will post-date the last node&amp;nbsp;changes.)&lt;/p&gt;
&lt;p&gt;MVLastNodeActivityTimestamp&amp;#8217;s change propagation&amp;nbsp;logic:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;class MVLastNodeActivityTimestamp extends MVColumn {&lt;br /&gt;&amp;nbsp; [...]&lt;br /&gt;&amp;nbsp; public function getChangeMapping($entity_type, $entity_id) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $changed = array();
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($entity_type == &amp;#039;node&amp;#039;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // A change to a node only affects its own value.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $changed[&amp;#039;node&amp;#039;] = array($entity_id);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if ($entity_type == &amp;#039;comment&amp;#039;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $comment = MVEntityCache::get(&amp;#039;comment&amp;#039;, $entity_id, &amp;#039;_comment_load&amp;#039;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // A change to a comment affects the value of the node it&amp;#039;s attached to.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $changed[&amp;#039;node&amp;#039;] = array($comment[&amp;#039;nid&amp;#039;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $changed;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; [...]&lt;br /&gt;}&lt;/p&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;getChangeMapping() effectively&amp;nbsp;says:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This data source changes whenever a node changes or a comment&amp;nbsp;changes.&lt;/li&gt;
&lt;li&gt;A node change affects the value of this data source for that&amp;nbsp;node.&lt;/li&gt;
&lt;li&gt;A comment change affect the value of this data source for the parent&amp;nbsp;node.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now when an entity changes, the Materialized View &lt;span class="caps"&gt;API&lt;/span&gt; walks through data sources in use on any &lt;span class="caps"&gt;MV&lt;/span&gt; and establishes the unique set of entities needing updating. If a node-based &lt;span class="caps"&gt;MV&lt;/span&gt; doesn&amp;#8217;t use any data based on comments, comment changes won&amp;#8217;t trigger any changes in that &lt;span class="caps"&gt;MV&lt;/span&gt;. (See the new update() method for class&amp;nbsp;MaterializedView.)&lt;/p&gt;
&lt;p&gt;But this caused a problem (already solved in the code above): while hook_comment() gets passed any comments being deleted, it&amp;#8217;s not possible for a data source to later load the comments and look up the related nodes to calculate propagation. The solution for this also became a useful overall optimization, the entity&amp;nbsp;cache.&lt;/p&gt;
&lt;h2&gt;The entity&amp;nbsp;cache&lt;/h2&gt;
&lt;p&gt;The disconnection between change-capture hooks and data sources used to result in excessive object loading. For example, changing the timestamp on a comment would pass the comment to hook_comment(), but a data source relying on the timestamp for the comment would load the comment fresh from the &lt;span class="caps"&gt;DB&lt;/span&gt; while updating MVs at the end of the page request (when &lt;span class="caps"&gt;MV&lt;/span&gt; updates currently&amp;nbsp;occur).&lt;/p&gt;
&lt;p&gt;Now, change-capture hooks populate the entity cache, allowing most data sources to use statically cached entity data. The entity cache also transparently loads entities in the background, keeping the data source code&amp;nbsp;clean.&lt;/p&gt;
&lt;p&gt;Of course, the entity cache was originally created to solve the change propagation for deleted items problem. It solves that problem by caching deleted items in the change-capture hooks. &lt;span class="caps"&gt;MV&lt;/span&gt; data sources are then able to load basic data for deleted items despite running after the items disappear from the&amp;nbsp;database.&lt;/p&gt;
&lt;h2&gt;Challenges&amp;nbsp;ahead&lt;/h2&gt;
&lt;p&gt;Change propagation can be expensive: for modifying a taxonomy term, it&amp;#8217;s &lt;em&gt;O(n)&lt;/em&gt;, where &lt;em&gt;n&lt;/em&gt; is the number of nodes with the term. Eventually, change propagation will have to be batched and handled offline, which raises the next&amp;nbsp;issue.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s now more complex to queue &lt;span class="caps"&gt;MV&lt;/span&gt; updates to happen offline (read: during cron). The data necessary to calculate propagations lives in a static cache that disappears at the end of each page request. The only truly scalable option now is to have a persistent entity cache. That way, change propagation can happen offline, especially for large&amp;nbsp;sets.&lt;/p&gt;
&lt;p&gt;Some sets are so large that the most reasonable option may be to trigger reindexing for affected MVs. Changing a taxonomy term will fall under this category until change propagation can be&amp;nbsp;batched.&lt;/p&gt;
&lt;p&gt;The end scalability goal is to have the real-time overhead for running MVs be very small &lt;em&gt;and&lt;/em&gt; linearly proportional to the number of entity changes being requested by the user, but the challenges above will need implemented solutions to reach this&amp;nbsp;goal.&lt;/p&gt;
&lt;h2&gt;Opportunities&lt;/h2&gt;
&lt;p&gt;This new architecture opens the door for an explosion of &lt;span class="caps"&gt;MV&lt;/span&gt; data sources and supported entity types. Particularly, &lt;span class="caps"&gt;MV&lt;/span&gt; should expose every &lt;span class="caps"&gt;CCK&lt;/span&gt; field (or Field &lt;span class="caps"&gt;API&lt;/span&gt; field in D7) as an &lt;span class="caps"&gt;MV&lt;/span&gt; data&amp;nbsp;source.&lt;/p&gt;
&lt;p&gt;The long-awaited automatic &amp;#8220;Views to &lt;span class="caps"&gt;MV&lt;/span&gt;&amp;#8221; conversion system work is now underway. It will be possible to automatically convert many common Views to run on &lt;span class="caps"&gt;MV&lt;/span&gt;-based data sets, dramatically improving scalability for converted Views without requiring any external system (like Solr, Lucene, or&amp;nbsp;CouchDB).&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=xj6QWbHqqWU:8vF01R_ak54:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=xj6QWbHqqWU:8vF01R_ak54:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/06/21/improvements-materialized-view-api#comments</comments>
 <category domain="http://fourkitchens.com/tags/databases/couchdb">CouchDB</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/development/drupal-modules">Drupal Modules</category>
 <category domain="http://fourkitchens.com/tags/databases/materialized-views">Materialized Views</category>
 <category domain="http://fourkitchens.com/tags/drupal/pressflow">Pressflow</category>
 <category domain="http://fourkitchens.com/tags/databases/mysql">MySQL</category>
 <category domain="http://fourkitchens.com/tags/databases">Databases</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/performance">Performance</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <pubDate>Sun, 21 Jun 2009 03:41:11 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">197 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Bazaar 1.16 RPMs for RHEL 5 and CentOS 5</title>
    <link>http://fourkitchens.com/blog/2009/06/18/bazaar-116-rpms-rhel-5-centos-5</link>
    <description>&lt;p&gt;&lt;img src="/sites/default/files/bazaar_logo.png" class="floatright" /&gt;&lt;/p&gt;
&lt;p&gt;Fresh packages, 64-bit only. There are &lt;a href="http://doc.bazaar-vcs.org/bzr.1.16/en/release-notes/NEWS.html#bzr-1-16-it-s-yesterday-in-california-2009-06-18" title="" rel="nofollow"&gt;release notes&lt;/a&gt; for the&amp;nbsp;curious.&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.16-1.x86_64.rpm"&gt;Bazaar&amp;nbsp;x86_64&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.16-1.src.rpm"&gt;Bazaar&amp;nbsp;&lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.16.0-1.x86_64.rpm"&gt;BzrTools x86_64 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.16.0-1.src.rpm"&gt;BzrTools&amp;nbsp;&lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=Q0J_GMbZFo8:x-d9iyntLTk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=Q0J_GMbZFo8:x-d9iyntLTk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/06/18/bazaar-116-rpms-rhel-5-centos-5#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/free-software">Free Software</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <category domain="http://fourkitchens.com/tags/version-control">Version Control</category>
 <pubDate>Thu, 18 Jun 2009 16:39:26 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">195 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>OpenSolaris 2009.06 first impressions</title>
    <link>http://fourkitchens.com/blog/2009/06/15/opensolaris-200906-first-impressions</link>
    <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/OpenSolaris_Logo.svg.png" alt="" title=""  class="image image-_original " width="120" height="114" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I downloaded and installed &lt;a href="http://opensolaris.org/os/" title="" rel="nofollow"&gt;OpenSolaris&lt;/a&gt; to experiment with its &lt;span class="caps"&gt;LAMP&lt;/span&gt; stack implementation. I eventually want to set up a headless, &lt;span class="caps"&gt;SSH&lt;/span&gt;-accessible box I can use to experiment with unique OpenSolaris features like dtrace on &lt;span class="caps"&gt;PHP&lt;/span&gt; and&amp;nbsp;MySQL.&lt;/p&gt;
&lt;p&gt;I have no experience using Solaris or OpenSolaris. Nearly all of my *nix experience is with &lt;span class="caps"&gt;BSD&lt;/span&gt; and &lt;span class="caps"&gt;GNU&lt;/span&gt;/Linux. I understand that anyone even basically familiar with OpenSolaris would not have some of the problems I&amp;#8217;ve&amp;nbsp;had.&lt;/p&gt;
&lt;h2&gt;Downloading the&amp;nbsp;&lt;span class="caps"&gt;CD&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s a little too easy to start downloading an OpenSolaris &lt;span class="caps"&gt;ISO&lt;/span&gt;. Many &amp;#8220;download&amp;#8221; links go right to the x86 &lt;span class="caps"&gt;ISO&lt;/span&gt;. When downloading an operating system install &lt;span class="caps"&gt;CD&lt;/span&gt;, a landing page (like &lt;a href="http://www.ubuntu.com/getubuntu/download" title="" rel="nofollow"&gt;Ubuntu&amp;#8217;s&lt;/a&gt;) is helpful to get new users oriented; all &amp;#8220;download&amp;#8221; links on the site should link&amp;nbsp;there.&lt;/p&gt;
&lt;p&gt;The landing page is also helpful because people downloading &lt;span class="caps"&gt;CD&lt;/span&gt; images don&amp;#8217;t always want to download directly to the local machine, so a basic &amp;#8220;click here to actually download the &lt;span class="caps"&gt;ISO&lt;/span&gt;&amp;#8221; is&amp;nbsp;helpful.&lt;/p&gt;
&lt;p&gt;I do later find the download landing page, but I&amp;#8217;m initially confused what to download to &lt;em&gt;install&lt;/em&gt; OpenSolaris. It shouldn&amp;#8217;t merely be in the descriptive text on the download landing page that the live &lt;span class="caps"&gt;CD&lt;/span&gt; is also the installation &lt;span class="caps"&gt;CD&lt;/span&gt;. &amp;#8220;Live &lt;span class="caps"&gt;CD&lt;/span&gt;&amp;#8221; does not imply &amp;#8220;installation&amp;nbsp;&lt;span class="caps"&gt;CD&lt;/span&gt;.&amp;#8221;&lt;/p&gt;
&lt;h2&gt;First&amp;nbsp;boot&lt;/h2&gt;
&lt;p&gt;The live &lt;span class="caps"&gt;CD&lt;/span&gt; boot goes quite smoothly, though &lt;span class="caps"&gt;GRUB&lt;/span&gt; asks users to pick among some confusing options. My questions: &amp;#8220;Do I pick the &amp;#8216;&lt;span class="caps"&gt;SSH&lt;/span&gt;-enabled&amp;#8217; option? What does &lt;span class="caps"&gt;SSH&lt;/span&gt; have to do with my boot&amp;nbsp;choice?&amp;#8221;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also unnerving to see a terminal login prompt while the &lt;span class="caps"&gt;GUI&lt;/span&gt; login is loading. It gives the impression that X has failed to load. There&amp;#8217;s also no indication that a user should wait for the graphical login to load, other than some screen&amp;nbsp;blanks.&lt;/p&gt;
&lt;p&gt;Eventually, though, the &lt;span class="caps"&gt;GDM&lt;/span&gt; login&amp;nbsp;displays.&lt;/p&gt;
&lt;h2&gt;First&amp;nbsp;login&lt;/h2&gt;
&lt;p&gt;Ubuntu&amp;#8217;s live &lt;span class="caps"&gt;CD&lt;/span&gt; automatically logs in a basic user on boot. OpenSolaris gives users a standard login prompt. That wouldn&amp;#8217;t be so much of a problem if the &lt;a href="http://opensolaris.org/os/downloads/" title="" rel="nofollow"&gt;download landing page&lt;/a&gt; mentioned the username and password. But it doesn&amp;#8217;t, at least for the latest release. Users actually wanting to &lt;em&gt;use&lt;/em&gt; their live CDs either have to go &lt;a href="http://dlc.sun.com/osol/docs/content/2009.06/getstart/explore.html" title="" rel="nofollow"&gt;off-site&lt;/a&gt; or view &lt;a href="http://opensolaris.org/os/project/indiana/resources/relnotes/200805/getit/" title="" rel="nofollow"&gt;the landing page for a previous&amp;nbsp;edition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, the username and password are both &amp;#8220;jack.&amp;#8221; I&amp;#8217;ll file that alongside &lt;a href="http://en.wikipedia.org/wiki/Oracle_database#Database_schema" title="" rel="nofollow"&gt;Oracle&amp;#8217;s default included schema&lt;/a&gt; for arbitrary naming after someone who probably hasn&amp;#8217;t worked on the project for&amp;nbsp;years.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Starting the installation is straightforward: there&amp;#8217;s a nice icon on the desktop. Running the installer is easy and&amp;nbsp;successful.&lt;/p&gt;
&lt;p&gt;But like most people trying OpenSolaris, I&amp;#8217;m installing it for use as a server, not a desktop. For one, I want the time zone configured as &lt;span class="caps"&gt;UTC&lt;/span&gt;, not a local one. There seems to be no option to do this at installation time. I also don&amp;#8217;t want to install a &lt;span class="caps"&gt;GUI&lt;/span&gt;, but &amp;#8220;no &lt;span class="caps"&gt;GUI&lt;/span&gt;&amp;#8221; is not an option in the installer. Nor is there an obvious &amp;#8220;server&amp;#8221; installation &lt;span class="caps"&gt;CD&lt;/span&gt;. I guess making it a real server will have to happen&amp;nbsp;post-install.&lt;/p&gt;
&lt;p&gt;While running the installation, I try to open the &amp;#8220;getting started&amp;#8221; link on the desktop, which launches Firefox. Well, at least it tries to. It actually fails, but I hold off investigating in case it starts working after completing the&amp;nbsp;installation.&lt;/p&gt;
&lt;h2&gt;First login to the installed&amp;nbsp;instance&lt;/h2&gt;
&lt;p&gt;Completing the first boot and first login is easy. I used the username and password I had set during installation. A &lt;span class="caps"&gt;GNOME&lt;/span&gt; desktop very similar to the one from the live &lt;span class="caps"&gt;CD&lt;/span&gt; loads&amp;nbsp;effortlessly.&lt;/p&gt;
&lt;p&gt;There seem to be two network-focused icons in the tray near the clock, and it&amp;#8217;s not clear what the difference is. Upon further investigation, one is Network Manager and the other is a simple status icon for the ethernet adapter. Really, only one is necessary, especially given the visual confusion of having both and redundancy in what they&amp;nbsp;do.&lt;/p&gt;
&lt;p&gt;Firefox still doesn&amp;#8217;t start. It gets a &amp;#8220;704 Illegal Instruction&amp;#8221; error when I try from the shell. Considering that Thunderbird and the rest of &lt;span class="caps"&gt;GNOME&lt;/span&gt; run fine, this isn&amp;#8217;t a problem with the hardware. I guess I&amp;#8217;ll withhold judgment until at least&amp;nbsp;updating.&lt;/p&gt;
&lt;p&gt;Given the problems with Firefox, the first thing I seriously try is updating the &lt;span class="caps"&gt;OS&lt;/span&gt;. The package manager &lt;span class="caps"&gt;GUI&lt;/span&gt;, which is sort of like Ubuntu&amp;#8217;s, is linked from approximately three places (desktop, toolbar, and application menu). It starts quickly and provides a mostly sane&amp;nbsp;interface.&lt;/p&gt;
&lt;p&gt;Time to search for packages. Typing in the search box doesn&amp;#8217;t immediately do anything, so I eventually press &lt;span class="caps"&gt;ENTER&lt;/span&gt;, which starts the search. There isn&amp;#8217;t an obvious visual indicator of the search being in progress, so it&amp;#8217;s not clear when all the results have been displayed. Clicking the &amp;#8220;clear search box&amp;#8221; (broom) button clears the search box &lt;em&gt;and&lt;/em&gt; takes the user out of search mode. Other &lt;span class="caps"&gt;GNOME&lt;/span&gt; applications typically have &lt;em&gt;live&lt;/em&gt; search in combination with the broom button, which usually makes this behavior less&amp;nbsp;confusing.&lt;/p&gt;
&lt;p&gt;The update buttons on the toolbar seem disabled, so I click &amp;#8220;refresh&amp;#8221; and use the standard menus to initiate the update process. It&amp;#8217;s not very clear whether anything actually needs to be updated. The updater takes me through creating a boot system snapshot. This feature is very cool, and I imagine it&amp;#8217;s implemented using &lt;span class="caps"&gt;ZFS&lt;/span&gt; under the hood. The installer offers to show me consolidated release notes for the update, which of course uses Firefox. I shrug and&amp;nbsp;reboot.&lt;/p&gt;
&lt;h2&gt;First login after&amp;nbsp;update&lt;/h2&gt;
&lt;p&gt;The post-update boot happens smoothly all the way to &lt;span class="caps"&gt;GNOME&lt;/span&gt;, but Firefox still doesn&amp;#8217;t start. Same&amp;nbsp;error.&lt;/p&gt;
&lt;p&gt;Oh well, this wasn&amp;#8217;t going to be used as a desktop,&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;I try to set the static &lt;span class="caps"&gt;IP&lt;/span&gt; address for the testing subnet of the Four Kitchens office network. After clicking on the non-Network Manager tray icon and setting the &lt;span class="caps"&gt;IP&lt;/span&gt;, OpenSolaris solves the redundant tray icon problem by having both widgets crash. I try to open the &lt;span class="caps"&gt;GNOME&lt;/span&gt; network connections configuration tool to at least see if the static &lt;span class="caps"&gt;IP&lt;/span&gt; took effect, but that spends about 30 seconds loading the interfaces before also&amp;nbsp;crashing.&lt;/p&gt;
&lt;p&gt;Granted all of these problems are &lt;span class="caps"&gt;GUI&lt;/span&gt;-related and shouldn&amp;#8217;t affect my final work, but setting the &lt;span class="caps"&gt;IP&lt;/span&gt; and loading Firefox are both pretty&amp;nbsp;basic.&lt;/p&gt;
&lt;h2&gt;Next&amp;nbsp;adventures&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install Bazaar on Solaris (not expected to be difficult, but necessary for my application&amp;nbsp;deployments)&lt;/li&gt;
&lt;li&gt;Set up remote &lt;span class="caps"&gt;SSH&lt;/span&gt;&amp;nbsp;logins&lt;/li&gt;
&lt;li&gt;Remove the&amp;nbsp;&lt;span class="caps"&gt;GUI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Set up the Sun&amp;#8217;s packaged &lt;span class="caps"&gt;LAMP&lt;/span&gt;&amp;nbsp;stack&lt;/li&gt;
&lt;li&gt;Explore dtrace on &lt;span class="caps"&gt;PHP&lt;/span&gt; and&amp;nbsp;MySQL&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=kg4Ry9LIJqo:542G6bSdZNk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=kg4Ry9LIJqo:542G6bSdZNk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/06/15/opensolaris-200906-first-impressions#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/software/opensolaris">OpenSolaris</category>
 <category domain="http://fourkitchens.com/tags/software/linux">Linux</category>
 <category domain="http://fourkitchens.com/tags/free-software">Free Software</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <category domain="http://fourkitchens.com/tags/software">Software</category>
 <pubDate>Sun, 14 Jun 2009 19:07:53 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">194 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Advanced Drupal form theming: Take control of error styling with a form-item-error class</title>
    <link>http://fourkitchens.com/blog/2009/06/10/advanced-drupal-form-theming-take-control-error-styling-form-item-error-class</link>
    <description>&lt;p&gt;Note: This &lt;span class="caps"&gt;HOWTO&lt;/span&gt; covers Drupal&amp;nbsp;6.x.&lt;/p&gt;
&lt;p&gt;By default, Drupal adds an &lt;code&gt;.error&lt;/code&gt; class to the form element itself: &lt;code&gt;textarea&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt;, &lt;code&gt;input&lt;/code&gt;, and so on. Sometimes, that&amp;#8217;s not good enough. Maybe a client needs the &lt;code&gt;label&lt;/code&gt;&amp;#8217;s color changes &amp;#8212; or a big, red border encompassing both the &lt;code&gt;label&lt;/code&gt; and input&amp;nbsp;elements.&lt;/p&gt;
&lt;p&gt;This can be achieved by overriding &lt;a href="http://api.drupal.org/api/function/theme_form_element" title="Drupal API: theme_form_element" rel="nofollow"&gt;&lt;code&gt;theme_form_element()&lt;/code&gt;&lt;/a&gt; to add an error class to &lt;code&gt;.form-item&lt;/code&gt;, the &lt;code&gt;div&lt;/code&gt; that wraps all elements with a form component.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
Add these lines to the top of your &lt;a href="http://api.drupal.org/api/function/theme_form_element" title="Drupal API: theme_form_element" rel="nofollow"&gt;&lt;code&gt;theme_form_element()&lt;/code&gt;&lt;/a&gt;&amp;nbsp;override:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function &lt;/span&gt;&lt;span style="color: #0000BB"&gt;MYTHEME_form_element&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;, &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;) {&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #FF8000"&gt;// This is also used in the installer, pre-database setup.&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$t &lt;/span&gt;&lt;span style="color: #007700"&gt;= &lt;/span&gt;&lt;span style="color: #0000BB"&gt;get_t&lt;/span&gt;&lt;span style="color: #007700"&gt;();
&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;// Start compiling classes for the .form-item wrapper&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$classes&lt;/span&gt;&lt;span style="color: #007700"&gt;[] = &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'form-item'&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;// Add an error class to the .form-item wrapper&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$exempt_elements &lt;/span&gt;&lt;span style="color: #007700"&gt;= array(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'checkbox'&lt;/span&gt;&lt;span style="color: #007700"&gt;, &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'radio'&lt;/span&gt;&lt;span style="color: #007700"&gt;, &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'password_confirm'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp; if (&lt;/span&gt;&lt;span style="color: #0000BB"&gt;form_get_error&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;) &amp;amp;&amp;amp; !&lt;/span&gt;&lt;span style="color: #0000BB"&gt;in_array&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#type'&lt;/span&gt;&lt;span style="color: #007700"&gt;], &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$exempt_elements&lt;/span&gt;&lt;span style="color: #007700"&gt;)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$classes&lt;/span&gt;&lt;span style="color: #007700"&gt;[] = &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'form-item-error'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$classes&lt;/span&gt;&lt;span style="color: #007700"&gt;[] = &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'form-item-error-'&lt;/span&gt;&lt;span style="color: #007700"&gt;. &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#type'&lt;/span&gt;&lt;span style="color: #007700"&gt;]; &lt;/span&gt;&lt;span style="color: #FF8000"&gt;// Optional&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #007700"&gt;}
&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;// Build the .form-item wrapper&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output &lt;/span&gt;&lt;span style="color: #007700"&gt;= &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;div class="'&lt;/span&gt;&lt;span style="color: #007700"&gt;. &lt;/span&gt;&lt;span style="color: #0000BB"&gt;implode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;' '&lt;/span&gt;&lt;span style="color: #007700"&gt;, &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$classes&lt;/span&gt;&lt;span style="color: #007700"&gt;) .&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'"'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp; if (!empty(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#id'&lt;/span&gt;&lt;span style="color: #007700"&gt;])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output &lt;/span&gt;&lt;span style="color: #007700"&gt;.= &lt;/span&gt;&lt;span style="color: #DD0000"&gt;' id="'&lt;/span&gt;&lt;span style="color: #007700"&gt;. &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#id'&lt;/span&gt;&lt;span style="color: #007700"&gt;] .&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'-wrapper"'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output &lt;/span&gt;&lt;span style="color: #007700"&gt;.= &lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;gt;\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;The lines above should replace the&amp;nbsp;following:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function &lt;/span&gt;&lt;span style="color: #0000BB"&gt;theme_form_element&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;, &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;) {&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #FF8000"&gt;// This is also used in the installer, pre-database setup.&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$t &lt;/span&gt;&lt;span style="color: #007700"&gt;= &lt;/span&gt;&lt;span style="color: #0000BB"&gt;get_t&lt;/span&gt;&lt;span style="color: #007700"&gt;();
&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output &lt;/span&gt;&lt;span style="color: #007700"&gt;= &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;div class="form-item"'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp; if (!empty(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#id'&lt;/span&gt;&lt;span style="color: #007700"&gt;])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output &lt;/span&gt;&lt;span style="color: #007700"&gt;.= &lt;/span&gt;&lt;span style="color: #DD0000"&gt;' id="'&lt;/span&gt;&lt;span style="color: #007700"&gt;. &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$element&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#id'&lt;/span&gt;&lt;span style="color: #007700"&gt;] .&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'-wrapper"'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output &lt;/span&gt;&lt;span style="color: #007700"&gt;.= &lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;gt;\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;All form elements except those listed in the &lt;code&gt;$exempt_elements&lt;/code&gt; array will have two classes applied to &lt;code&gt;div.form-item&lt;/code&gt;: &lt;code&gt;.form-item-error&lt;/code&gt; and &lt;code&gt;.form-item-error-ELEMENT_TYPE&lt;/code&gt;. Feel free to changes these as you&amp;nbsp;like.&lt;/p&gt;
&lt;p&gt;Why are some elements exempt? Checkboxes and radio button usually come in groups of two or more wrapped inside a single &lt;code&gt;div.form-item&lt;/code&gt;, and each individual box or button is wrapped in yet another &lt;code&gt;div.form-item&lt;/code&gt;. This nesting can make theming difficult, so I&amp;#8217;ve exempted them here. (You can, of course, customize this override to fit your&amp;nbsp;needs.)&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s what the markup looked like before adding wrapping error classes. Note that the &lt;code&gt;.error&lt;/code&gt; class is applied to the form elements themselves only, which makes theming some elements like radio buttons impossible in some&amp;nbsp;browsers:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;form-item&amp;quot; id=&amp;quot;edit-first-name-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label for=&amp;quot;edit-first-name&amp;quot;&amp;gt;First name: &amp;lt;span class=&amp;quot;form-required&amp;quot; title=&amp;quot;This field is required.&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/label&amp;gt;
&lt;p&gt;&amp;nbsp; &amp;lt;input maxlength=&amp;quot;255&amp;quot; name=&amp;quot;first_name&amp;quot; id=&amp;quot;edit-first-name&amp;quot; size=&amp;quot;60&amp;quot; value=&amp;quot;&amp;quot; class=&amp;quot;form-text required error&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&amp;quot;form-item&amp;quot; id=&amp;quot;edit-last-name-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label for=&amp;quot;edit-last-name&amp;quot;&amp;gt;Last name: &amp;lt;span class=&amp;quot;form-required&amp;quot; title=&amp;quot;This field is&amp;nbsp;required.&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/label&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;input maxlength=&amp;quot;255&amp;quot; name=&amp;quot;last_name&amp;quot; id=&amp;quot;edit-last-name&amp;quot; size=&amp;quot;60&amp;quot; value=&amp;quot;&amp;quot; class=&amp;quot;form-text required error&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&amp;quot;form-item&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label&amp;gt;Gender: &amp;lt;span class=&amp;quot;form-required&amp;quot; title=&amp;quot;This field is&amp;nbsp;required.&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/label&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;div class=&amp;quot;form-radios&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;form-item&amp;quot; id=&amp;quot;edit-gender-m-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label class=&amp;quot;option&amp;quot; for=&amp;quot;edit-gender-m&amp;quot;&amp;gt;&amp;lt;input id=&amp;quot;edit-gender-m&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;m&amp;quot; class=&amp;quot;form-radio error&amp;quot; type=&amp;quot;radio&amp;quot; /&amp;gt; Male&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;div class=&amp;quot;form-item&amp;quot; id=&amp;quot;edit-gender-f-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label class=&amp;quot;option&amp;quot; for=&amp;quot;edit-gender-f&amp;quot;&amp;gt;&amp;lt;input id=&amp;quot;edit-gender-f&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;f&amp;quot; class=&amp;quot;form-radio error&amp;quot; type=&amp;quot;radio&amp;quot; /&amp;gt; Female&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;And here&amp;#8217;s the same markup after applying the override&amp;nbsp;above:&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;form-item form-item-error form-item-error-textfield&amp;quot; id=&amp;quot;edit-first-name-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label for=&amp;quot;edit-first-name&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;form-required&amp;quot; title=&amp;quot;This field is required.&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt; First name:&amp;lt;/label&amp;gt;
&lt;p&gt;&amp;nbsp; &amp;lt;input maxlength=&amp;quot;255&amp;quot; name=&amp;quot;first_name&amp;quot; id=&amp;quot;edit-first-name&amp;quot; size=&amp;quot;60&amp;quot; value=&amp;quot;&amp;quot; class=&amp;quot;form-text required error&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&amp;quot;form-item form-item-error form-item-error-textfield&amp;quot; id=&amp;quot;edit-last-name-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label for=&amp;quot;edit-last-name&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;form-required&amp;quot; title=&amp;quot;This field is required.&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt; Last&amp;nbsp;name:&amp;lt;/label&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;input maxlength=&amp;quot;255&amp;quot; name=&amp;quot;family_name&amp;quot; id=&amp;quot;edit-last-name&amp;quot; size=&amp;quot;60&amp;quot; value=&amp;quot;&amp;quot; class=&amp;quot;form-text required error&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&amp;quot;form-item form-item-error form-item-error-radios&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label&amp;gt;&amp;lt;span class=&amp;quot;form-required&amp;quot; title=&amp;quot;This field is required.&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;nbsp;Gender:&amp;lt;/label&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;div class=&amp;quot;form-radios&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;form-item&amp;quot; id=&amp;quot;edit-gender-m-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label class=&amp;quot;option&amp;quot; for=&amp;quot;edit-gender-m&amp;quot;&amp;gt;&amp;lt;input id=&amp;quot;edit-gender-m&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;m&amp;quot; class=&amp;quot;form-radio error&amp;quot; type=&amp;quot;radio&amp;quot; /&amp;gt; Male&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&amp;quot;form-item&amp;quot; id=&amp;quot;edit-gender-f-wrapper&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;label class=&amp;quot;option&amp;quot; for=&amp;quot;edit-gender-f&amp;quot;&amp;gt;&amp;lt;input id=&amp;quot;edit-gender-f&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;f&amp;quot; class=&amp;quot;form-radio error&amp;quot; type=&amp;quot;radio&amp;quot; /&amp;gt; Female&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;The wrapping &lt;code&gt;.form-item&lt;/code&gt; &lt;code&gt;div&lt;/code&gt;s now have error classes: &lt;code&gt;form-item form-item-error&amp;nbsp;form-item-error-textfield&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The technique described above was inspired by the function &lt;a href="http://api.drupal.org/api/function/_form_set_class" title="Drupal API: _form_set_class" rel="nofollow"&gt;&lt;code&gt;_form_set_class&lt;/code&gt;&lt;/a&gt;, which is responsible for adding &lt;code&gt;.required&lt;/code&gt; and &lt;code&gt;.error&lt;/code&gt; classes to form&amp;nbsp;elements.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=F76EoHodYMs:e2YqzwwoKoI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=F76EoHodYMs:e2YqzwwoKoI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/06/10/advanced-drupal-form-theming-take-control-error-styling-form-item-error-class#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/design/drupal-themes">Drupal Themes</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/how-tos">How-Tos</category>
 <pubDate>Wed, 10 Jun 2009 13:11:52 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">192 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Four Kitchens' website featured on 960.gs</title>
    <link>http://fourkitchens.com/blog/2009/06/03/four-kitchens-website-featured-960gs</link>
    <description>&lt;p&gt;Our website has been featured on &lt;a href="http://960.gs" title="960 Grid System" rel="nofollow"&gt;960.gs&lt;/a&gt;, home of the 960 grid system! This is quite an honor, as we&amp;#8217;re big fans of grid-based design &amp;#8212; especially 960.gs &amp;#8212; and have begun implementing its principles and techniques in virtually every&amp;nbsp;project.&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://www.fourkitchens.com/sites/default/files/images/960gs-front-page.jpg" alt="" title=""  class="image image-_original " width="450" height="470" /&gt;&lt;/span&gt;&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;span class="inline inline-right"&gt;&lt;a href="http://www.fourkitchens.com/sites/default/files/images/960gs-front-page-overlay.jpg" onclick="launch_popup(189, 475, 485); return false;" target="_blank"&gt;&lt;img src="http://www.fourkitchens.com/sites/default/files/images/960gs-front-page-overlay.300px wide.jpg" alt="12-column grid overlay" title="12-column grid overlay"  class="image image-300px wide " width="300" height="306" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 298px;"&gt;&lt;strong&gt;12-column grid&amp;nbsp;overlay&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To see grid-based design in action, go to &lt;a href="http://960.gs" title="960 Grid System" rel="nofollow"&gt;960.gs&lt;/a&gt; and click the &amp;#8220;show grid&amp;#8221; button above the&amp;nbsp;screenshot.&lt;/p&gt;
&lt;p&gt;Note that every region on the page is contained neatly within the overlaid columns. The understated simplicity of the layout and the remarkably trim &lt;span class="caps"&gt;CSS&lt;/span&gt; used to achieve it are at the core of grid-based&amp;nbsp;design.&lt;/p&gt;
&lt;p&gt;Last month, I presented sessions at DrupalCamps in Copenhagen, Helsinki, and Stockholm on Drupal theming using 960.gs. You can download the slide deck on our &lt;a href="http://fourkitchens.com/presentations" title="Four Kitchens' design and theming presentations"&gt;presentations&lt;/a&gt;&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;In a few weeks, 960.gs creator Nathan Smith and I will co-present a session on &lt;a href="http://boston.design4drupal.org/session/accelerated-grid-theming-ninesixty" title="Session: Accelerated grid theming using NineSixty" rel="nofollow"&gt;accelerated grid theming using NineSixty&lt;/a&gt;, the Drupal port of 960.gs, at &lt;a href="http://boston.design4drupal.org/" title="Drupal Design Camp Boston" rel="nofollow"&gt;Drupal Design Camp&amp;nbsp;Boston&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to Nathan Smith for featuring us. I&amp;#8217;d also like to thank Joon Park, whose &lt;a href="http://drupal.org/project/ninesixty" title="NineSixty (960 Grid System)" rel="nofollow"&gt;NineSixty theme&lt;/a&gt; has made major strides towards improving the functionality of grid-based design. (The Four Kitchens theme is a subtheme of&amp;nbsp;NineSixty.)&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=bRR2TGATawU:BvQ18ktajo4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=bRR2TGATawU:BvQ18ktajo4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/06/03/four-kitchens-website-featured-960gs#comments</comments>
 <category domain="http://fourkitchens.com/tags/design/grid-based-design">Grid-Based Design</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/design/drupal-themes">Drupal Themes</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/press-releases">Press Releases</category>
 <pubDate>Wed, 03 Jun 2009 14:02:21 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">191 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>David's Epic Presentation Megapost</title>
    <link>http://fourkitchens.com/blog/2009/06/03/davids-epic-presentation-megapost</link>
    <description>&lt;p&gt;&lt;ins&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt; 2009-06-08:&lt;/strong&gt; You can download these slide decks (and more!) from our &lt;a href="/presentations" title="Four Kitchens' presentations and speaking engagements"&gt;Presentations page&lt;/a&gt;.&lt;br /&gt;
&lt;em&gt;&amp;#8212;The &lt;a href="/web-chefs" title="Meet the Web Chefs" rel="nofollow"&gt;Web Chefs&lt;/a&gt;&lt;/em&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://fourkitchens.com/sites/default/files/is-drupal-secure-2009-05-29.pdf"&gt;&lt;img src="/sites/default/files/is-drupal-secure-screenshot.png" alt="Screenshot from 'Is Drupal secure?'" class="floatright" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;DrupalCamp Stockholm&amp;nbsp;2009&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fourkitchens.com/sites/default/files/is-drupal-secure-2009-05-29.pdf"&gt;Is Drupal secure: the Drupal project&amp;#8217;s responses to the web&amp;#8217;s most common software&amp;nbsp;vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourkitchens.com/sites/default/files/scalable-drupal-infrastructure-2009-05-30.pdf"&gt;Scalable Drupal infrastructure: a guide to planning, deploying, and scaling big&amp;nbsp;websites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Drupalcon &lt;span class="caps"&gt;DC&lt;/span&gt;&amp;nbsp;2009&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fourkitchens.com/sites/default/files/Drupalcon DC - Infrastructure.pdf"&gt;Building infrastructure you can scale, monitor, and&amp;nbsp;maintain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourkitchens.com/sites/default/files/Drupalcon DC - The Next 10 Years.pdf"&gt;The next 10 Years: the future of application scalability and responsiveness&lt;/a&gt;&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=KSQ6SJWBo_k:0gf4s-L5E_g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=KSQ6SJWBo_k:0gf4s-L5E_g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/06/03/davids-epic-presentation-megapost#comments</comments>
 <category domain="http://fourkitchens.com/tags/software/linux/centos">CentOS</category>
 <category domain="http://fourkitchens.com/tags/databases/couchdb">CouchDB</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/software/linux">Linux</category>
 <category domain="http://fourkitchens.com/tags/development/php">PHP</category>
 <category domain="http://fourkitchens.com/tags/drupal/pressflow">Pressflow</category>
 <category domain="http://fourkitchens.com/tags/software/linux/rhel">RHEL</category>
 <category domain="http://fourkitchens.com/tags/design/information-architecture">Information Architecture</category>
 <category domain="http://fourkitchens.com/tags/databases/mysql">MySQL</category>
 <category domain="http://fourkitchens.com/tags/development/software-architecture">Software Architecture</category>
 <category domain="http://fourkitchens.com/tags/databases">Databases</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/performance">Performance</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <category domain="http://fourkitchens.com/tags/security">Security</category>
 <category domain="http://fourkitchens.com/tags/software">Software</category>
 <pubDate>Tue, 02 Jun 2009 19:40:29 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">188 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Four Kitchens and GeekAustin present an evening of Drinks and Drupal</title>
    <link>http://fourkitchens.com/blog/2009/05/19/four-kitchens-geekaustin-present-evening-drinks-drupal</link>
    <description>&lt;h3&gt;We&amp;#8217;re co-hosting a party and you&amp;#8217;re&amp;nbsp;invited!&lt;/h3&gt;
&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/drupalager.jpg" alt="Photo by Antonio Zugaldia on Flickr (CC-Attribution)" title="Photo by Antonio Zugaldia on Flickr (CC-Attribution)"  class="image image-_original " width="200" height="317" /&gt;&lt;span class="caption" style="width: 198px;"&gt;Photo by &lt;a href="http://www.flickr.com/photos/azugaldia/2807374537/" rel="nofollow"&gt;Antonio Zugaldia&lt;/a&gt; on Flickr&amp;nbsp;(&lt;span class="caps"&gt;CC&lt;/span&gt;-Attribution)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;On Wednesday, May 20th at 6:30pm, Four Kitchens is teaming up with GeekAustin to spread Drupal love in Austin. This &lt;em&gt;free&lt;/em&gt; event is a chance for local Drupal professionals to share their passion with the curious and uninitiated masses of our fair city.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;em&gt;From Lynn Bender at&amp;nbsp;GeekAustin:&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’ll have drinks out front and presentations in back. We’ve been sending personal invites to Drupalistas throughout Texas. So, if you have any unanswered Drupal questions, this will be the place to find the&amp;nbsp;answers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Master web chef &lt;a href="bios/david-strauss" title="David Strauss"&gt;David Strauss&lt;/a&gt; will be on hand to give a presentation on &amp;#8220;Quick and maintainable site-building for charities and non-profits using Drupal and&amp;nbsp;CiviCRM.&amp;#8221;&lt;/p&gt;
&lt;p&gt;So if you&amp;#8217;re interested in learning how the Drupal &lt;span class="caps"&gt;CMS&lt;/span&gt; can benefit your project, come and meet the Austin and Texas folks that make it happen every day. And remember, just like Drupal, this event is&amp;nbsp;&lt;em&gt;&lt;span class="caps"&gt;FREE&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drinks and Drupal&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Co-hosted by Four Kitchens and GeekAustin&lt;/em&gt;&lt;br /&gt;
Date: Wednesday, May 20, 2009&lt;br /&gt;
Time: 6:30pm - 10:30pm&lt;br /&gt;
Venue: Union Park Austin&lt;br /&gt;
Street: &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=612+W+Sixth+St.+Austin%2C+Texas+78701%2C+Austin%2C+TX" title="" rel="nofollow"&gt;612 W Sixth St. Austin, Texas 78701&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.facebook.com/event.php?eid=97352591006" title="Facebook event" rel="nofollow"&gt;&lt;span class="caps"&gt;RSVP&lt;/span&gt; on&amp;nbsp;Facebook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The slide deck is attached&amp;nbsp;below.&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;
&lt;div class="file-uploads"&gt;&lt;h3&gt;Downloads&lt;/h3&gt;&lt;div class="file-file"&gt;&lt;div class="file-link"&gt;&lt;a href="http://fourkitchens.com/sites/default/files/Zero to CiviCRM.pdf"&gt;&lt;span class="filefield-icon field-icon-application-pdf"&gt;&lt;img class="field-icon-application-pdf"  alt="application/pdf icon" src="http://fourkitchens.com/sites/all/modules/shiny_upload/file-icons/protocons/16x16/mimetypes/application-pdf.png" /&gt;&lt;/span&gt;Zero to CiviCRM.pdf&lt;/a&gt;&lt;/div&gt;&lt;div class="file-metadata"&gt;&lt;span class="file-name"&gt;Zero to CiviCRM.pdf &lt;span class="file-size" &gt;697.92 KB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=7K57HVBtVjU:SN6I2CR-r9A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=7K57HVBtVjU:SN6I2CR-r9A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/05/19/four-kitchens-geekaustin-present-evening-drinks-drupal#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/tags/austin">Austin</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/events">Events</category>
 <enclosure url="http://fourkitchens.com/sites/default/files/Zero to CiviCRM.pdf" length="714668" type="application/pdf" />
 <pubDate>Tue, 19 May 2009 15:35:25 -0500</pubDate>
 <dc:creator>Aaron Stanush</dc:creator>
 <guid isPermaLink="false">185 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Bazaar 1.14 RPMs for RHEL 5 and CentOS 5</title>
    <link>http://fourkitchens.com/blog/2009/04/29/bazaar-114-rpms-rhel-5-centos-5</link>
    <description>&lt;img src="/sites/default/files/bazaar_logo.png" class="floatright" /&gt;
&lt;p&gt;Fresh packages, 64-bit only (again). I can make 32-bit ones if anyone would like some. I&amp;#8217;d say that &lt;a href="http://doc.bazaar-vcs.org/bzr.1.14/en/release-notes/NEWS.html#bzr-1-14"&gt;this is the most exciting release&amp;nbsp;yet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.14-1.x86_64.rpm"&gt;Bazaar&amp;nbsp;x86_64&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.14-1.src.rpm"&gt;Bazaar&amp;nbsp;&lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.14.0-1.x86_64.rpm"&gt;BzrTools x86_64 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.14.0-1.src.rpm"&gt;BzrTools&amp;nbsp;&lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=JtZjnghbcpw:--AXa5hilN4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=JtZjnghbcpw:--AXa5hilN4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/04/29/bazaar-114-rpms-rhel-5-centos-5#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/tags/software/linux/centos">CentOS</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/software/linux/rhel">RHEL</category>
 <category domain="http://fourkitchens.com/tags/version-control">Version Control</category>
 <pubDate>Wed, 29 Apr 2009 04:41:56 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">182 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Alternatives to rebasing in Bazaar</title>
    <link>http://fourkitchens.com/blog/2009/04/20/alternatives-rebasing-bazaar</link>
    <description>&lt;p&gt;&lt;img src="/sites/default/files/bazaar_logo.png" class="floatright" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lists.ubuntu.com/archives/bazaar/2009q2/057195.html" rel="nofollow"&gt;A discussion recently arose on the Bazaar mailing list&lt;/a&gt; asking, &amp;#8220;Why isn&amp;#8217;t rebase support in core?&amp;#8221; Rebase support is currently packaged as &lt;a href="http://bazaar-vcs.org/Rebase" rel="nofollow"&gt;a plugin&lt;/a&gt;. This plugin is widely distributed, even in the standard Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X installation&amp;nbsp;bundle.&lt;/p&gt;
&lt;p&gt;There are boring reasons that rebase support isn&amp;#8217;t in core, like &lt;a href="https://lists.ubuntu.com/archives/bazaar/2009q2/057200.html" rel="nofollow"&gt;the lack of strong test coverage&lt;/a&gt;. More interesting are questions about the necessity of rebasing in typical&amp;nbsp;workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is rebasing, and why should I&amp;nbsp;care?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In large projects, there&amp;#8217;s a &lt;em&gt;mainline&lt;/em&gt; branch representing the current, global, coordinated development. In Drupal&amp;#8217;s case, this is &lt;span class="caps"&gt;CVS&lt;/span&gt; &lt;span class="caps"&gt;HEAD&lt;/span&gt;. This mainline might not always be in perfect condition, but there&amp;#8217;s a general sense that the mainline is not a sandbox for untested changes. Many changes are small enough that the developers simply work on and test a patch, but this workflow is inadequate for larger development projects like Fields in Core. Such large features require their own branch for development, a &lt;em&gt;feature&lt;/em&gt; branch.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
A feature branch allows development of a feature in isolation from the mainline but with the eventual intent of merging the changes back into the mainline. Because feature branches are created to foster long-term, divergent development from the mainline, it&amp;#8217;s common for both feature development and mainline development to happen in parallel. This parallel development creates a problem: How do developers on the feature branch prepare for the eventual re-integration of their feature code into the&amp;nbsp;mainline?&lt;/p&gt;
&lt;p&gt;There are a few&amp;nbsp;options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;#8217;t sync changes. This option makes merging the feature back into the mainline painful. This option also defeats the purpose of developing and testing the feature in isolation because merging two tested (but divergent) branches often results in one broken (but converged)&amp;nbsp;branch.&lt;/li&gt;
&lt;li&gt;Merge the feature into the mainline before making any changes to the mainline and then re-branch for more feature work after making mainline changes. Merging an untested or incomplete feature into the mainline makes this option unattractive and impractical. This option is so silly, I only included it for&amp;nbsp;completeness.&lt;/li&gt;
&lt;li&gt;Periodically update the feature branch from the mainline. This is ideal because the feature branch continually answers the question &amp;#8220;What if we merged this feature into the mainline?&amp;#8221; and is ready for quick merging into the mainline without any disruption to mainline&amp;nbsp;work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The third option is the only practical one. But how should it work? What should the feature branch history look like after synching from the&amp;nbsp;mainline?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Back to&amp;nbsp;rebasing&amp;#8230;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rebasing integrates the updates to the mainline as &lt;em&gt;ancestors&lt;/em&gt; to the changes on the feature branch. The commit history is reorganized (read: rebased) as if the feature branch were freshly created from the mainline and all work were done on top of that. There are many theoretical objections to rebasing, and I won&amp;#8217;t rehash them here. There&amp;#8217;s general consensus that rebasing is sort of&amp;nbsp;icky.&lt;/p&gt;
&lt;p&gt;I find that many rebase users use the tool because they&amp;#8217;re not aware of better workflows. I&amp;#8217;ll address each (supposed) reason to use rebase in its own&amp;nbsp;section.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;I want to keep my feature branch updated from the&amp;nbsp;mainline.&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The better choice is to run &lt;code&gt;bzr merge [mainline]&lt;/code&gt; on the feature branch. This command will update the common ancestry between the feature and mainline branches so that the feature branch includes the latest changes from the mainline &lt;em&gt;and&lt;/em&gt; is ready for smooth merging back into the&amp;nbsp;mainline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;I want to view only the revisions that make up the feature I&amp;#8217;ve been working&amp;nbsp;on.&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With a rebase, it&amp;#8217;s reasonably clear which revisions constitute the feature work: they&amp;#8217;re the top ones. But rebasing is not the best choice for reviewing this list. Run &lt;code&gt;bzr missing --mine-only [mainline]&lt;/code&gt; from the feature branch, and Bazaar will output all the feature branch&amp;#8217;s unique revisions without mangling the actual history (the way rebasing&amp;nbsp;does).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;I want a human-readable summary of how merging the feature into the mainline will affect the&amp;nbsp;code.&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For background, a rebase user would run a diff from the oldest feature-specific commit to the latest commit, but there&amp;#8217;s a better way. Instead, run &lt;code&gt;bzr diff --old=[mainline]&lt;/code&gt;, and Bazaar will provide the net diff for merging the feature into the mainline. Now, don&amp;#8217;t use this diff for anything but human review; you should still use &lt;code&gt;bzr merge&lt;/code&gt; from the mainline to integrate the feature branch&amp;#8217;s changes and preserve all&amp;nbsp;history.&lt;/p&gt;
&lt;p&gt;Creating a merge directive with &lt;code&gt;bzr send&lt;/code&gt; provides an identical human-readable diff to the method above, but a merge directive also includes all the binary data Bazaar needs to perform a history-preserving&amp;nbsp;merge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;I want to maintain a patch set on top of the&amp;nbsp;mainline.&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rebasing commits is an ugly way to do this because you don&amp;#8217;t retain your own history of work on each patch or the history of how rebasing has changed each patch. Bazaar has &lt;a href="http://bazaar-vcs.org/Documentation/LoomAsSmarterQuilt" rel="nofollow"&gt;a plug-in called &amp;#8220;Looms&amp;#8221;&lt;/a&gt; that provides direct support for a much better patch set workflow. I&amp;#8217;m a touch skeptical of Looms&amp;#8217; stability, so I just do what Looms does under the hood: maintain multiple branches, each derived (branched) from the one below. Each branch represents a patch. This method retains full, original history, including any changes I&amp;#8217;ve made to the patches. When the mainline updates, I simply merge the mainline changes up through my&amp;nbsp;patches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;I want to clean up my commit history prior to submitting my changes to the&amp;nbsp;mainline.&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rebasing may group the feature commits, but it doesn&amp;#8217;t make them coherent or pretty. It&amp;#8217;s more effective to do the&amp;nbsp;following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;bzr merge&amp;nbsp;[mainline]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;bzr diff --old=[mainline]&lt;/code&gt; on the feature branch to create a net&amp;nbsp;diff.&lt;/li&gt;
&lt;li&gt;Get a fresh branch from the&amp;nbsp;mainline.&lt;/li&gt;
&lt;li&gt;Apply the net diff as a&amp;nbsp;patch.&lt;/li&gt;
&lt;li&gt;Shelve all&amp;nbsp;changes.&lt;/li&gt;
&lt;li&gt;Work through unshelving the changes and committing them to create a coherent, pretty&amp;nbsp;history.&lt;/li&gt;
&lt;li&gt;Create a merge directive using &lt;code&gt;bzr&amp;nbsp;send&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Submit the merge&amp;nbsp;directive.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;[Your reason&amp;nbsp;here]&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d like to hear from users of any distributed version-control system why they use &amp;#8220;rebase&amp;#8221; in their workflows, even if their reason is one I&amp;#8217;ve discussed&amp;nbsp;above.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=FT3X4sg88Fw:NKvfEE_8orQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=FT3X4sg88Fw:NKvfEE_8orQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/04/20/alternatives-rebasing-bazaar#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/version-control/git">git</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/how-tos">How-Tos</category>
 <category domain="http://fourkitchens.com/tags/version-control">Version Control</category>
 <pubDate>Mon, 20 Apr 2009 05:02:38 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">172 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Drupal.org redesign sprint San Francisco: Day 4</title>
    <link>http://fourkitchens.com/blog/2009/04/11/drupalorg-redesign-sprint-san-francisco-day-4</link>
    <description>&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/san-francisco-1.preview.jpg" alt="Photo by Franco Folini on Flickr (CC-Attribution-ShareAlike)" title="Photo by Franco Folini on Flickr (CC-Attribution-ShareAlike)"  class="image image-preview " width="600" height="445" /&gt;&lt;span class="caption"&gt;Photo by &lt;a href="http://www.flickr.com/photos/livenature/180416250/" rel="nofollow"&gt;Franco Folini&lt;/a&gt; on Flickr&amp;nbsp;(&lt;span class="caps"&gt;CC&lt;/span&gt;-Attribution-ShareAlike)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Despite being held on a Saturday, more than 15 dedicated Drupalers showed up for Day 4 of the San Francisco Drupal.org redesign sprint. Here&amp;#8217;s what was achieved.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;a href="http://drupal.org/user/3313" title="Josh Koenig's profile on Drupal.org" rel="nofollow"&gt;Josh&amp;nbsp;Koenig&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Made a &amp;#8220;token&amp;#8221; contribution. (Get it?&amp;nbsp;&lt;a href="http://drupal.org/project/token" rel="nofollow"&gt;Tokens&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt;Developed a &lt;span class="caps"&gt;UI&lt;/span&gt; for setting up activity logging (the following/tracking utility see on the&amp;nbsp;&lt;a href="http://infrastructure.drupal.org/drupal.org-style-guide/prototype/dashboard.html" rel="nofollow"&gt;Dashboard&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Worked on a cross-site delivery system across the *.drupal.org&amp;nbsp;infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/93254" title="David Strauss' profile on Drupal.org" rel="nofollow"&gt;David&amp;nbsp;Strauss&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Built the sever-side components for activity reporting and&amp;nbsp;logging.&lt;/li&gt;
&lt;li&gt;Built a microformat-based facet system for activity&amp;nbsp;reporting.&lt;/li&gt;
&lt;li&gt;Finished the single sign-on system for all *.drupal.org&amp;nbsp;properties.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/70716" title="Chris Bryant's profile on Drupal.org" rel="nofollow"&gt;Chris&amp;nbsp;Bryant&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developed content and site architecture maps comparing the Drupal.org structure to what we think &lt;a href="http://www.markboulton.co.uk/" title="Mark Boulton's website" rel="nofollow"&gt;Mark Boulton&lt;/a&gt; is suggesting in his&amp;nbsp;prototypes.&lt;/li&gt;
&lt;li&gt;Reviewed the list of Dashboard widget and where they will appear throughout the&amp;nbsp;site.&lt;/li&gt;
&lt;li&gt;Mapped features needed to implement project-related&amp;nbsp;functionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://groups.drupal.org/user/379" title="Mark Burdett's profile on Drupal.org" rel="nofollow"&gt;Mark&amp;nbsp;Burdett&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Worked on the project browsing&amp;nbsp;form.&lt;/li&gt;
&lt;li&gt;Developed some tools for tracking and displaying &lt;span class="caps"&gt;CVS&lt;/span&gt;&amp;nbsp;statistics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/46549" title="Derek Wright's profile on Drupal.org" rel="nofollow"&gt;Derek&amp;nbsp;Wright&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delegated tasks to other&amp;nbsp;developers.&lt;/li&gt;
&lt;li&gt;Reviewed several&amp;nbsp;patches.&lt;/li&gt;
&lt;li&gt;Fixed some project &lt;span class="caps"&gt;UI&lt;/span&gt;&amp;nbsp;problems.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/3064" title="Neil Drumm's profile on Drupal.org" rel="nofollow"&gt;Neil&amp;nbsp;Drumm&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deleted more code than he added.&amp;nbsp;(Nice.)&lt;/li&gt;
&lt;li&gt;Worked on the &amp;#8220;Add to Dashboard&amp;#8221; links for&amp;nbsp;widgets.&lt;/li&gt;
&lt;li&gt;General &lt;span class="caps"&gt;UI&lt;/span&gt;/&lt;span class="caps"&gt;UX&lt;/span&gt; work for adding widgets to the&amp;nbsp;Dashboard.&lt;/li&gt;
&lt;li&gt;Figure out how cross-site widgets will work across&amp;nbsp;*.drupal.org.&lt;/li&gt;
&lt;li&gt;Ordered &lt;a href="http://www.extremepizza.com/" title="Extreme Pizza" rel="nofollow"&gt;pizza&lt;/a&gt;.&amp;nbsp;(Nice.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/9446" title="Károly Négyesi's profile on Drupal.org" rel="nofollow"&gt;Károly Négyesi&amp;nbsp;(chx)&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Worked on a new parser for the &lt;span class="caps"&gt;API&lt;/span&gt; module. His work will eventually allow commenting on&amp;nbsp;&lt;a href="http://api.drupal.org/" title="Drupal API" rel="nofollow"&gt;api.drupal.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://groups.drupal.org/user/1322" title="Dmitri Gaskin's profile on Drupal.org" rel="nofollow"&gt;Dmitri&amp;nbsp;Gaskin&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build the jQuery-powered map on the front&amp;nbsp;page.&lt;/li&gt;
&lt;li&gt;Started work on remote Dashboard&amp;nbsp;widgets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/59025" title="Jerad Bitner's profile on Drupal.org" rel="nofollow"&gt;Jerad&amp;nbsp;Bitner&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Worked on the jQuery side of the&amp;nbsp;Dashboard.&lt;/li&gt;
&lt;li&gt;Recruited &lt;a href="http://drupal.org/user/35821" title="Nate Haug's profile on Drupal.org" rel="nofollow"&gt;Nate Haug&lt;/a&gt; to&amp;nbsp;help.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/5253" title="Courtney Miller's profile on Drupal.org" rel="nofollow"&gt;Courtney&amp;nbsp;Miller&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed drop-down search form &lt;span class="caps"&gt;CSS&lt;/span&gt; to properly style the checkboxes after they were changed from radio buttons. She also made room for the &amp;#8220;Popular Searches&amp;#8221; feature in that&amp;nbsp;form.&lt;/li&gt;
&lt;li&gt;Worked on the user picture&amp;nbsp;feature.&lt;/li&gt;
&lt;li&gt;Fixed formatting and grid layout of user&amp;nbsp;profiles.&lt;/li&gt;
&lt;li&gt;Created logic to place section titles as non-header text while styling them to appear like &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;&amp;nbsp;elements.&lt;/li&gt;
&lt;li&gt;Documented her side of the &lt;a href="http://drupal.org/node/430994" title="Drupal.org issue: Comment Subject removed in prototype" rel="nofollow"&gt;comment titles debate&lt;/a&gt;. (We &lt;em&gt;&lt;span class="caps"&gt;DO&lt;/span&gt; &lt;span class="caps"&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class="caps"&gt;AGREE&lt;/span&gt;&lt;/em&gt;.)&lt;/li&gt;
&lt;li&gt;Added styling of book navigation&amp;nbsp;menus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/211" title="Erik Hopp's profile on Drupal.org" rel="nofollow"&gt;Erik&amp;nbsp;Hopp&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;$links&lt;/code&gt; styling for&amp;nbsp;nodes.&lt;/li&gt;
&lt;li&gt;Consolidated&amp;nbsp;&lt;span class="caps"&gt;CSS&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Fixed the Views administration&amp;nbsp;interface.&lt;/li&gt;
&lt;li&gt;Added node type classes to node&amp;nbsp;output.&lt;/li&gt;
&lt;li&gt;Fixed styling of the &amp;#8220;Develop with Drupal&amp;#8221; block on the front&amp;nbsp;page.&lt;/li&gt;
&lt;li&gt;Researching styling of the &lt;a href="http://drupal.org/project/project" title="Project module on Drupal.org" rel="nofollow"&gt;Project&lt;/a&gt; module. Later, he will propose a new, more maintainable markup&amp;nbsp;style.&lt;/li&gt;
&lt;li&gt;Improved accessibility of navigation&amp;nbsp;tabs.&lt;/li&gt;
&lt;li&gt;Improved &lt;a href="http://jimthatcher.com/skipnav.htm" title="Skip Navigation Links" rel="nofollow"&gt;skip&amp;nbsp;links&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://drupal.org/user/92096" title="Todd Nienkerk's profile on Drupal.org" rel="nofollow"&gt;Todd Nienkerk&lt;/a&gt; (that&amp;#8217;s&amp;nbsp;me!):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Created graphical elements for the world map on the front&amp;nbsp;page.&lt;/li&gt;
&lt;li&gt;Mapped all colors from the prototypes into a master color&amp;nbsp;palette.&lt;/li&gt;
&lt;li&gt;Created color palette for status, error, and help&amp;nbsp;messages.&lt;/li&gt;
&lt;li&gt;Added comments support to the &lt;a href="http://drupal.org/project/permalink" title="Permalink module for Drupal" rel="nofollow"&gt;Permalink module&lt;/a&gt;. The module now adds an anchored permalink for each&amp;nbsp;comment.&lt;/li&gt;
&lt;li&gt;Created comps for documentation pages. I still need to style classes for good versus bad examples of code, style, language,&amp;nbsp;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/kieran-lal-drupalcon-boston-2008.png" alt="Keiran Lal: Photo by lolg42 on Flickr" title="Keiran Lal: Photo by lolg42 on Flickr"  class="image image-_original " width="150" height="223" /&gt;&lt;span class="caption" style="width: 148px;"&gt;&lt;strong&gt;Keiran Lal: &lt;/strong&gt;Photo by &lt;a href="http://www.flickr.com/photos/7591336@N07/" rel="nofollow"&gt;lolg42&lt;/a&gt; on&amp;nbsp;Flickr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Thanks to the omniscient &lt;a href="http://drupal.org/user/18703" title="Kieran Lal's profile on Drupal.org" rel="nofollow"&gt;Kieran Lal&lt;/a&gt; for posting these earlier San Francisco sprint&amp;nbsp;updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://acquia.com/blog/kieran/drupalorg-redesign-sprint-san-francisco-day-1" title="" rel="nofollow"&gt;Day&amp;nbsp;1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://acquia.com/blog/kieran/drupalorg-re-design-sprint-san-francisco-day-2" title="" rel="nofollow"&gt;Day&amp;nbsp;2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kieran enjoys fine food, wine, and dispensing knowledge of San Francisco&amp;#8217;s microclimates and underground economies. In his spare time, he works tirelessly to build momentum for the Drupal.org&amp;nbsp;redesign.&lt;/p&gt;
&lt;p&gt;Speaking of the&amp;nbsp;redesign&amp;#8230;&lt;/p&gt;
&lt;h2&gt;You can&amp;nbsp;help!&lt;/h2&gt;
&lt;p&gt;We need &lt;em&gt;you&lt;/em&gt; to help us launch &lt;a href="http://infrastructure.drupal.org/drupal.org-style-guide/prototype.html" title="Mark Boulton's prototype for Drupal.org" rel="nofollow"&gt;the new Drupal.org&lt;/a&gt;. Here&amp;#8217;s what you can&amp;nbsp;do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Join the &lt;a href="http://groups.drupal.org/drupalorg-redesign-theme-implementers" title="Drupal.org redesign implementers group on groups.drupal.org" rel="nofollow"&gt;Drupal.org redesign implementers&lt;/a&gt;&amp;nbsp;group.&lt;/li&gt;
&lt;li&gt;Read &lt;a href="http://groups.drupal.org/node/18940" title="Drupal.org redesign: Design TODO and style guide changes" rel="nofollow"&gt;the &lt;span class="caps"&gt;TODO&lt;/span&gt; list&lt;/a&gt; to get an idea of what we need&amp;nbsp;done.&lt;/li&gt;
&lt;li&gt;Visit the issue queues to find specific tasks. Assign them to yourself and fix &amp;#8216;em!
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/issues/search?issue_tags=drupal.org%20redesign" rel="nofollow"&gt;All redesign issues (tagged &lt;em&gt;drupal.org redesign&lt;/em&gt;)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/issues/search?issue_tags=Bluecheese%20theme" rel="nofollow"&gt;Bluecheese theme (tagged &lt;em&gt;Bluecheese theme&lt;/em&gt;)&lt;/a&gt;. &amp;#8220;Bluecheese&amp;#8221; is the name of the new design. &lt;a href="http://morten.dk/" title="King of Denmark" rel="nofollow"&gt;Morten.dk&lt;/a&gt; is&amp;nbsp;responsible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Most importantly, don&amp;#8217;t wait for an invitation! Dive right in. If you have any questions, we&amp;#8217;re in #drupal-infrastructure on irc.freenode.net. (Here&amp;#8217;s &lt;a href="http://drupal.org/irc" title="Drupal.org: How to use IRC effectively" rel="nofollow"&gt;how to use&amp;nbsp;&lt;span class="caps"&gt;IRC&lt;/span&gt;&lt;/a&gt;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/san-francisco-2.preview.jpg" alt="Photo by wili_hybrid on Flickr (CC-Attribution)" title="Photo by wili_hybrid on Flickr (CC-Attribution)"  class="image image-preview " width="600" height="400" /&gt;&lt;span class="caption"&gt;Photo by &lt;a href="http://www.flickr.com/photos/wili/417187625/" rel="nofollow"&gt;wili_hybrid&lt;/a&gt; on Flickr&amp;nbsp;(&lt;span class="caps"&gt;CC&lt;/span&gt;-Attribution)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=nT3mGBE-JZI:RJyO0ENUTMc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=nT3mGBE-JZI:RJyO0ENUTMc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/04/11/drupalorg-redesign-sprint-san-francisco-day-4#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/community">Community</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/development">Development</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <pubDate>Sat, 11 Apr 2009 20:17:19 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">168 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Drupal's vulnerability reports are not signs of security weakness</title>
    <link>http://fourkitchens.com/blog/2009/04/03/vulnerability-reports-are-not-indications-weakness</link>
    <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/2169309452_db8650cae1_o.jpg.300px wide.jpeg" alt="Photo by loop_oh on Flickr." title="Photo by loop_oh on Flickr."  class="image image-300px wide " width="300" height="200" /&gt;&lt;span class="caption" style="width: 298px;"&gt;Photo by loop_oh on&amp;nbsp;Flickr.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been tweeting back and forth with &lt;a href="https://twitter.com/limi4plone" rel="nofollow"&gt;Alex Limi&lt;/a&gt;, one of the founders of Plone, about the validity of the security analysis from &lt;a href="http://idealware.org/comparing_os_cms/idealware_comparing_os_cms_report.pdf" rel="nofollow"&gt;a &lt;span class="caps"&gt;CMS&lt;/span&gt; comparison report&lt;/a&gt; that includes Plone and Drupal. He&amp;#8217;s proud of Plone&amp;#8217;s infrequent vulnerability notices; it had two in the last year. Drupal had 26. Alex also cited &lt;a href="http://www-935.ibm.com/services/us/iss/xforce/trendreports/" rel="nofollow"&gt;a related &lt;span class="caps"&gt;IBM&lt;/span&gt; report on security&lt;/a&gt; in &lt;a href="https://twitter.com/limi4plone/statuses/1442772201" rel="nofollow"&gt;a later&amp;nbsp;tweet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While both reports above seem to identify Drupal (and Joomla! and WordPress, to be fair) as having notably bad security, they&amp;#8217;re also both based on one superficial metric: self-reported vulnerabilities. Neither severity &lt;em&gt;nor&lt;/em&gt; response time &lt;em&gt;nor&lt;/em&gt; history of actual exploitation factored in.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
The vulnerabilities in question have all (long) been fixed in Drupal, so Alex&amp;#8217;s argument could only be that past occurrences of vulnerability reports are a predictor of future security problems. Unfortunately, he merely begs the question of correlation without answering it, and that&amp;#8217;s only the beginning of the problems with his&amp;nbsp;argument.&lt;/p&gt;
&lt;p&gt;Even if vulnerability reports were perfect indicators of future risk, vulnerability self-reporting carries a high conflict-of-interest. This conflict is especially strong when, like Alex, &lt;a href="https://twitter.com/limi4plone/statuses/1439350794" rel="nofollow"&gt;you argue that the quantity of reports you issue should be held against your&amp;nbsp;project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Drupal community (both in developers and users) is much larger than the Plone one, and &lt;a href="http://www.google.com/trends?q=plone%2C+drupal"&gt;the two continue to&amp;nbsp;diverge&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/drupal_vs_plone.png" alt="Drupal is red, and Plone is blue (to state the obvious)." title="Drupal is red, and Plone is blue (to state the obvious)."  class="image image-_original " width="580" height="260" /&gt;&lt;span class="caption"&gt;Drupal is red, and Plone is blue (to state the&amp;nbsp;obvious).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Many of us in the free software community are familiar with &lt;a href="http://en.wikipedia.org/wiki/Linus's_Law" rel="nofollow"&gt;Linus&amp;#8217;s Law&lt;/a&gt;: &amp;#8220;given enough eyeballs, all bugs are shallow.&amp;#8221; Vulnerabilities are merely a special class of bugs. All other things being equal, Drupal&amp;#8217;s larger developer and user base should be expected to find and publish more vulnerability reports than&amp;nbsp;Plone&amp;#8217;s.&lt;/p&gt;
&lt;p&gt;But Drupal had more than just community growth in 2008; it also experienced unprecedented security review thanks to work by Barry Jaspan, who &lt;a href="http://szeged2008.drupalcon.org/program/sessions/automatic-security-testing-static-and-dynamic-analysis" rel="nofollow"&gt;presented his findings at Drupalcon Szeged 2008&lt;/a&gt;. Barry subjected Drupal&amp;#8217;s core code to static and dynamic analysis, resulting in the discovery of several vulnerabilities. Has Plone undergone similar scrutiny? A quick search on Google didn&amp;#8217;t uncover anything of the&amp;nbsp;sort.&lt;/p&gt;
&lt;p&gt;Despite &lt;a href="https://twitter.com/limi4plone/statuses/1442775280" rel="nofollow"&gt;Alex&amp;#8217;s thoughts on my stubbornness&lt;/a&gt;, I am open to an honest evaluation of Drupal&amp;#8217;s security versus similar tools. I&amp;#8217;m just not willing to base the debate on a superficial metric of such questionable&amp;nbsp;importance.&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=LYWQkI9yLAA:rRcdvUw_PAM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=LYWQkI9yLAA:rRcdvUw_PAM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/04/03/vulnerability-reports-are-not-indications-weakness#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/development/php">PHP</category>
 <category domain="http://fourkitchens.com/tags/development/software-architecture">Software Architecture</category>
 <category domain="http://fourkitchens.com/tags/software/plone">Plone</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/security">Security</category>
 <pubDate>Thu, 02 Apr 2009 22:47:44 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">165 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Check out Four Kitchens' hot new logos!</title>
    <link>http://fourkitchens.com/blog/2009/04/01/four-kitchens-hot-new-logos</link>
    <description>&lt;p&gt;After many months of deliberation, we&amp;#8217;ve decided to totally rebrand Four Kitchens. It was a tough decision &amp;#8212; there&amp;#8217;s so much work that needs to be done &amp;#8212; but we decided, in the end, that our firm needed a new&amp;nbsp;look.&lt;/p&gt;
&lt;p&gt;Our goals for the rebranding&amp;nbsp;are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identify Four Kitchens as a leading &lt;a href="http://fourkitchens.com/"&gt;Drupal consulting&amp;nbsp;firm&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Raise awareness of our design skills and portfolio. (We&amp;#8217;re not just scalability&amp;nbsp;experts!)&lt;/li&gt;
&lt;li&gt;Create an iconic brand that associates the Four Kitchens with quality, respect, and community&amp;nbsp;involvement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please check out our ideas below. Any feedback is welcome. &lt;strong&gt;We really need your&amp;nbsp;help!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Four Kitchens logo: version&amp;nbsp;1&lt;/h2&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/foolsday-chapthree-logo-parody.png" alt="Inspiration: Building a website is like reading a book. First, you ride your fixed-gear bike to a locally owned, vegan bookstore and pick out something about World Trade Organization-sponsored coups. Then you turn the book over to see how much it costs. Finally, you pedal home -- uphill -- and buy it on Amazon in a hot minute." title="Inspiration: Building a website is like reading a book. First, you ride your fixed-gear bike to a locally owned, vegan bookstore and pick out something about World Trade Organization-sponsored coups. Then you turn the book over to see how much it costs. Finally, you pedal home -- uphill -- and buy it on Amazon in a hot minute."  class="image image-_original " width="538" height="197" /&gt;&lt;span class="caption"&gt;Inspiration: Building a website is like reading a book. First, you ride your fixed-gear bike to a locally owned, vegan bookstore and pick out something about World Trade Organization-sponsored coups. Then you turn the book over to see how much it costs. Finally, you pedal home &amp;#8212; uphill &amp;#8212; and buy it on Amazon in a hot minute.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;/p&gt;
&lt;h2&gt;Four Kitchens logo: version&amp;nbsp;2&lt;/h2&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/foolsday-devseed-logo-parody.png" alt="Inspiration: Building a website is like growing a plant. If you leave it in the sun too long, it will wither up and die. Then you have a dried up, dead plant, dummy. What a waste of five bucks. Oh, and you have to make a geospatial/SMS mashup that visualizes demographic data based on your proximity to a mailbox, squirrel population, volcanic activity, and roadside historical markers." title="Inspiration: Building a website is like growing a plant. If you leave it in the sun too long, it will wither up and die. Then you have a dried up, dead plant, dummy. What a waste of five bucks. Oh, and you have to make a geospatial/SMS mashup that visualizes demographic data based on your proximity to a mailbox, squirrel population, volcanic activity, and roadside historical markers."  class="image image-_original " width="529" height="172" /&gt;&lt;span class="caption"&gt;Inspiration: Building a website is like growing a plant. If you leave it in the sun too long, it will wither up and die. Then you have a dried up, dead plant, dummy. What a waste of five bucks. Oh, and you have to make a geospatial/&lt;span class="caps"&gt;SMS&lt;/span&gt; mashup that visualizes demographic data based on your proximity to a mailbox, squirrel population, volcanic activity, and roadside historical&amp;nbsp;markers.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Four Kitchens logo: version&amp;nbsp;3&lt;/h2&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/foolsday-lullabot-logo-parody.png" alt="Inspiration: Building a website is a lot like owning a giant, red robot. Everybody thinks it&amp;#039;s cute, but you&amp;#039;re the one that has to follow it around with plastic bags on your hands, cleaning up its piles of instructional DVDs." title="Inspiration: Building a website is a lot like owning a giant, red robot. Everybody thinks it&amp;#039;s cute, but you&amp;#039;re the one that has to follow it around with plastic bags on your hands, cleaning up its piles of instructional DVDs."  class="image image-_original " width="600" height="680" /&gt;&lt;span class="caption"&gt;Inspiration: Building a website is a lot like owning a giant, red robot. Everybody thinks it&amp;#8217;s cute, but you&amp;#8217;re the one that has to follow it around with plastic bags on your hands, cleaning up its piles of instructional&amp;nbsp;DVDs.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;: Version 4 submitted by a loyal&amp;nbsp;reader&lt;/h2&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/4539127.png" alt="" title=""  class="image image-_original " width="400" height="150" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re not sure &lt;a href="http://twitter.com/pingv/status/1435559821"&gt;who made this&lt;/a&gt;, but we like it! They deserve a &lt;em&gt;ping,&lt;/em&gt; whoever they&amp;nbsp;are&amp;#8230;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ShYIBL-e-JY:SrlavvOXiJM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ShYIBL-e-JY:SrlavvOXiJM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/04/01/four-kitchens-hot-new-logos#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <pubDate>Wed, 01 Apr 2009 17:17:24 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">160 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Project Manager Shannon Hinshaw's "SCRUM-ptious" birthday cake</title>
    <link>http://fourkitchens.com/blog/2009/03/31/project-manager-shannon-hinshaws-scrum-ptious-birthday-cake</link>
    <description>&lt;p&gt;We at Four Kitchens are devotees of the &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;scrum method of development&lt;/a&gt;. When we celebrated the birthday of our Project Manager and Certified Scrum Master Shannon Hinshaw, we could think of nothing more appropriate than a &lt;span class="caps"&gt;SCRUM&lt;/span&gt;-ptious&amp;nbsp;cake:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/SCRUM-cake.jpg" alt="Task: Eat the cake (999 points)" title="Task: Eat the cake (999 points)"  class="image image-_original " width="600" height="450" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Task: Eat the cake (999 points)&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
The cake will be eaten in two-minute increments during our daily standing&amp;nbsp;meetings.&lt;/p&gt;
&lt;p&gt;(In case you&amp;#8217;re wondering, that&amp;#8217;s a &lt;a href="http://www.theuppercrustbakery.com/desserts/Chocolate_Italian_Cream.cfm"&gt;chocolate Italian cream cake&lt;/a&gt; from the &lt;a href="http://www.theuppercrustbakery.com/"&gt;Upper Crust Bakery&lt;/a&gt; in Austin, Texas. Special thanks to their crew, who always handle our unusual syntactical requests without&amp;nbsp;hesitation.)&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=SweUcl_35qU:BgrvgXVP3UE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=SweUcl_35qU:BgrvgXVP3UE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/31/project-manager-shannon-hinshaws-scrum-ptious-birthday-cake#comments</comments>
 <category domain="http://fourkitchens.com/tags/project-management/scrum-method">Scrum method</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/project-management">Project Management</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <pubDate>Tue, 31 Mar 2009 13:50:15 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">158 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>The Transatlantic Tacky Swag Swap has begun!</title>
    <link>http://fourkitchens.com/blog/2009/03/31/drupal-tacky-swag-swap-mortendk</link>
    <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;a href="http://fourkitchens.com/sites/default/files/images/swag-swap---aaron.jpg" onclick="launch_popup(153, 600, 800); return false;" target="_blank"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/swag-swap---aaron.300px wide.jpg" alt="Web Chef Aaron Stanush &amp;quot;mugs&amp;quot; for the camera. Get it?" title="Web Chef Aaron Stanush &amp;quot;mugs&amp;quot; for the camera. Get it?"  class="image image-300px wide " width="225" height="300" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 223px;"&gt;&lt;strong&gt;Web Chef Aaron Stanush &amp;#8220;mugs&amp;#8221; for the camera. Get&amp;nbsp;it?&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Drupal themer extraordinaire &lt;a href="http://morten.dk/" rel="nofollow"&gt;Morten.dk&lt;/a&gt;, currently ranked #7 on Google for &lt;a href="http://www.google.com/search?q=king+of+Denmark" rel="nofollow"&gt;&amp;#8220;king of Denmark&amp;#8221;&lt;/a&gt;, has been bugging us for a Don&amp;#8217;t Mess with Texas mug. Well, &amp;#8220;bugging&amp;#8221; may not be the right word. &amp;#8220;Profanely demanding&amp;#8221; is more&amp;nbsp;appropriate.&lt;/p&gt;
&lt;p&gt;Finding one was surprisingly difficult. While (lesser) cities like Dallas and Houston are lined with shops hawking rattlesnake heads and scorpions encased in plastic, there doesn&amp;#8217;t seem to be much demand for Texas memorabilia in&amp;nbsp;Austin.&lt;/p&gt;
&lt;p&gt;Except at the airport, where you can find your name stamped on a fake Texas license plate or worn chunk of&amp;nbsp;fencepost.&lt;/p&gt;
&lt;p&gt;So, after scoring the great city of Austin for tacky crap, we proudly present Morten.dk&amp;#8217;s Don&amp;#8217;t Mess with Texas&amp;nbsp;mug:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/swag-swap---mug.jpg" alt="Morten.dk&amp;#039;s Don&amp;#039;t Mess with Texas mug" title="Morten.dk&amp;#039;s Don&amp;#039;t Mess with Texas mug"  class="image image-_original " width="600" height="450" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Morten.dk&amp;#8217;s Don&amp;#8217;t Mess with Texas mug&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;span class="inline inline-right"&gt;&lt;a href="http://fourkitchens.com/sites/default/files/images/swag-swap---box.jpg" onclick="launch_popup(155, 600, 450); return false;" target="_blank"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/swag-swap---box.300px wide.jpg" alt="Denmark or bust!" title="Denmark or bust!"  class="image image-300px wide " width="300" height="225" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 298px;"&gt;&lt;strong&gt;Denmark or&amp;nbsp;bust!&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In return, we demand Morten.dk send &lt;em&gt;us&lt;/em&gt; the tackiest Danish thing he can get his hands on. (I seem to remember him saying something about mermaids. Is that a Danish thing? Is Denmark known for mermaids or mer-related&amp;nbsp;activity?)&lt;/p&gt;
&lt;p&gt;Morten, the ball&amp;#8217;s in your court. The gloves are off, and I&amp;#8217;ve thrown down the gauntlet. There&amp;#8217;s a line in the sand. You&amp;#8217;re walking a&amp;nbsp;tightrope.&lt;/p&gt;
&lt;p&gt;That is to say, you have been challenged. &lt;strong&gt;The Transatlantic Tacky Swag Swap has&amp;nbsp;begun!&lt;/strong&gt;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=2-sEEttX3bk:Z6-h1ft4RBs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=2-sEEttX3bk:Z6-h1ft4RBs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/31/drupal-tacky-swag-swap-mortendk#comments</comments>
 <category domain="http://fourkitchens.com/tags/austin">Austin</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/community">Community</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <pubDate>Tue, 31 Mar 2009 11:37:28 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">156 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>The hidden costs of proprietary software: #2 your vendor is an adversary</title>
    <link>http://fourkitchens.com/blog/2009/03/02/hidden-costs-proprietary-software-2-your-vendor-adversary</link>
    <description>&lt;p&gt;&lt;img src="/sites/default/files/drm.png" class="floatright" alt="unhappy DRM face" /&gt;&lt;/p&gt;
&lt;p&gt;On December 2, 2008, customers of SonicWALL woke up to broken firewalls. This wasn&amp;#8217;t the result of a real problem in the firewalls; it was a result of SonicWALL&amp;#8217;s &lt;a href="http://www.thetechherald.com/article.php/200849/2555/SonicWALL-outage-frustrates-customers-who-felt-exposed" rel="nofollow"&gt;&lt;span class="caps"&gt;DRM&lt;/span&gt; server malfunctioning and deactivating all customer&amp;nbsp;firewalls&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The relationship between customers and vendors of proprietary software is fundamentally adversarial: proprietary vendors have business models where customer activity (like installing Windows on a desktop) requires payment to the vendor. Because the activity happens entirely on the customer side and paying the vendor conflicts with the customer&amp;#8217;s desire to save money, proprietary software vendors don&amp;#8217;t trust their customers to pay them.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
So, they&amp;#8217;ve developed strategies based on customer distrust. One of these strategies is embedding &lt;span class="caps"&gt;DRM&lt;/span&gt;, software &lt;em&gt;their customers&lt;/em&gt; run that looks out for &lt;em&gt;the vendor&amp;#8217;s interests&lt;/em&gt;. &lt;span class="caps"&gt;DRM&lt;/span&gt; systems, like Microsoft&amp;#8217;s activation tools, continually threaten to disable the software customers rely on. And, with few exceptions, they run on code the customers cannot&amp;nbsp;inspect.&lt;/p&gt;
&lt;p&gt;Microsoft has removed activation code from many of their server products, but it remains common in their desktop products, like Windows and Office. Other proprietary vendors (like SonicWALL) still have it in their server and infrastructure code. Any software that has secret failure mechanisms integrated for the vendor&amp;#8217;s sake has no place in important business&amp;nbsp;infrastructure.&lt;/p&gt;
&lt;p&gt;Software fails often enough without being &lt;a href="http://www.defectivebydesign.org/" rel="nofollow"&gt;defective by&amp;nbsp;design&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=bPJNUwh9IyY:yM1AcCZLRtU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=bPJNUwh9IyY:yM1AcCZLRtU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/02/hidden-costs-proprietary-software-2-your-vendor-adversary#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/software/proprietary-software">Proprietary Software</category>
 <category domain="http://fourkitchens.com/tags/software/windows">Windows</category>
 <category domain="http://fourkitchens.com/tags/free-software">Free Software</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <category domain="http://fourkitchens.com/tags/software">Software</category>
 <category domain="http://fourkitchens.com/blog/series/hidden-costs-proprietary-software">Hidden costs of proprietary software</category>
 <pubDate>Wed, 25 Mar 2009 17:13:19 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">143 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Bazaar 1.13 RPMs for RHEL 5 and CentOS 5</title>
    <link>http://fourkitchens.com/blog/2009/03/22/bazaar-113-rpms-rhel-5-centos-5</link>
    <description>&lt;p&gt;&lt;img src="/sites/default/files/bazaar_logo.png" class="floatright" /&gt;&lt;br /&gt;
Fresh packages, 64-bit only this time. I can make 32-bit ones if anyone would like&amp;nbsp;some.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.13-1.x86_64.rpm"&gt;Bazaar&amp;nbsp;x86_64&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.13-1.src.rpm"&gt;Bazaar&amp;nbsp;&lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.13.0-1.x86_64.rpm"&gt;BzrTools x86_64 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.13.0-1.src.rpm"&gt;BzrTools&amp;nbsp;&lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=hZnExsyAF2s:6wGS7r6A3ac:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=hZnExsyAF2s:6wGS7r6A3ac:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/22/bazaar-113-rpms-rhel-5-centos-5#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/tags/software/linux/centos">CentOS</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/software/linux">Linux</category>
 <category domain="http://fourkitchens.com/tags/software/linux/rhel">RHEL</category>
 <pubDate>Sat, 21 Mar 2009 23:03:00 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">151 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>BarCampAustin 4 graphics are awesome</title>
    <link>http://fourkitchens.com/blog/2009/03/12/barcampaustin-4-graphics-are-awesome</link>
    <description>&lt;p&gt;&lt;a href="http://barcamp.org/BarCampAustin4"&gt;BarCampAustin 4&lt;/a&gt; graphics have arrived, and they are totally rad. Congrats all around to the fine folks who made them&amp;nbsp;happen.&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/barcampaustin4-logo-dj-dillo.png" alt="DJ Dillo: BarCampAustin 4 logo" title="DJ Dillo: BarCampAustin 4 logo"  class="image image-_original " width="299" height="367" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;&lt;span class="caps"&gt;DJ&lt;/span&gt; Dillo: &lt;/strong&gt;BarCampAustin 4 logo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/barcampaustin4-badge-front.jpg.jpg" alt="BarCampAustin 4 badge (front)" title="BarCampAustin 4 badge (front)"  class="image image-_original " width="270" height="450" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;BarCampAustin 4 badge&amp;nbsp;(front)&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/barcampaustin4-badge-back.jpg" alt="BarCampAustin 4 badge (back)" title="BarCampAustin 4 badge (back)"  class="image image-_original " width="270" height="450" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;BarCampAustin 4 badge&amp;nbsp;(back)&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here are some handy BarCampAustin&amp;nbsp;links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.facebook.com/event.php?eid=60155791604"&gt;BarCampAustin 4 Facebook event page&lt;/a&gt; (&lt;span class="caps"&gt;RSVP&lt;/span&gt;&amp;nbsp;here!)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.facebook.com/pages/BarCampAustin/54920728222"&gt;BarCampAustin Facebook&amp;nbsp;page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh, and there will be a &lt;a href="http://www.facebook.com/photo.php?pid=2152806&amp;amp;id=54920728222&amp;amp;ref=mf"&gt;special&amp;nbsp;guest&lt;/a&gt;&amp;#8230;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=n5a1tj8WdqM:Y8II-d-Fwy4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=n5a1tj8WdqM:Y8II-d-Fwy4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/12/barcampaustin-4-graphics-are-awesome#comments</comments>
 <category domain="http://fourkitchens.com/tags/austin">Austin</category>
 <category domain="http://fourkitchens.com/tags/conferences/barcamp">BarCamp</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <pubDate>Thu, 12 Mar 2009 15:40:44 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">150 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>"CVS Instructions" tab now available for all Drupal.org projects</title>
    <link>http://fourkitchens.com/blog/2009/03/12/cvs-instructions-tab-now-available-all-drupalorg-projects</link>
    <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;a href="http://www.fourkitchens.com/sites/default/files/images/cvs_instructions_tab.png" onclick="launch_popup(145, 600, 727); return false;" target="_blank"&gt;&lt;img src="http://www.fourkitchens.com/sites/default/files/images/cvs_instructions_tab.300px wide.png" alt="&amp;quot;CVS Instructions&amp;quot; tab on the Author Taxonomy module" title="&amp;quot;CVS Instructions&amp;quot; tab on the Author Taxonomy module"  class="image image-300px wide " width="300" height="364" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 298px;"&gt;&lt;strong&gt;&amp;#8220;&lt;span class="caps"&gt;CVS&lt;/span&gt; Instructions&amp;#8221; tab on the Author Taxonomy&amp;nbsp;module&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drupal&amp;#8217;s &lt;abbr title="Concurrent Versions System"&gt;&lt;span class="caps"&gt;CVS&lt;/span&gt;&lt;/abbr&gt; is now more&amp;nbsp;user-friendly!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As part of the Documentation Sprint at &lt;a href="http://dc2009.drupalcon.org/"&gt;Drupalcon &lt;span class="caps"&gt;DC&lt;/span&gt; 2009&lt;/a&gt;, web chef David Strauss built a &amp;#8220;&lt;span class="caps"&gt;CVS&lt;/span&gt; Instructions&amp;#8221; tab for Drupal.org. The tab provides concise, step-by-step instructions on how to check out, commit, patch, tag, and branch any module or theme. A simple drop-down box at the top of the page allows the user to select the version of the module or theme they want to work with, and the instructions are updated to display exact, copy-and-pastable commands.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
Here&amp;#8217;s an example of the &lt;a href="http://drupal.org/node/245667/cvs-instructions/DRUPAL-6--1"&gt;&lt;span class="caps"&gt;CVS&lt;/span&gt; Instructions tab for the 6.x-1.x branch of Author&amp;nbsp;Taxonomy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This tiny feature represents a huge step forward in Drupal&amp;#8217;s approach to opening its doors to contributors of all skill levels. This is especially important for those designers among us, many of whom cannot contribute themes &amp;#8212; something Drupal &lt;em&gt;sorely&lt;/em&gt; lacks &amp;#8212; because they do not understand Drupal&amp;#8217;s arcane &lt;span class="caps"&gt;CVS&lt;/span&gt; or command-line interaction in general. At Drupalcon &lt;span class="caps"&gt;DC&lt;/span&gt;, we designers pledged to learn and use the developer-oriented tools used by the Drupal community &amp;#8212; namely &lt;span class="caps"&gt;IRC&lt;/span&gt; and &lt;span class="caps"&gt;CVS&lt;/span&gt;. Simple steps like the &amp;#8220;&lt;span class="caps"&gt;CVS&lt;/span&gt; Instructions&amp;#8221; tab move mountains for those who would otherwise give up and not contribute anything at&amp;nbsp;all.&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=zMyhf1sa2Yc:x3HEgC66WnY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=zMyhf1sa2Yc:x3HEgC66WnY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/12/cvs-instructions-tab-now-available-all-drupalorg-projects#comments</comments>
 <category domain="http://fourkitchens.com/tags/development/drupal-modules">Drupal Modules</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/version-control/cvs">CVS</category>
 <category domain="http://fourkitchens.com/tags/design/drupal-themes">Drupal Themes</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Thu, 12 Mar 2009 09:38:36 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">146 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>The hidden costs of proprietary software: #1 optimizing around licensing</title>
    <link>http://fourkitchens.com/blog/2009/03/02/hidden-costs-proprietary-software-1-optimizing-around-licensing</link>
    <description>&lt;p&gt;&lt;a href="http://www.google.com/search?q=hidden+cost+open+source"&gt;Articles abound&lt;/a&gt; about the &amp;#8220;hidden costs&amp;#8221; of using free, open-source software. Many of them are sponsored by companies with a stake in their own proprietary solutions &amp;#8212; and they&amp;#8217;re responding to the threat of increasing enthusiasm about free alternatives. Some of the claims are legitimate; others are&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt" rel="nofollow"&gt;&lt;span class="caps"&gt;FUD&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here at Four Kitchens, we&amp;#8217;re on the opposite side. We advocate using free software like Drupal (and our own free-software derivative, Pressflow) whenever possible. When it&amp;#8217;s not immediately possible, it&amp;#8217;s a hard decision between writing a free solution and going proprietary. We enjoy the freedom of free software for many reasons, especially because it doesn&amp;#8217;t feel like we&amp;#8217;re fighting the company behind the software in order to get the most out of it.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;strong&gt;The problem with proprietary&amp;nbsp;licensing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Proprietary software usually requires licensing fees; this is hardly a &amp;#8220;hidden cost.&amp;#8221; The hidden cost is  &lt;em&gt;identifying&lt;/em&gt; the optimal licenses and &lt;em&gt;developing around&lt;/em&gt; them. Technical people suddenly get involved in the business decisions of what licenses the the organization needs to buy. Business people put constraints on the technical team with what licenses they approve. They&amp;#8217;re both operating outside their areas of expertise, something that should be&amp;nbsp;minimized.&lt;/p&gt;
&lt;p&gt;Whether it be &lt;a href="http://www.oracle.com/database/product_editions.html" rel="nofollow"&gt;differences between Oracle editions&lt;/a&gt;, &lt;a href="http://www-01.ibm.com/software/lotus/passportadvantage/pvu_licensing_for_customers.html" rel="nofollow"&gt;Lotus&amp;#8217;s processor value unit formulas&lt;/a&gt;, or &lt;a href="http://www-03.ibm.com/systems/z/os/linux/solutions/ifl.html" rel="nofollow"&gt;what restrictions &lt;span class="caps"&gt;IBM&lt;/span&gt; puts on its &lt;span class="caps"&gt;IFL&lt;/span&gt; cards&lt;/a&gt;, they&amp;#8217;re all technically arbitrary restrictions designed to maximize &lt;a href="http://en.wikipedia.org/wiki/Price_discrimination" rel="nofollow"&gt;price discrimination&lt;/a&gt;. In other words, the vendors want to make different customers each pay as much as possible for the same basic&amp;nbsp;product.&lt;/p&gt;
&lt;p&gt;Companies are even up-front that these licensing schemes are wholly for settings price&amp;nbsp;tiers:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The attractively priced &lt;span class="caps"&gt;IFL&lt;/span&gt; processor enables you to purchase additional processing capacity exclusively for Linux workloads, without affecting the &lt;span class="caps"&gt;MSU&lt;/span&gt; rating or the &lt;span class="caps"&gt;IBM&lt;/span&gt; System z™ model designation. This means that an &lt;span class="caps"&gt;IFL&lt;/span&gt; will not increase charges for System z software running on general purpose (standard) processors in the&amp;nbsp;server.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;For readers unfamiliar with the System z &lt;span class="caps"&gt;IFL&lt;/span&gt; scheme, IFLs are identical except for the microcode restrictions &lt;span class="caps"&gt;IBM&lt;/span&gt; installs to prevent running an unapproved &amp;#8220;workload&amp;#8221; on a restricted &lt;span class="caps"&gt;IFL&lt;/span&gt;. So, instead of simply buying the number of processors the server needs, systems architects have to choose how many Java cards, Linux cards, and general-purpose cards will go into their mainframe, despite them all being physically&amp;nbsp;identical.&lt;/p&gt;
&lt;p&gt;The cost to the team is &lt;em&gt;engineering around these arbitrary restrictions&lt;/em&gt;, restrictions that may be vaguely defined, as in &lt;a href="http://www.microsoft.com/sql/techinfo/planning/choosEd.doc" rel="nofollow"&gt;some editions of Microsoft &lt;span class="caps"&gt;SQL&lt;/span&gt; Server&lt;/a&gt; (.doc), where &amp;#8220;&amp;#8230;performance degrades when more than five Transact-&lt;span class="caps"&gt;SQL&lt;/span&gt; batches are executed&amp;nbsp;concurrently.&amp;#8221;&lt;/p&gt;
&lt;p&gt;As a developer and systems architect, I don&amp;#8217;t like designing systems around restrictions artificially imposed by sales and marketing teams, especially when they&amp;#8217;re vague. I&amp;#8217;d much rather design around real restrictions and spend the rest of the time building great software. Don&amp;#8217;t systems architects have enough to worry&amp;nbsp;about?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=sqnPQbZniF4:sKD1Bd1L7MU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=sqnPQbZniF4:sKD1Bd1L7MU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/02/hidden-costs-proprietary-software-1-optimizing-around-licensing#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal/pressflow">Pressflow</category>
 <category domain="http://fourkitchens.com/tags/software/proprietary-software">Proprietary Software</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/free-software">Free Software</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <category domain="http://fourkitchens.com/blog/series/hidden-costs-proprietary-software">Hidden costs of proprietary software</category>
 <pubDate>Sun, 01 Mar 2009 20:35:48 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">142 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>What makes Pressflow scale: #1 faster core queries</title>
    <link>http://fourkitchens.com/blog/2009/03/01/what-makes-pressflow-scale-1-faster-core-queries</link>
    <description>&lt;p&gt;Drupal has a number of queries with unfortunate scalability&amp;nbsp;profiles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;URL&lt;/span&gt; alias counting&lt;/strong&gt; (one instance in&amp;nbsp;core)&lt;/p&gt;
&lt;p&gt;The biggest offender in Drupal 5 and Drupal 6 is the query counting the number of &lt;span class="caps"&gt;URL&lt;/span&gt; aliases: &lt;code&gt;SELECT COUNT(&lt;em&gt;) &lt;span class="caps"&gt;FROM&lt;/span&gt; url_alias&lt;/em&gt;&lt;/code&gt;. This query dates back to when nearly every Drupal site ran on MyISAM, which is important because MyISAM keeps an exact count of the number of rows in every table, making &lt;code&gt;SELECT COUNT () FROM [table]&lt;/code&gt; an &lt;em&gt;O(1)&lt;/em&gt; (read: fast, constant-time)&amp;nbsp;operation.&lt;/p&gt;
&lt;p&gt;But InnoDB, the engine of choice for high-scale Drupal sites, does not keep an exact row count for tables because its multiversion concurrency control (&lt;span class="caps"&gt;MVCC&lt;/span&gt;) makes such a count difficult and inefficient. But, MySQL with InnoDB still faithfully runs the query, but by counting every row in the table, an &lt;em&gt;O(n)&lt;/em&gt; operation, meaning it is proportionally slow to number of &lt;span class="caps"&gt;URL&lt;/span&gt; aliases on the&amp;nbsp;site.&lt;/p&gt;
&lt;p&gt;Such counting is particularly unfortunate because the &lt;span class="caps"&gt;URL&lt;/span&gt; alias system only cares whether the number is zero or the number is greater than zero. In Pressflow 5 and Pressflow 6, we replace this query with &lt;code&gt;SELECT pid FROM url_alias LIMIT 1&lt;/code&gt; (or equivalent), giving us just the information we need (&amp;#8220;Is there at least one alias?&amp;#8221;) in a way that runs in &lt;em&gt;O(1)&lt;/em&gt; on both MyISAM and&amp;nbsp;InnoDB.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use of &lt;span class="caps"&gt;LOWER&lt;/span&gt;() for case-insensitivity&lt;/strong&gt; (many places in&amp;nbsp;core)&lt;/p&gt;
&lt;p&gt;Drupal 5, 6, and 7 all currently use &lt;span class="caps"&gt;LOWER&lt;/span&gt;() on both sides of some queries to create database-agnostic, case-insensitive string matches. The uses of &lt;span class="caps"&gt;LOWER&lt;/span&gt;() in Drupal on the a table column prior to comparison in a query automatically degrades queries to &lt;em&gt;O(n)&lt;/em&gt; with respect to the number of users on the site. The most users a site has, the more time login and other frequent user operations&amp;nbsp;take.&lt;/p&gt;
&lt;p&gt;The reason Drupal 5 and 6 use &lt;span class="caps"&gt;LOWER&lt;/span&gt;() is because PostgreSQL&amp;#8217;s &lt;span class="caps"&gt;LIKE&lt;/span&gt; operation performs case-sensitive comparisons. (And PostgreSQL&amp;#8217;s &lt;span class="caps"&gt;ILIKE&lt;/span&gt; operation is not cross-platform.) By using &lt;span class="caps"&gt;LOWER&lt;/span&gt;(), the same query can run on MySQL and PostgreSQL without&amp;nbsp;modification.&lt;/p&gt;
&lt;p&gt;But Pressflow 5 and Pressflow 6 only explicitly support MySQL, so they can take advantage of MySQL&amp;#8217;s case-insensitive collations and seamlessly drop the &lt;span class="caps"&gt;LOWER&lt;/span&gt;(). Dropping &lt;span class="caps"&gt;LOWER&lt;/span&gt;() results in user lookups happening in &lt;em&gt;O(log(n))&lt;/em&gt; time, which is very fast for even the largest&amp;nbsp;sites.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=aOqPgT9OB2c:YUWKuOxk2ic:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=aOqPgT9OB2c:YUWKuOxk2ic:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/03/01/what-makes-pressflow-scale-1-faster-core-queries#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal/pressflow">Pressflow</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/performance">Performance</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <pubDate>Sun, 01 Mar 2009 16:36:15 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">140 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Real results from the Materialized View API</title>
    <link>http://fourkitchens.com/blog/2009/02/23/real-results-materialized-views</link>
    <description>&lt;p&gt;I&amp;#8217;ve faced a lot of skepticism (rightfully so) over my Materialized View module, which I&amp;#8217;m pushing for inclusion in Drupal 7 as a solution to the overhead of table-per-field storage in Field &lt;span class="caps"&gt;API&lt;/span&gt;, as well as many other scalability&amp;nbsp;issues.&lt;/p&gt;
&lt;p&gt;I could have responded with contrived benchmarks, but I wanted real results. With Drupal 7 far from release and large projects on Drupal 7 even farther from release, I decided to rewrite &lt;span class="caps"&gt;MV&lt;/span&gt; for Drupal 6 and install it on Drupal.org to replace some of the worst&amp;nbsp;queries.&lt;/p&gt;
&lt;p&gt;I used &lt;span class="caps"&gt;MV&lt;/span&gt;-based tables to rewrite #1 and #4 of Drupal.org&amp;#8217;s slowest, most common queries. This required the creation (and indexing) of two materialized view tables. The rewritten queries went live on Saturday at around 19:00&amp;nbsp;&lt;span class="caps"&gt;UTC&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The drop in load is visible at 19:00 on Cacti graphs from Drupal.org&amp;#8217;s&amp;nbsp;&lt;span class="caps"&gt;DB2&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_locks.png" alt="" title=""  class="image image-_original " width="587" height="233" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_sorts.png" alt="" title=""  class="image image-_original " width="587" height="233" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Temporary disk tables, one of the worst causes of scalability issues, showed a small&amp;nbsp;drop:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_temp_obj.png" alt="" title=""  class="image image-_original " width="587" height="233" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The execution plans of &lt;span class="caps"&gt;SELECT&lt;/span&gt; queries also improved. &amp;#8220;Read next,&amp;#8221; an indicator of table-scan behavior, dropped significantly following the &lt;span class="caps"&gt;MV&lt;/span&gt;&amp;nbsp;switch-over:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_select.png" alt="" title=""  class="image image-_original " width="587" height="247" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And a commenter below requested the standard &amp;#8220;load average&amp;#8221; stats from the&amp;nbsp;server:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_load.png" alt="" title=""  class="image image-_original " width="600" height="275" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_cpu.png" alt="" title=""  class="image image-_original " width="600" height="289" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If anything, the results are pessimistic because &lt;span class="caps"&gt;MV&lt;/span&gt; indexed data (a one-time process) from 19:00 &lt;span class="caps"&gt;UTC&lt;/span&gt; through Sunday morning. You can see the effect of &lt;span class="caps"&gt;MV&lt;/span&gt; indexing on load by comparing Sat 12:00-19:00 and Sun 04:00 - 05:00, where &lt;span class="caps"&gt;MV&lt;/span&gt; was &lt;em&gt;not&lt;/em&gt; indexing, to surrounding times, where &lt;span class="caps"&gt;MV&lt;/span&gt; &lt;em&gt;was&lt;/em&gt;&amp;nbsp;indexing.&lt;/p&gt;
&lt;p&gt;This indexing load is visible on the &amp;#8220;Volatile Queries&amp;#8221;&amp;nbsp;graph:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_volatile.png" alt="" title=""  class="image image-_original " width="587" height="233" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weekday vs. Weekday (scale&amp;nbsp;change)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The most interesting graphs, in my opinion, are some Friday versus Monday&amp;nbsp;ones:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_mon_fri_cpu.png" alt="" title=""  class="image image-_original " width="600" height="289" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/mv_mon_fri_sorts.png" alt="" title=""  class="image image-_original " width="587" height="233" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=-xbEtOHB0Lw:clE4sMBSqEA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=-xbEtOHB0Lw:clE4sMBSqEA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/23/real-results-materialized-views#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/databases/materialized-views">Materialized Views</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/performance">Performance</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <pubDate>Mon, 23 Feb 2009 14:41:17 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">131 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Schema changes should be lazy</title>
    <link>http://fourkitchens.com/blog/2009/02/18/schema-changes-should-lazy</link>
    <description>&lt;p&gt;We&amp;#8217;re in the middle of upgrading Drupal.org, and many of the longest-running upgrades involve schema changes. Unfortunately, MySQL with InnoDB has a very unfriendly method of doing schema changes: it rebuilds the table and blocks all writes until the new table is ready. A more sensible approach would be schema versioning that allows different parts of a table to have different schema versions. This would minimize blocking, allowing schema changes to happen without downtime.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
David&amp;#8217;s rules for efficient schema&amp;nbsp;changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;#8217;t block:&lt;/strong&gt; Take no immediate action when the admin requests the schema change, except for recording the change that needs to&amp;nbsp;occur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be flexible:&lt;/strong&gt; Have a versioning model in place that allows different rows to have different on-disk formats. This versioning may not be per-row, but it should be sufficiently high-resolution that upgrading the smallest unit does not cause troublesome lock delays on a live&amp;nbsp;system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be lazy:&lt;/strong&gt; Upgrade the on-disk data format as rows are written. Transform row formats as they are&amp;nbsp;read.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hide the mess:&lt;/strong&gt; Despite having rows in various formats, the application should read from and write to the tables as if they are all in the latest format once the change occurs. Combined with the &amp;#8220;be lazy&amp;#8221; rule, this abstraction should be possible with minimal performance&amp;nbsp;impact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be thorough:&lt;/strong&gt; Actively upgrade on-disk data in the background during periods of low load. Tables should converge on having all rows in the latest&amp;nbsp;format.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stay correct and atomic:&lt;/strong&gt; Check that the conversion will be successful on a current table snapshot (you&amp;#8217;re using &lt;span class="caps"&gt;MVCC&lt;/span&gt;, right?) and any incoming writes that happen during the check. Before the atomic moment of schema change, &lt;em&gt;the change&lt;/em&gt; should fail if any rows won&amp;#8217;t convert, including the ones written during the check. After the atomic moment of schema change, &lt;em&gt;writes&lt;/em&gt; should fail if they don&amp;#8217;t match the new&amp;nbsp;schema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Play loose with indexes:&lt;/strong&gt; Indexes are optimizations. A database shouldn&amp;#8217;t block while adding, removing, or modifying indexes. There&amp;#8217;s no need to. Just make sure an index, if used, is complete. Even MyISAM follows this rule. (Granted, the external InnoDB plugin handles&amp;nbsp;this.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is there any free, open-source database that observes all of these rules? I know PostgreSQL has transactional &lt;span class="caps"&gt;DDL&lt;/span&gt;, which leads me to believe it implements something&amp;nbsp;similar.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m aware there may be objections to delaying the atomic schema changeover until after tables have been checked because it doesn&amp;#8217;t perfectly preserve transaction sequencing. But, there&amp;#8217;s no sensible alternative. If we assume the schema change will succeed and immediately reject illegal writes, we risk false rejection of the writes if the schema change later fails. That would violate isolation and atomicity for the schema change, a far greater &lt;span class="caps"&gt;ACID&lt;/span&gt; sin. (Give penance to the&amp;nbsp;Oracle?)&lt;/p&gt;
&lt;p&gt;While the delay for the schema change in my model may be considerable, administrators would have a choice of taking the application offline (as they do now) or making the application aware of the upcoming schema change (which cannot easily happen now). Such application awareness could involve as little as a check each request to see if the change occurred, choosing alternate code paths for before and after. The next application update removes the old code path. Properly handled, there would be no&amp;nbsp;downtime.&lt;/p&gt;
&lt;p&gt;This &amp;#8220;lazy schema change&amp;#8221; model isn&amp;#8217;t just applicable to relational behemoths. It maps well to document databases like &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; where records do not generally get cluster-wide updates, even as formats change. Document database systems can be aware of what changes need to occur when reading data in old formats, and they can update documents to the latest formats while reading and writing&amp;nbsp;them.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=0s05A6WHCRw:LGyatZJvDhE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=0s05A6WHCRw:LGyatZJvDhE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/18/schema-changes-should-lazy#comments</comments>
 <category domain="http://fourkitchens.com/tags/databases/couchdb">CouchDB</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/databases/mysql">MySQL</category>
 <category domain="http://fourkitchens.com/tags/performance">Performance</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <pubDate>Wed, 18 Feb 2009 18:44:23 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">126 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>David Strauss elected as a Permanent Member of the Drupal Association</title>
    <link>http://fourkitchens.com/blog/2009/02/18/david-strauss-elected-permanent-member-drupal-association</link>
    <description>&lt;p&gt;Congratulations to David Strauss, Four Kitchens co-founder and Drupal scalability guru, who was elected yesterday as a Permanent Member of the &lt;a href="http://association.drupal.org/"&gt;Drupal&amp;nbsp;Association&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;David&amp;#8217;s goals as a member focus largely on improvements to infrastructure, community-building, and reaching out to other open-source projects. Details can be found in his &lt;a href="http://buytaert.net/da-2009/node/85"&gt;his&amp;nbsp;application&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What are the primary goals you would like to work&amp;nbsp;on?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I would like to advance the infrastructure for development and sprints by working with the community to drive development and deployment of next-generation (read: not &lt;span class="caps"&gt;CVS&lt;/span&gt;) tools, both for issue tracking and version control. I would like to participate in discussions surrounding the membership software for Drupal Association membership, including CiviCRM (the current tool) and alternatives. I would like to work with major free culture and free software organizations to establish partnerships.&lt;br /&gt;
  &amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
  &lt;strong&gt;What strategy will you employ in order to accomplish said&amp;nbsp;goals?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I would like to host a series of official online meetings to discuss options for development infrastructure and prepare an Association-endorsed roadmap. For membership management, I would use my experience implementing and managing CiviCRM and other non-profit-focused tools to inform and guide the Association&amp;#8217;s decisions. For partnership building, I would draw on my relationships with other projects and developers to start productive discussions about shared goals and their projects&amp;#8217; stake in Drupal&amp;#8217;s&amp;nbsp;success.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://buytaert.net/da-2009/node/85"&gt;Read more&amp;nbsp;&amp;raquo;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Congratulations are also in order for the other elected Permanent Members and the new Board Members, &lt;a href="http://association.drupal.org/node/298"&gt;all of whom&lt;/a&gt; are donating huge amounts of time towards promoting and supporting the &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt;&amp;nbsp;project.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=lqm49m7HRwo:D4YDAp1KTCw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=lqm49m7HRwo:D4YDAp1KTCw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/18/david-strauss-elected-permanent-member-drupal-association#comments</comments>
 <category domain="http://fourkitchens.com/tags/drupal/drupal-association">Drupal Association</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/community">Community</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Wed, 18 Feb 2009 14:40:31 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">125 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Developer preview of Materialized Views</title>
    <link>http://fourkitchens.com/blog/2009/02/17/developer-preview-materialized-views</link>
    <description>&lt;p&gt;I&amp;#8217;ve posted a developer preview of Materialized Views for Drupal 6. I&amp;#8217;d like ambitious Drupal developers to try it out so I can get feedback on the developer&amp;nbsp;experience.&lt;/p&gt;
&lt;p&gt;From &lt;code&gt;sites/all/modules&lt;/code&gt;:&lt;br /&gt;
&lt;code&gt;bzr branch bzr://vcs.fourkitchens.com/drupal/modules/materialized_view/6 materialized_view&lt;/code&gt; (all on one&amp;nbsp;line)&lt;/p&gt;
&lt;p&gt;To get them&amp;nbsp;running:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install all three &lt;span class="caps"&gt;MV&lt;/span&gt;-related&amp;nbsp;modules.&lt;/li&gt;
&lt;li&gt;Run&amp;nbsp;cron.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This will create the mv_forum_topic materialized view, which is populated and indexed for fast Forum module topic&amp;nbsp;listings.&lt;/p&gt;
&lt;p&gt;Specific developer experience areas I&amp;#8217;d like feedback&amp;nbsp;on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creating new materialized&amp;nbsp;views.&lt;/li&gt;
&lt;li&gt;Creating new data&amp;nbsp;sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you create or modify MVs, run cron to generate the tables and index the&amp;nbsp;data.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=qRTYlC3ls6Q:7IxPVDt-YhM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=qRTYlC3ls6Q:7IxPVDt-YhM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/17/developer-preview-materialized-views#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/databases/materialized-views">Materialized Views</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/performance">Performance</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <pubDate>Mon, 16 Feb 2009 20:16:32 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">124 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>No-brainer shared branch storage on your workstation</title>
    <link>http://fourkitchens.com/blog/2009/02/09/no-brainer-shared-branch-storage-your-workstation</link>
    <description>&lt;p&gt;&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
&lt;small&gt;This post is a follow-up to &lt;a href="/node/120"&gt;my post about the new Drupal &lt;span class="caps"&gt;HEAD&lt;/span&gt; Bazaar branch&lt;/a&gt; hosted at Four Kitchens. This post is written specifically for users of Unix-like systems. You can do the same thing on Windows, but you&amp;#8217;ll have to adapt the directions a&amp;nbsp;bit.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;For me, my projects are code-based and, hence, mostly a collection of version-controlled branches. So, my &amp;#8220;Projects&amp;#8221; directory (located at &lt;code&gt;~/Projects&lt;/code&gt;) contains a smattering of branches organized into multi-level directory&amp;nbsp;structures.&lt;/p&gt;
&lt;p&gt;In &lt;a href="/node/120"&gt;my last post&lt;/a&gt;, I noted that shared branch storage is the key to fast branching, good offline access, and efficient disk usage. I even covered a quick way to get it rolling for Drupal branches. But it&amp;#8217;s one thing to know how and another to know &amp;#8220;best practices,&amp;#8221; so I&amp;#8217;ll share how I do&amp;nbsp;things.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re like me, you want minimal hassle and maximum flexibility for organizing &lt;em&gt;all&lt;/em&gt; of your branches. Fortunately, Bazaar doesn&amp;#8217;t just look at the next directory up to find a viable shared branch storage&amp;nbsp;database.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s what happens when you create a&amp;nbsp;branch:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bazaar checks if the new branch is created using the &lt;code&gt;--standalone&lt;/code&gt; option. If so, it doesn&amp;#8217;t even worry about the possibility of shared storage, and it stores the branch right there. (I&amp;#8217;ve included this option for completeness, and you should only worry about it if you need branch permission control, which is typically not an issue on a&amp;nbsp;workstation.)&lt;/li&gt;
&lt;li&gt;Bazaar traverses up the directory tree looking for a viable shared storage location. If one is available, it stores the data there, taking advantage of shared revision history between&amp;nbsp;branches.&lt;/li&gt;
&lt;li&gt;If all else fails (and this is the default case), Bazaar stores the data right there with the&amp;nbsp;branch.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Based on rule two, all you need is shared storage &lt;em&gt;somewhere in a writable parent directory&lt;/em&gt;. I like to put my branches in &lt;code&gt;~/Projects&lt;/code&gt;, so I create shared storage in &lt;code&gt;~/Projects&lt;/code&gt; by running &lt;code&gt;bzr init-repository ~/Projects&lt;/code&gt;. Then, I&amp;#8217;m set for any branches created in or below&amp;nbsp;&lt;code&gt;~/Projects&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you don&amp;#8217;t like to centralize your branches one place, you can run &lt;code&gt;bzr init-repository ~&lt;/code&gt; and have shared storage for &lt;em&gt;any branch, anywhere in your home directory&lt;/em&gt;. For those used to Subversion and &lt;span class="caps"&gt;CVS&lt;/span&gt; spewing directories everywhere, I&amp;#8217;ll explicitly note that this only creates one directory at the specified shared-storage&amp;nbsp;location.&lt;/p&gt;
&lt;p&gt;Once you&amp;#8217;ve set up shared storage, you don&amp;#8217;t have to think about using it; Bazaar will manage it automatically and transparently. If you&amp;#8217;re curious whether it&amp;#8217;s working, you can run &lt;code&gt;bzr info&lt;/code&gt; from within any branch and look for &amp;#8220;shared repository&amp;#8221; in the&amp;nbsp;output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you want to move your branch&lt;/strong&gt;&lt;br /&gt;
If your branch uses shared storage, it references revisions in the shared storage repository. You can&amp;#8217;t move it to another computer using normal filesystem commands and still have it work. If you&amp;#8217;d like to make the branch completely independent of its shared storage so you can move it anywhere, run &lt;code&gt;bzr reconfigure --standalone&lt;/code&gt; from a directory within the branch. It will copy its revisions to local&amp;nbsp;storage.&lt;/p&gt;
&lt;p&gt;A better option for moving branches is to use Bazaar&amp;#8217;s own &lt;code&gt;bzr branch&lt;/code&gt; command to clone the branch and then delete the original. Then, you don&amp;#8217;t have to worry about the possibility of shared&amp;nbsp;storage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Theory note:&lt;/strong&gt; This is Bazaar&amp;#8217;s version of &amp;#8220;cheap branching.&amp;#8221; Creating additional branches with shared storage only takes the additional disk space required to create the branch&amp;#8217;s new working tree (and even that additional space is only necessary if you choose to create a working tree for the new&amp;nbsp;branch).&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=J9bSccJOLh4:Oafb0XFss-o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=J9bSccJOLh4:Oafb0XFss-o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/09/no-brainer-shared-branch-storage-your-workstation#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/tags/software/bsd">BSD</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/software/linux">Linux</category>
 <category domain="http://fourkitchens.com/tags/software/os-x">OS X</category>
 <category domain="http://fourkitchens.com/tags/performance">Performance</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <pubDate>Mon, 09 Feb 2009 03:08:57 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">121 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>A Bazaar branch of Drupal HEAD with all history</title>
    <link>http://fourkitchens.com/blog/2009/02/09/bazaar-branch-drupal-head-all-history</link>
    <description>&lt;p&gt;I originally created &lt;a href="/node/93"&gt;a Bazaar branch of Drupal &lt;span class="caps"&gt;HEAD&lt;/span&gt; with hourly snapshots of upstream updates&lt;/a&gt; (commits to &lt;span class="caps"&gt;CVS&lt;/span&gt; &lt;span class="caps"&gt;HEAD&lt;/span&gt;) to streamline work on patches to Drupal&amp;nbsp;&lt;span class="caps"&gt;HEAD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;This snapshot method had a few advantages over using Launchpad&amp;#8217;s Drupal&amp;nbsp;branch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because of the shallow history, branching from the Four Kitchens server was relatively fast compared to branching from&amp;nbsp;Launchpad.&lt;/li&gt;
&lt;li&gt;The Four Kitchens server has more reserve bandwidth and capacity, making initial branching and updates&amp;nbsp;faster.&lt;/li&gt;
&lt;li&gt;Launchpad goes down more often than the Four Kitchens&amp;nbsp;server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The snapshot-based branch also had a big disadvantage: it didn&amp;#8217;t keep a true commit-by-commit history that mapped to &lt;span class="caps"&gt;CVS&lt;/span&gt; &lt;span class="caps"&gt;HEAD&lt;/span&gt; commits, making it hard to understand ongoing changes. After some discussions with chx, I&amp;#8217;ve decided to combine the best of both worlds: a mirror of Launchpad&amp;#8217;s Drupal &lt;span class="caps"&gt;HEAD&lt;/span&gt; branch on the Four Kitchens server with instructions (provided below) to avoid the trouble of pulling thousands of revisions every time you branch.&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
Why not branch directly from Launchpad? Aside from occasional Launchpad reliability issues, downloading all Drupal revisions takes takes 2m37s from Launchpad versus 1m15s from Four Kitchens (both tested from my home&amp;nbsp;connection).&lt;/p&gt;
&lt;p&gt;I will also continue to maintain the old snapshot-based branch until Drupal 7 is&amp;nbsp;released.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Method 0: Plain, old&amp;nbsp;branching&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pros&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Runs with older Bazaar&amp;nbsp;versions&lt;/li&gt;
&lt;li&gt;Performs all post-branch operations locally with no network&amp;nbsp;access&lt;/li&gt;
&lt;li&gt;Easy to set&amp;nbsp;up&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Downloads all upstream revisions each time you branch (takes&amp;nbsp;1m25s)&lt;/li&gt;
&lt;li&gt;Stores all upstream revisions each time you branch (takes 51M each&amp;nbsp;branch)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;Run this: &lt;code&gt;bzr branch&amp;nbsp;bzr://vcs.fourkitchens.com/drupal/7-all-history&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Method 1: Stacked&amp;nbsp;branches&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pros&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Fast initial branching: only downloads basic branch data (takes&amp;nbsp;42s)&lt;/li&gt;
&lt;li&gt;Most space efficient: only stores basic branch data (takes 6.6M&amp;nbsp;total)&lt;/li&gt;
&lt;li&gt;Easy to set&amp;nbsp;up&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Requires Bazaar 1.6 or&amp;nbsp;later&lt;/li&gt;
&lt;li&gt;Requires internet access to perform most history-based&amp;nbsp;operations&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;Run this: &lt;code&gt;bzr branch --stacked&amp;nbsp;bzr://vcs.fourkitchens.com/drupal/7-all-history&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Method 2: Shared branch&amp;nbsp;storage&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pros&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Runs with older Bazaar&amp;nbsp;versions&lt;/li&gt;
&lt;li&gt;Downloads upstream revisions once for all&amp;nbsp;branches&lt;/li&gt;
&lt;li&gt;Stores upstream revisions once for all branches (takes 51M&amp;nbsp;once)&lt;/li&gt;
&lt;li&gt;Performs all post-branch operations locally with no network&amp;nbsp;access&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Still stores upstream revisions&amp;nbsp;once&lt;/li&gt;
&lt;li&gt;Still downloads all upstream revisions&amp;nbsp;once&lt;/li&gt;
&lt;li&gt;You have to run a few more commands to create your first local&amp;nbsp;branch&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;From a new directory that will be a &lt;em&gt;parent&lt;/em&gt; of your future branch directories, run this:&lt;br /&gt;&lt;code&gt;bzr init-repository&amp;nbsp;.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;From within the parent directory you just created, run this to create your local branch:&lt;br /&gt;&lt;code&gt;bzr branch&amp;nbsp;bzr://vcs.fourkitchens.com/drupal/7-all-history&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using your&amp;nbsp;branch&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Presumably, you&amp;#8217;ve gone through all this to work on patches for Drupal &lt;span class="caps"&gt;HEAD&lt;/span&gt;. I&amp;#8217;ve updated &lt;a href="/node/93"&gt;my earlier instructions&lt;/a&gt; for how to use your new&amp;nbsp;branch.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=5g5TL899nQo:3hXgmQvDBFs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=5g5TL899nQo:3hXgmQvDBFs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/09/bazaar-branch-drupal-head-all-history#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Sun, 08 Feb 2009 22:12:42 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">120 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Case study preview: Four Kitchens' new business cards</title>
    <link>http://fourkitchens.com/blog/2009/02/05/four-kitchens-new-business-cards</link>
    <description>&lt;p&gt;&lt;strong&gt;Assignment:&lt;/strong&gt; New business cards for our&amp;nbsp;staff.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goals:&lt;/strong&gt; A clean, professional, and friendly design with room to write on. (People like to make notes on business cards &amp;#8212; namely, when and where they met that&amp;nbsp;person.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Process:&lt;/strong&gt; After several iterations &amp;#8212; I&amp;#8217;ll post &amp;#8216;em in the full case study later on &amp;#8212; we arrived at a minimalist, two-color design. What&amp;#8217;s most striking, perhaps, is the front side doesn&amp;#8217;t actually say &amp;#8220;Four Kitchens.&amp;#8221; Instead, we opted to show only the logo and slogan to create a sense of mystery: &amp;#8220;What&amp;#8217;s this all about? Who makes big websites? Who are these people?&amp;#8221; Simply flipping over the card reveals the&amp;nbsp;answer.&lt;/p&gt;
&lt;p&gt;To create a friendly, informal tone and demonstrate our sense of humor, we have the logo &amp;#8220;speaking&amp;#8221; our slogan, as if to say: &amp;#8220;Hi! Nice to meet you. I like you. Let&amp;#8217;s hang out!&amp;#8221; Just like I do in real&amp;nbsp;life.&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/FK-card-blog-post-front.jpg" alt="Front" title="Front"  class="image image-_original " width="570" height="334" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Front&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The back of the card displays three important chunks of information, the placement and design of which each tell a story about our&amp;nbsp;company.&lt;/p&gt;
&lt;p&gt;First, the employee&amp;#8217;s name and contact information is placed above the company&amp;#8217;s. Each of our web chefs posses unique and invaluable skills. Everyone here contributes to the direction of each project, both internal and&amp;nbsp;client-driven.&lt;/p&gt;
&lt;p&gt;Second, each card includes &lt;span class="caps"&gt;GPL&lt;/span&gt; and Creative Commons watermarks. Open-source development and collaborative culture are central to our business model. We do not work with closed-source software, and we contractually obligate our clients to license our work under the &lt;span class="caps"&gt;GPL&lt;/span&gt; and similar&amp;nbsp;licenses.&lt;/p&gt;
&lt;p&gt;Third, each card reflects the web chef&amp;#8217;s personality. When designing the cards, we asked each chef to choose four areas of professional and personal interest and created a set of icons that symbolized&amp;nbsp;each.&lt;/p&gt;
&lt;p&gt;Robbie, for example, is really into tuning his car. (He&amp;#8217;s installed a supercharger, added &lt;span class="caps"&gt;USB&lt;/span&gt; hookups to tune the onboard computer, and has all kinds of extra gauges to monitor&amp;#8230; whatever.) So we made him an engine icon. I, however, have a much more reasonable and interesting hobby: reading and writing. So I made myself a&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Pilcrow"&gt;pilcrow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aaron likes rock climbing. Shannon Lucas likes &lt;span class="caps"&gt;SCIENCE&lt;/span&gt;! You get the&amp;nbsp;idea.&lt;/p&gt;
&lt;p&gt;By placing these icons in talk bubbles to the right of each web chef&amp;#8217;s name, the cards seem to say: &amp;#8220;This is what I&amp;#8217;m good at, and this is what motivates me.&amp;#8221; These cards communicate so much more than simple phone numbers and email addresses. (How&amp;nbsp;boring!)&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the entire&amp;nbsp;set:&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/FK-card-blog-post-todd.jpg" alt="Back / Todd Ross Nienkerk" title="Back / Todd Ross Nienkerk"  class="image image-_original " width="570" height="334" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Back / Todd Ross&amp;nbsp;Nienkerk&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/FK-card-blog-post-aaron.jpg" alt="Back / Aaron Stanush" title="Back / Aaron Stanush"  class="image image-_original " width="570" height="334" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Back / Aaron&amp;nbsp;Stanush&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/FK-card-blog-post-david.jpg" alt="Back / David Timothy Strauss" title="Back / David Timothy Strauss"  class="image image-_original " width="570" height="334" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Back / David Timothy&amp;nbsp;Strauss&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/FK-card-blog-post-shannon-h.jpg" alt="Back / Shannon Hinshaw" title="Back / Shannon Hinshaw"  class="image image-_original " width="570" height="334" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Back / Shannon&amp;nbsp;Hinshaw&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/FK-card-blog-post-shannon-l.jpg" alt="Back / Shannon Lucas" title="Back / Shannon Lucas"  class="image image-_original " width="570" height="334" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Back / Shannon&amp;nbsp;Lucas&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/FK-card-blog-post-robbie.jpg" alt="Back / Robbie Sternenberg" title="Back / Robbie Sternenberg"  class="image image-_original " width="570" height="334" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Back / Robbie&amp;nbsp;Sternenberg&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=OB7yEtGDZf8:jqNNCn0ch3U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=OB7yEtGDZf8:jqNNCn0ch3U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/05/four-kitchens-new-business-cards#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/case-studies">Case Studies</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <pubDate>Thu, 05 Feb 2009 18:23:47 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">119 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Enforcing branch commit atomicity (or, why the git staging area is bad)</title>
    <link>http://fourkitchens.com/blog/2009/02/03/importance-atomicity-or-why-git-staging-area-bad</link>
    <description>&lt;p&gt;With &lt;a href="" rel="nofollow"&gt;&lt;span class="caps"&gt;CVS&lt;/span&gt;&lt;/a&gt;, one of the only repository-wide &lt;a href="http://en.wikipedia.org/wiki/Atomic_operation" rel="nofollow"&gt;atomic operations&lt;/a&gt; is tagging a local checkout. And not all that long ago, &lt;a href="" rel="nofollow"&gt;Subversion&lt;/a&gt; introduced mainstream users of free, open-source version control systems to full-scale atomicity. Or, at least the &lt;em&gt;ability&lt;/em&gt; to be&amp;nbsp;atomic.&lt;/p&gt;
&lt;p&gt;Subversion&amp;#8217;s approach to atomicity is rooted in its centralization and hybrid branch/directory model. Because Subversion makes it hard to merge from other repositories, there&amp;#8217;s a strong incentive to combine many projects and branches into one repository. Subversion therefore offers directory-level checkouts as well as convenient, repository-wide checkouts for developers working on multiple projects. To fit this project and branching model, Subversion performs most operations at the level of the current directory and below. (The only alternative would be performing the operations checkout-wide, which would cause behavior confusingly dependent on the choice of checkout&amp;nbsp;root.)&lt;/p&gt;
&lt;p&gt;Subversion&amp;#8217;s model operates atomically &lt;em&gt;if users run the commands from the root of a project or branch&lt;/em&gt;, but the this-directory-and-below model encourages bad development behavior. For example, when working on a &lt;a href="http://drupal.org/" rel="nofollow"&gt;Drupal&lt;/a&gt; project, it&amp;#8217;s easy to commit just the changes for one module or theme, which creates a revision in the repository &lt;em&gt;that may never have existed as a working copy and may not work&lt;/em&gt;. Administrators can mitigate the problem with repository-side &lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration" rel="nofollow"&gt;continuous integration&lt;/a&gt; (&lt;span class="caps"&gt;CI&lt;/span&gt;), but even &lt;span class="caps"&gt;CI&lt;/span&gt; still doesn&amp;#8217;t guarantee true project coherence and&amp;nbsp;atomicity.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bazaar-vcs.org/" rel="nofollow"&gt;Bazaar&lt;/a&gt;, on the other hand, performs its operations (at least by default) on the entire branch, encouraging real atomic commits. This default, branch-level behavior tends to annoy developers used to separating a project&amp;#8217;s changes into different directories of a Subversion checkout and checking in by directory. This Subversion-based workflow works reasonably well in practice, and for systems like Bazaar and git to enforce high levels of atomicity and remain usable, they must provide convenient tools to separate the changes intended for each&amp;nbsp;commit.&lt;/p&gt;
&lt;p&gt;Bazaar and &lt;a href="http://git-scm.com/" rel="nofollow"&gt;git&lt;/a&gt; have different approaches providing such tools. Bazaar has &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#shelve" rel="nofollow"&gt;shelve&lt;/a&gt; and &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#unshelve" rel="nofollow"&gt;unshelve&lt;/a&gt;. git has the &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html" rel="nofollow"&gt;staging&amp;nbsp;area&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The most obvious way they differ is in workflow. Bazaar&amp;#8217;s commands are optional and &lt;em&gt;remove&lt;/em&gt; changes from the upcoming commit. git&amp;#8217;s commands are mandatory and &lt;em&gt;add&lt;/em&gt; changes to the upcoming commit. Here, git&amp;#8217;s choice seems very sensible. Encouraging manual approval of each change in each commit reduces mistakes. On the other hand, Bazaar provides a convenient &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#uncommit" rel="nofollow"&gt;uncommit&lt;/a&gt; command that allows reversal of erroneous commits (which are often only obvious when seeing the file list as the commit is happening). All considered, I slightly prefer git&amp;#8217;s workflow&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;Where git fails is in the theoretical foundations of the staging area. The staging area encourages the same bad behavior as in Subversion, just with more surgical control of what gets committed.  Committing in git with only some changes added to the staging area still results in an &amp;#8220;atomic&amp;#8221; revision &lt;em&gt;that may never have existed as a working copy and may not&amp;nbsp;work&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Along these lines, one of the most atomicity-busting aspects of git&amp;#8217;s staging area is that it doesn&amp;#8217;t just mark code that needs to go into the next commit; it actually saves the hunk into the staging index. So, a developer could add code to the staging area, modify her working copy, and end up with a commit containing code that&amp;#8217;s neither in her working copy nor in her stash. The code only ends up in the commit just made, silently filed away for someone else to get in their next&amp;nbsp;merge:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;This command [add] can be performed multiple times before a commit. It only adds the content of the specified file(s) at the time the add command is run; if you want subsequent changes included in the next commit, then you must run git add again to add the new content to the&amp;nbsp;index.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In contrast, shelving a change in Bazaar &lt;em&gt;reverts the change in the working copy&lt;/em&gt;. (It does save the change for later restoration with unshelve.) Because shelved changes are not in the working copy, Bazaar encourages the ultimate in atomicity: what a developer commits represents an atomic snapshot of the entire branch as represented by her working copy. And if tests pass when she commits, the same tests will pass if another developer pulls the same revision of the same&amp;nbsp;branch.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=o6XRPOeyAfQ:1iMA5qcqsP8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=o6XRPOeyAfQ:1iMA5qcqsP8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/02/03/importance-atomicity-or-why-git-staging-area-bad#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/version-control/cvs">CVS</category>
 <category domain="http://fourkitchens.com/tags/version-control/git">git</category>
 <category domain="http://fourkitchens.com/tags/version-control/subversion">Subversion</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Mon, 02 Feb 2009 23:26:35 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">109 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>DrupalCon DC swag is here!</title>
    <link>http://fourkitchens.com/blog/2009/01/29/drupalcon-dc-swag-here</link>
    <description>&lt;p&gt;Here&amp;#8217;s a taste of what you&amp;#8217;ll be getting at &lt;a href="http://dc2009.drupalcon.org/"&gt;DrupalCon&amp;nbsp;&lt;span class="caps"&gt;DC&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/drupalcon2009_swag_01_small.jpg" alt="DrupalCon DC swag" title="DrupalCon DC swag"  class="image image-_original " width="600" height="452" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;DrupalCon &lt;span class="caps"&gt;DC&lt;/span&gt;&amp;nbsp;swag&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The stickers and button were designed by &lt;a href="http://fourkitchens.com/" rel="nofollow"&gt;Four Kitchens&lt;/a&gt;. &lt;a href="http://www.developmentseed.org/"&gt;Development Seed&lt;/a&gt; &lt;em&gt;very graciously&lt;/em&gt; printed and paid for the buttons. Thanks, Development Seed!&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
The sticker in the lower left is based on a &lt;a href="http://dc2009.drupalcon.org/t-shirt/retro-fitted-part-two-refitted"&gt;DrupalCon T-shirt design&lt;/a&gt; we submitted. (If you like it, vote for it! And our &lt;a href="/blog/2008/12/04/snazzy-our-drupalcon-dc-t-shirt-submissions"&gt;other designs&lt;/a&gt;,&amp;nbsp;too&amp;#8230;)&lt;/p&gt;
&lt;p&gt;The button is a more polished version of a &lt;a href="/blog/2008/12/05/drupalers-drupal-drupalcon-campaign-buttons"&gt;DrupalCon &amp;#8220;campaign button&amp;#8221; design&lt;/a&gt; we released last month under the&amp;nbsp;&lt;a href="http://www.gnu.org/copyleft/gpl.html"&gt;&lt;abbr title="GNU General Public License version 3"&gt;GPLv3&lt;/abbr&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/drupalcon2009_swag_02_small.jpg" alt="Todd&amp;#039;s bag o&amp;#039; buttons" title="Todd&amp;#039;s bag o&amp;#039; buttons"  class="image image-_original " width="600" height="400" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Todd&amp;#8217;s bag o&amp;#8217;&amp;nbsp;buttons&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s my bag wearing a series of hip buttons and a very classy Oktoberfest scarf. It&amp;#8217;s probably the best scarf you will ever see &amp;mdash; and you&amp;#8217;ll see it at DrupalCon&amp;nbsp;&lt;span class="caps"&gt;DC&lt;/span&gt;!&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=rzvP4A7vMuQ:UDKlfZj-1jw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=rzvP4A7vMuQ:UDKlfZj-1jw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/01/29/drupalcon-dc-swag-here#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Thu, 29 Jan 2009 17:39:03 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">107 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Bazaar 1.11 and BzrTools 1.11.0 RPMs for Red Hat Enterprise Linux 5 and CentOS 5</title>
    <link>http://fourkitchens.com/blog/2009/01/21/bazaar-111-bzrtools-1110-rpms-red-hat-enterprise-linux-5-centos-5</link>
    <description>&lt;p&gt;&lt;strong style="color:red"&gt;These RPMs are now obsolete. Please check this blog for the latest&amp;nbsp;ones.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://fedoraproject.org/wiki/EPEL"&gt;&lt;span class="caps"&gt;EPEL&lt;/span&gt;&lt;/a&gt; RPMs for Bazaar and BzrTools are quite out of date, so I rolled some &lt;em&gt;experimental&lt;/em&gt; packages based on the Fedora 10 spec&amp;nbsp;files.&lt;/p&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.11-1.i386.rpm"&gt;Bazaar i386&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.11-1.x86_64.rpm"&gt;Bazaar x86_64&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzr-1.11-1.src.rpm"&gt;Bazaar &lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzr.spec"&gt;Bazaar Spec&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.11.0-1.i386.rpm"&gt;BzrTools i386&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.11.0-1.x86_64.rpm"&gt;BzrTools x86_64 &lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools-1.11.0-1.src.rpm"&gt;BzrTools &lt;span class="caps"&gt;SRPM&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://straussd.fourkitchens.com/bzrtools.spec"&gt;BzrTools Spec&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h4&gt;One more&amp;nbsp;requirement&lt;/h4&gt;

&lt;p&gt;If you don&amp;#8217;t have &lt;span class="caps"&gt;EPEL&lt;/span&gt; installed as a repository, you may have to manually download and install the python-pycurl (&lt;a href="http://download.fedora.redhat.com/pub/epel/5/i386/repoview/python-pycurl.html"&gt;i386&lt;/a&gt; or &lt;a href="http://download.fedora.redhat.com/pub/epel/5/x86_64/repoview/python-pycurl.html"&gt;x86_64&lt;/a&gt;)&amp;nbsp;package.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=021bc3KHLS8:O4eF2B1ebP0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=021bc3KHLS8:O4eF2B1ebP0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/01/21/bazaar-111-bzrtools-1110-rpms-red-hat-enterprise-linux-5-centos-5#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/tags/software/linux/centos">CentOS</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/software/linux/rhel">RHEL</category>
 <pubDate>Tue, 20 Jan 2009 20:04:09 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">103 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Creating common branch ancestry is a hard problem</title>
    <link>http://fourkitchens.com/blog/2009/01/19/creating-common-branch-ancestry-hard-problem</link>
    <description>&lt;p&gt;One of the key features of &lt;a href="http://en.wikipedia.org/wiki/Distributed_revision_control" rel="nofollow"&gt;distributed version control systems&lt;/a&gt; (&lt;span class="caps"&gt;DVCS&lt;/span&gt;) is support for divergent development (branching) and then merging. Most &lt;span class="caps"&gt;DVCS&lt;/span&gt; tools, including &lt;a href="http://git-scm.com/" rel="nofollow"&gt;git&lt;/a&gt; and &lt;a href="http://bazaar-vcs.org/" rel="nofollow"&gt;Bazaar&lt;/a&gt;, include rather elegant support for such workflows by embedding metadata about common ancestry into branches. In this post, I&amp;#8217;ll be focusing on&amp;nbsp;Bazaar.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Common ancestry&amp;#8221; means an identical revision shared by two branches. The most recent common ancestor typically indicates the point of branching, unless there has been a more recent merge. A successful merge between two branches establishes a new, more recent common ancestor. Identifying a common ancestor is a required step for performing automatic &lt;a href="http://en.wikipedia.org/wiki/Merge_(revision_control)#Three-way_merge" rel="nofollow"&gt;three-way merges&lt;/a&gt; to integrate changes from a foreign, divergent&amp;nbsp;branch.&lt;/p&gt;
&lt;p&gt;Typically, the branching metadata allows Bazaar to automatically determine the most recent common ancestor to use as the base revision for three-way merging. The problem comes when you need to merge two branches that do not share any common ancestors. (For the purpose of this post, I am not counting revision zero, the universal common ancestor, as a common ancestor. It is generally useless for&amp;nbsp;merging.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creating common ancestry&lt;/strong&gt;&lt;br /&gt;
If you try to &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#merge" rel="nofollow"&gt;merge&lt;/a&gt; two branches without common ancestry and without any &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#revision-identifiers" rel="nofollow"&gt;revision identifiers&lt;/a&gt;, Bazaar will complain and do nothing. You can specify a revision range (like -r5..-1, which would be everything from the fifth revision to the latest on the foreign branch) and then apply the merge. Bazaar will then merge the changes in the specified revision range into your local branch and establish the last merged revision as the latest common ancestor, making future merges a breeze. Unfortunately, finishing this initial merge is &lt;a href="http://en.wikipedia.org/wiki/Here_be_dragons" rel="nofollow"&gt;where dragons lie&lt;/a&gt;. But before I can get into the difficulty of creating common ancestry by merging two unrelated branches, I have to briefly discuss how Bazaar handles&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How Bazaar tracks files&lt;/strong&gt;&lt;br /&gt;
Bazaar maps file paths to globally unique file IDs, and two branches without prior common ancestry will have different file IDs for the same paths, even if the files are really the same. Every time a file is added to a Bazaar branch, it gets a unique &lt;span class="caps"&gt;ID&lt;/span&gt;. As files are &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#mv" rel="nofollow"&gt;moved and renamed&lt;/a&gt;, they keep their unique IDs. So, if two people download Drupal, extract it, and independently &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#init" rel="nofollow"&gt;&amp;#8220;bzr init&amp;#8221;&lt;/a&gt;, &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#add" rel="nofollow"&gt;&amp;#8220;bzr add&amp;#8221;&lt;/a&gt;, and &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#commit" rel="nofollow"&gt;&amp;#8220;bzr commit&amp;#8221;&lt;/a&gt;, their respective &lt;span class="caps"&gt;README&lt;/span&gt;.txt files (for example) will have different file&amp;nbsp;IDs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creating common ancestry (continued)&lt;/strong&gt;&lt;br /&gt;
These globally unique file IDs cause trouble when merging from unrelated branches. When Bazaar merges two branches (related or not), two files with the same path but different file IDs create a &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#conflicts-types" rel="nofollow"&gt;conflict&lt;/a&gt; even if they contain identical content. Merging two unrelated branches with lots of shared files creates a mess of conflict files and conflict directories, and there is currently no convenient way to &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#resolve" rel="nofollow"&gt;resolve&lt;/a&gt; these&amp;nbsp;conflicts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A concrete example with Drupal&lt;/strong&gt;&lt;br /&gt;
A developer downloads Drupal and puts the project under version control in a fresh Bazaar branch. She discovers that Four Kitchens maintains a Bazaar branch of stable Drupal releases and decides she would like to use the Four Kitchens branch to automate installation of minor Drupal updates. She attempts to merge in the revision range from the Four Kitchens branch that would perform the upgrade. Because the file IDs in the Four Kitchens branch differ from hers, every Drupal core file and directory has a conflict despite having identical content for the base merge revision. After a bit of tedious conflict cleanup, she commits the merge and goes back to enjoying Bazaar&amp;#8217;s &lt;em&gt;generally&lt;/em&gt; elegant&amp;nbsp;architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I thought this blog post was going to give me a solution!&lt;/strong&gt;&lt;br /&gt;
Nope, there&amp;#8217;s &lt;a href="https://bugs.launchpad.net/bzr/+bug/318620" rel="nofollow"&gt;not one out there yet&lt;/a&gt;. I&amp;#8217;m currently looking at writing a custom merge handler (subclassed from the standard merge3 in Bazaar) that would intelligently handle merges where file paths do represent the same files, regardless of file IDs. Unfortunately, the file &lt;span class="caps"&gt;ID&lt;/span&gt;/path conflict is low-level in Bazaar and occurs before reaching the most modular part of merge conflict&amp;nbsp;resolution.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://launchpad.net/~lifeless" rel="nofollow"&gt;Robert Collins&lt;/a&gt; on the Bazaar project for walking me through the Bazaar internals necessary for me to explain this issue and, hopefully, solve&amp;nbsp;it.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=U5r3wDsJfpc:pJx3IIiLgmA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=U5r3wDsJfpc:pJx3IIiLgmA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/01/19/creating-common-branch-ancestry-hard-problem#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Mon, 19 Jan 2009 01:08:06 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">102 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Quick Drupal version control with Bazaar</title>
    <link>http://fourkitchens.com/blog/2009/01/17/quick-dirty-version-control</link>
    <description>&lt;p&gt;We all have the Drupal projects we work on that ought to be under some sort of version control system but aren&amp;#8217;t. There are many reasons why this might be the case: the small size of the project, the lack of central version-control infrastructure, or the annoyance of &amp;#8220;.svn&amp;#8221; or &amp;#8220;&lt;span class="caps"&gt;CVS&lt;/span&gt;&amp;#8221; directories littering your working&amp;nbsp;copy.&lt;/p&gt;
&lt;p&gt;With &lt;a href="http://vcs.fourkitchens.com/" rel="nofollow"&gt;Bazaar&lt;/a&gt;, none of these excuses should prevent a project from having solid version&amp;nbsp;control.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s why Bazaar avoids those&amp;nbsp;problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It requires minimal effort to bring code under&amp;nbsp;control.&lt;/li&gt;
&lt;li&gt;Bazaar does not require (but still supports) centralized&amp;nbsp;infrastructure.&lt;/li&gt;
&lt;li&gt;A single .bzr directory at the root of the project contains everything Bazaar needs, minimizing&amp;nbsp;disruption.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bringing a Drupal project into&amp;nbsp;Bazaar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Note: If you want to automate your Drupal updates, you may want to &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#branch" rel="nofollow"&gt;branch&lt;/a&gt; from &lt;a href="http://vcs.fourkitchens.com/drupal/" rel="nofollow"&gt;the Four Kitchens repository&lt;/a&gt; instead of initializing your own branch. Branching from the Four Kitchens repository is more time consuming, but it&amp;#8217;s worthwhile for large&amp;nbsp;projects.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://bazaar-vcs.org/Download" rel="nofollow"&gt;Install&amp;nbsp;Bazaar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Go to the root directory of your&amp;nbsp;project.&lt;/li&gt;
&lt;li&gt;bzr&amp;nbsp;init&lt;/li&gt;
&lt;li&gt;bzr ignore ./files # Drupal 5&amp;nbsp;only&lt;/li&gt;
&lt;li&gt;bzr ignore ./sites/default/files/ # Drupal 6&amp;nbsp;only&lt;/li&gt;
&lt;li&gt;bzr ignore&amp;nbsp;./sites/default/settings.php&lt;/li&gt;
&lt;li&gt;bzr&amp;nbsp;add&lt;/li&gt;
&lt;li&gt;bzr commit -m &amp;#8220;Initial&amp;nbsp;import&amp;#8221;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;#8217;s it! &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-guide/index.html" rel="nofollow"&gt;Learn to use Bazaar&lt;/a&gt; and enjoy powerful version-control capabilities for even your smallest&amp;nbsp;projects.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=zG9K90uHkaQ:_DMCcvtEKdg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=zG9K90uHkaQ:_DMCcvtEKdg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/01/17/quick-dirty-version-control#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Sat, 17 Jan 2009 18:53:13 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">101 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Distributed version control provides a streamlined alternative to vendor branches</title>
    <link>http://fourkitchens.com/blog/2009/01/17/distributed-version-control-provides-streamlined-alternative-vendor-branches</link>
    <description>&lt;p&gt;Anyone who&amp;#8217;s worked with a sufficiently large project eventually ends up establishing &lt;a href="http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html" rel="nofollow"&gt;vendor branches&lt;/a&gt; to track and merge upstream releases. Maintaining these branches is time-consuming, redundant work because everyone who needs a vendor branch of a project needs approximately the same&amp;nbsp;thing.&lt;/p&gt;
&lt;p&gt;With &lt;em&gt;centralized&lt;/em&gt; version control tools, you have two&amp;nbsp;choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apply patches integrating the changes from upstream releases. This approach avoids the need to set up vendor branches, but it will not allow &lt;a href="http://en.wikipedia.org/wiki/Merge_(revision_control)#Three-way_merge" rel="nofollow"&gt;three-way merges&lt;/a&gt;, increasing the developers time spent resolving conflicts. Patches also cannot represent many types of changes, requiring more manual work to&amp;nbsp;upgrade.&lt;/li&gt;
&lt;li&gt;Download, extract, and commit each upstream release to your project&amp;#8217;s own vendor branch. This is also time consuming and requires regular work checking for upstream releases. It does, however, allow three-way merges and applying all types of&amp;nbsp;changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Distributed version control systems, like &lt;a href="http://bazaar-vcs.org/" rel="nofollow"&gt;Bazaar&lt;/a&gt;, allow you to branch your project from a remote &amp;#8220;vendor&amp;#8221; branch, providing all the advantages of a local vendor branch with none of the headaches. Moreover, tools like Bazaar track the last merges from remote vendor branches and automatically apply changes made since your last&amp;nbsp;merge.&lt;/p&gt;
&lt;p&gt;For Drupal, Four Kitchens maintains vendor branches of stable Drupal 5 and 6&amp;nbsp;releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bzr://vcs.fourkitchens.com/drupal/5&lt;/li&gt;
&lt;li&gt;bzr://vcs.fourkitchens.com/drupal/6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also maintain vendor branches for&amp;nbsp;Pressflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bzr://vcs.fourkitchens.com/pressflow/5&lt;/li&gt;
&lt;li&gt;bzr://vcs.fourkitchens.com/pressflow/6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Branching from these allows you to upgrade your project with a simple &amp;#8220;bzr merge [vendor-branch-url]&amp;#8221;. The popular vendor branch URLs are shown&amp;nbsp;above.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=mA4Vwa9S7U8:2ElyRzTZ38s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=mA4Vwa9S7U8:2ElyRzTZ38s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2009/01/17/distributed-version-control-provides-streamlined-alternative-vendor-branches#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal/pressflow">Pressflow</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Sat, 17 Jan 2009 18:35:04 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">100 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Using Bazaar to collaborate with other patch developers</title>
    <link>http://fourkitchens.com/blog/2008/12/30/using-bazaar-collaborate-other-patch-developers</link>
    <description>&lt;p&gt;In &lt;a href="/node/93"&gt;my earlier post on using Bazaar for Drupal core development&lt;/a&gt;, I explained how to use the Four Kitchens Bazaar repository to streamline development of core patches. For patches you&amp;#8217;re developing on your own, those instructions work great. For patches involving a team of developers, you&amp;#8217;d want to have a shared mainline branch, which is beyond my last post&amp;#8217;s scope and this&amp;nbsp;one&amp;#8217;s.&lt;/p&gt;
&lt;p&gt;But, what about when two to three people are collaborating, you&amp;#8217;re using Bazaar, and someone else has posted an updated patch that you&amp;#8217;d like to work&amp;nbsp;from?&lt;/p&gt;
&lt;p&gt;First, you&amp;#8217;ll want to &lt;a href="http://bazaar-vcs.org/BzrTools"&gt;install BzrTools&lt;/a&gt;. If you installed pre-packaged Bazaar for Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X, you already have these plugins&amp;nbsp;installed.&lt;/p&gt;
&lt;p&gt;These instructions also assume you&amp;#8217;re working on a patch for Drupal 7. If not, replace the number &amp;#8220;7&amp;#8221; below with the appropriate&amp;nbsp;version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Continuing will erase your local changes and replace them with the changes in the patch you&amp;nbsp;apply.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy the patch &lt;span class="caps"&gt;URL&lt;/span&gt; to your clipboard. Don&amp;#8217;t bother downloading; Bazaar&amp;#8217;s patch utility will download the patch&amp;nbsp;itself.&lt;/li&gt;
&lt;li&gt;Change directories to be somewhere in your development branch for the issue you&amp;#8217;re working&amp;nbsp;on.&lt;/li&gt;
&lt;li&gt;Run as one command: &lt;tt&gt;bzr pull &amp;#8212;overwrite &amp;#8212;revision=date:[date-of-patch] bzr://vcs.fourkitchens.com/drupal/7&lt;/tt&gt;&lt;br /&gt;The &lt;tt&gt;&amp;#8212;revision&lt;/tt&gt; part is optional, but specifying a date will help Bazaar apply the patch against the revision the patch was created against (or something very close), which is more likely to work than applying the patch to &lt;span class="caps"&gt;CVS&lt;/span&gt; &lt;span class="caps"&gt;HEAD&lt;/span&gt; directly. Use a date specifier like &amp;#8220;yesterday&amp;#8221;, &amp;#8220;2008-12-30&amp;#8221;, or &amp;#8220;2008-12-30,13:41:14&amp;#8221;. See &lt;a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#revision-identifiers"&gt;Bazaar&amp;#8217;s complete documentation on revision&amp;nbsp;specifiers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;bzr patch&amp;nbsp;[url-of-patch]&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;bzr commit -m &amp;#8220;Applied patch&amp;nbsp;[url-of-patch].&amp;#8221;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;bzr merge&amp;nbsp;bzr://vcs.fourkitchens.com/drupal/7&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Resolve conflicts, if&amp;nbsp;any.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;bzr commit -m &amp;#8220;Merged in changes to &lt;span class="caps"&gt;CVS&lt;/span&gt; &lt;span class="caps"&gt;HEAD&lt;/span&gt; since&amp;nbsp;patch.&amp;#8221;&lt;/tt&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You&amp;#8217;ll have a refreshed working copy with the patch applied against the latest Drupal 7. You can now go back to using &lt;a href="/node/93"&gt;the instructions on my earlier post&lt;/a&gt; to continue working or roll a fresh&amp;nbsp;patch.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ydOEtvWBCkI:Um27xBVz450:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ydOEtvWBCkI:Um27xBVz450:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/12/30/using-bazaar-collaborate-other-patch-developers#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Tue, 30 Dec 2008 14:50:01 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">99 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Dynamically attribute content in Drupal using the Author Taxonomy module</title>
    <link>http://fourkitchens.com/blog/2008/12/16/dynamically-attribute-content-drupal-using-author-taxonomy-module</link>
    <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;a href="http://fourkitchens.com/sites/default/files/images/author_taxonomy_1.png" onclick="launch_popup(95, 600, 783); return false;" target="_blank"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/author_taxonomy_1.300px wide.png" alt="Author Taxonomy settings screen" title="Author Taxonomy settings screen"  class="image image-300px wide " width="300" height="392" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 298px;"&gt;&lt;strong&gt;Author Taxonomy settings&amp;nbsp;screen&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Attributing a story, image, or blog post to more than one person can pose a problem on many web platforms. In the print publishing world, it&amp;#8217;s simply a matter of adding another name to the byline or tacking &amp;#8220;Additional reporting by Sue&amp;#8221; to the end of a piece. (Nowhere does the poor designer or typesetter get credit for laying out the&amp;nbsp;page!)&lt;/p&gt;
&lt;p&gt;On the web, priorities are flipped. Instead of attributing a piece of online content to its author, most web software attributes content to &lt;em&gt;the user who posted it on the site.&lt;/em&gt; Countless sites display ugly bylines like &amp;#8220;nyeditor5&amp;#8221; or &amp;#8220;harry_henderson&amp;#8221; instead of a properly formatted&amp;nbsp;name.&lt;/p&gt;
&lt;p&gt;And what to do about stories with &lt;em&gt;multiple&lt;/em&gt; authors? They&amp;#8217;re usually given credit in the first or last line of the content itself &amp;#8212; a surefire way to reduce a semantic web evangelist to &lt;span class="caps"&gt;XML&lt;/span&gt;-encased&amp;nbsp;tears.&lt;/p&gt;
&lt;p&gt;Enter the &lt;a href="http://drupal.org/project/author_taxonomy" title="Author Taxonomy module on Drupal.org"&gt;Author Taxonomy module&lt;/a&gt;. We initially developed this module for &lt;a href="http://thatotherpaper.com/" title="ThatOtherPaper.com"&gt;&lt;em&gt;That Other Paper&lt;/em&gt;&lt;/a&gt;, an Austin-area, online magazine we used to publish. To maintain a cohesive voice and layout style, we required all content to be vetted by one of our few web-savvy editors prior to publications. As a result, virtually none of the content on the site was placed there by its original&amp;nbsp;author.&lt;/p&gt;
&lt;p&gt;We experimented at first with creating a properly formatted username for each contributor: &amp;#8220;Sue Smith,&amp;#8221; &amp;#8220;Hilarious Jackson,&amp;#8221; and so on. This turned out to be a hassle, as users are unaccustomed to Usernames with Caps and Spaces. Even then, we couldn&amp;#8217;t properly attribute content to more than one author. It was time for a custom&amp;nbsp;module.&lt;/p&gt;
&lt;p&gt;Author Taxonomy combines the power of taxonomies with the real-world demands of professional publications. Features&amp;nbsp;include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New authors can be created on the fly with &amp;#8220;Tags&amp;#8221; (&amp;#8220;Free tagging&amp;#8221; in Drupal 5.x)&amp;nbsp;enabled.&lt;/li&gt;
&lt;li&gt;Multiple authors are displayed using serialized text: &amp;#8220;Sue and Jan&amp;#8221; or &amp;#8220;Sue, Jan, and&amp;nbsp;Bobby.&amp;#8221;&lt;/li&gt;
&lt;li&gt;Names link to their taxonomy term pages, providing readers with a quick shortcut to all posts attributed to a particular&amp;nbsp;author.&lt;/li&gt;
&lt;li&gt;Site admins have the option of automatically overwriting the &amp;#8220;real&amp;#8221; node author &amp;#8212; that is, the user who posted the node &amp;#8212; with an author term if a matching username is&amp;nbsp;found.&lt;/li&gt;
&lt;li&gt;The date display is fully customizable and can be disabled&amp;nbsp;completely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If anybody has any suggestions for improving the functionality of Author Taxonomy, please add them to the &lt;a href="http://drupal.org/project/issues/author_taxonomy" title="Author Taxonomy module's issue queue on Drupal.org"&gt;module&amp;#8217;s issue queue&lt;/a&gt;. We&amp;#8217;d love to hear&amp;nbsp;`em.&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/author_taxonomy_2_markup.png" alt="Node editing interface" title="Node editing interface"  class="image image-preview " width="580" height="280" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;Node editing&amp;nbsp;interface&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="inline inline-center"&gt;&lt;img src="http://fourkitchens.com/sites/default/files/images/author_taxonomy_3_markup.png" alt="How Author Taxonomy renders node output" title="How Author Taxonomy renders node output"  class="image image-preview " width="580" height="180" /&gt;&lt;span class="caption"&gt;&lt;strong&gt;How Author Taxonomy renders node&amp;nbsp;output&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=cnnVEC0UdSU:z1yNxNq-TS4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=cnnVEC0UdSU:z1yNxNq-TS4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/12/16/dynamically-attribute-content-drupal-using-author-taxonomy-module#comments</comments>
 <category domain="http://fourkitchens.com/tags/development/drupal-modules">Drupal Modules</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Tue, 16 Dec 2008 16:21:17 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">98 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>A year in open source</title>
    <link>http://fourkitchens.com/blog/2008/12/15/year-open-source</link>
    <description>&lt;p&gt;Mid-October marked my one-year anniversary with Four Kitchens and, consequently, the same anniversary of being an open-source software contributor. Because my career up to that point had been limited to proprietary software development, I had intended to write a one-year retrospective on the experience. But, as often happens, one gets busy, and now October, November, and half of December have passed. So without further ado, my self-indulgent retrospective on moving to open source development (complete with pontifications).&lt;br /&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;/p&gt;
&lt;h2&gt;Working for &amp;#8220;The&amp;nbsp;Man&amp;#8221;&lt;/h2&gt;
&lt;p&gt;I have no idea how many lines of code I&amp;#8217;ve written in my career. A lot? Maybe. I can&amp;#8217;t actually prove it since all the evidence is locked away. And, to make it worse, there&amp;#8217;s not even a product on a store shelf I can point to and say, &amp;#8220;Hey! I wrote some of the code in&amp;nbsp;there!&amp;#8221;&lt;/p&gt;
&lt;p&gt;That was always the hardest part of the job: working my ass off and having nothing to show for it but a paycheck. For some people, the pay is all the satisfaction required. For others, the activity itself provides the satisfaction. For me the satisfaction comes from the end result: being able to feel good about that result and being able to show it to other people. I rarely found that satisfaction while I was doing closed-source&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;Closed-source companies usually have no qualms using open-source software. Contributing back is usually a different story. Often it&amp;#8217;s limited to reporting bugs. Even at commercial software companies that participate in open source, employees often need permission to contribute (Big Blue, I&amp;#8217;m calling you out). This is true even at some universities since, in the United States, universities can own software patents. Yes, I could have still done it undercover, but I like to keep the agreements I&amp;nbsp;make.&lt;/p&gt;
&lt;h2&gt;Rose tint my&amp;nbsp;world&lt;/h2&gt;
&lt;p&gt;So what attracted me to doing open-source work in the first place? The biggest appeal for me was being able to show my work. That sounds really selfish on the surface, but the reality is that unless you are getting what you need out of your work, you&amp;#8217;re not actually doing anybody any good. The next appeal was from the non-profits and grass-roots organizations I often saw making use of open-source projects. I saw it as an opportunity to contribute in some way to the things I cared about and could believe in. At least, that was the romantic&amp;nbsp;view.&lt;/p&gt;
&lt;p&gt;But there was also a cynical view. Several years of reading comment threads on &lt;a href="http://slashdot.org/" title="Slashdot"&gt;Slashdot&lt;/a&gt; had convinced me that the open-source community was mean-spirited and hostile. Browsing support forums and seeing such helpful responses as &amp;#8220;Why don&amp;#8217;t you just use Linux?&amp;#8221; reinforced that&amp;nbsp;idea.&lt;/p&gt;
&lt;p&gt;When I had to opportunity to take a job doing open-source work, I let the romantic view win. I committed my first Drupal module with a lot of anxiety and wondered if my ego would survive that first &amp;#8220;damn, you suck at this&amp;#8221; email. I&amp;#8217;m sure that email has been delayed somewhere in that &lt;a href="http://sendmeaninternet.com/" title="Send me an Internet!"&gt;series of&amp;nbsp;tubes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The Drupal&amp;nbsp;tribe&lt;/h2&gt;
&lt;p&gt;I don&amp;#8217;t use the word tribe in jest, but rather to emphasize the feel of the open-source community that I&amp;#8217;m currently involved with. Tribes are made up of individuals with distinct identities and distinct goals. The tribe facilitates those goals in order to reach its goals, and the individuals contribute their time and skills in order to reach their personal goals. All of the tribe folk are in the tribe by their choice and contributing in the way they want; it is not the selfless commune from Ayn Rand&amp;#8217;s &lt;em&gt;Anthem&lt;/em&gt;. The cycle of life and death in traditional human tribes is replaced by the arrival of new members who want to contribute and the departure of existing members that choose to move on to other&amp;nbsp;things.&lt;/p&gt;
&lt;p&gt;Being able to function as a member of the tribe has significant importance. It&amp;#8217;s at least as important as technical skill. The tribe survives by nurturing those members who add to it and ostracizing those that don&amp;#8217;t. I observed an instance of this when someone with strong industry credentials tried, rather arrogantly, to assert himself on those credentials alone. Several members of the tribe tried, without success, to persuade him to change his approach. Eventually, he stopped trying to participate after the group started ignoring him. I&amp;#8217;ve heard stories of other times this has&amp;nbsp;happened.&lt;/p&gt;
&lt;p&gt;Tribal participation isn&amp;#8217;t the same as being a &amp;#8220;team player&amp;#8221; at typical software companies. A tribe holds itself together by the will of its members; the typical corporate team is held together by the will of its management. This difference is subtle, but I believe that understanding it is essential in order to function in open-source projects. Coming from an industry background, it can feel like there &lt;em&gt;must&lt;/em&gt; be someone in charge. Sometimes that can lead to the newcomer trying to take charge and causing&amp;nbsp;friction.&lt;/p&gt;
&lt;p&gt;There is a strong mentor contingent in the tribe. There is the occasional snarky answer to a question, but the general vibe of the tribe is that everyone starts out knowing nothing. No one is viewed as stupid for having a basic&amp;nbsp;question.&lt;/p&gt;
&lt;p&gt;Drupal is the only-open source community I&amp;#8217;ve been actively involved with so far, so I don&amp;#8217;t know how universal these observations are. I would guess that there are more similarities than differences with other open source communities. My expectations at this point, however, are rather&amp;nbsp;high.&lt;/p&gt;
&lt;h2&gt;Perils and&amp;nbsp;thrills&lt;/h2&gt;
&lt;p&gt;Open source development is not without danger. It has certain addictive properties. It tickles my ego whenever I get an issue on one of my Drupal themes. Solving the issue provides another tickle, and I find myself contemplating what to do to get more of those thrills. There are warning signs for addiction. For me, when I had a dream in which I was writing Drupal code while &lt;a href="http://webchick.net/" title="webchick"&gt;webchick&lt;/a&gt; &lt;span class="caps"&gt;YELLED&lt;/span&gt; &lt;span class="caps"&gt;AT&lt;/span&gt; &lt;span class="caps"&gt;ME&lt;/span&gt; on &lt;span class="caps"&gt;IRC&lt;/span&gt;, I decided it was time to take a&amp;nbsp;break.&lt;/p&gt;
&lt;h2&gt;Coda&lt;/h2&gt;
&lt;p&gt;In writing this, I realize I am preaching to the converted. One of the easiest things to loose sight of in any human activity is the beginner&amp;#8217;s mind. What motivated us to get involved? What did it feel like when we got started? What were the joys? And what were the frustrations? My personal experience getting involved with open-source was overwhelmingly positive, but there was trepidation in the beginning, and I don&amp;#8217;t think I&amp;#8217;m unique in that&amp;nbsp;respect.&lt;/p&gt;
&lt;p&gt;Open-source projects thrive through an infusion of fresh ideas and fresh minds. I believe it&amp;#8217;s important as we seek out those new minds to remember what it was like for us when we were new and wanting to contribute. It&amp;#8217;s not something that can be addressed in an &lt;span class="caps"&gt;FAQ&lt;/span&gt;. Newcomers will see it in our interactions with them and in our interactions with each other. It is subtle, but it&amp;#8217;s never&amp;nbsp;unseen.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=vpxr1qo4pDk:eJH3ExsXXEA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=vpxr1qo4pDk:eJH3ExsXXEA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/12/15/year-open-source#comments</comments>
 <category domain="http://fourkitchens.com/authors/shannon-lucas">Shannon Lucas</category>
 <category domain="http://fourkitchens.com/tags/community">Community</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <pubDate>Mon, 15 Dec 2008 11:51:26 -0500</pubDate>
 <dc:creator>Shannon Lucas</dc:creator>
 <guid isPermaLink="false">94 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Using Bazaar to work on Drupal core patches</title>
    <link>http://fourkitchens.com/blog/2008/12/07/using-bazaar-work-drupal-core-patches</link>
    <description>&lt;p&gt;As anyone who&amp;#8217;s developed core patches knows, it&amp;#8217;s not the writing of initial patch that takes the work, it&amp;#8217;s the combination of revising the patch and keeping up to date with &lt;span class="caps"&gt;HEAD&lt;/span&gt;. With Drupal.org&amp;#8217;s &lt;span class="caps"&gt;CVS&lt;/span&gt;, this is difficult because you cannot commit your core changes to checkpoint your work. &lt;span class="caps"&gt;CVS&lt;/span&gt;&amp;#8217;s merge algorithms are also relatively poor for maintaining large divergence from &lt;span class="caps"&gt;CVS&lt;/span&gt;&amp;nbsp;&lt;span class="caps"&gt;HEAD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;One option &amp;#8212; which several community members used to create the huge &lt;span class="caps"&gt;DB&lt;/span&gt;-&lt;span class="caps"&gt;TNG&lt;/span&gt; patch &amp;#8212; was to create a Subversion repository. This is far too much overhead for smaller core patches, and it still required person-by-person approval to commit to the Subversion&amp;nbsp;repository.&lt;/p&gt;
&lt;p&gt;Four Kitchens is now hosting a much more flexible system for users of &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt;. Every hour, we synchronize core changes from &lt;span class="caps"&gt;CVS&lt;/span&gt; &lt;span class="caps"&gt;HEAD&lt;/span&gt; into our Drupal 7 branch, which is available for anonymous branching by&amp;nbsp;anyone.&lt;/p&gt;
&lt;p&gt;Simply &lt;a href="http://bazaar-vcs.org/Download"&gt;download and install Bazaar&lt;/a&gt;, which has packages or installers for Linux, Windows, Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X, and &lt;span class="caps"&gt;BSD&lt;/span&gt;. We&amp;#8217;re using a repository format that should work with Bazaar 1.0 and newer, at a&amp;nbsp;minimum.&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;Then, when you&amp;#8217;re ready to develop, &lt;a href="/node/120"&gt;create a local branch&lt;/a&gt; and make its new directory your working directory.&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Then, where you&amp;#8217;re ready to develop, run this:&lt;br /&gt;
&lt;code&gt;bzr branch bzr://vcs.fourkitchens.com/drupal/7 [optional-working-copy-directory]&lt;/code&gt;&lt;br /&gt;
&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll have a fresh working copy with a number of benefits over a &lt;span class="caps"&gt;CVS&lt;/span&gt;&amp;nbsp;checkout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can commit to your local branch to checkpoint your work: &lt;code&gt;bzr&amp;nbsp;commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You can integrate in changes to &lt;span class="caps"&gt;HEAD&lt;/span&gt; using Bazaar&amp;#8217;s superior merge algorithms:&lt;br /&gt;&lt;code&gt;bzr&amp;nbsp;merge&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You can branch from your own branch: &lt;code&gt;bzr branch [existing]&amp;nbsp;[new]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;re working with others and they have Bazaar branches, too, you can merge from their branches to&amp;nbsp;collaborate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;ins&gt;And when you&amp;#8217;re ready to post a patch, run&lt;br /&gt;
&lt;code&gt;bzr diff --old bzr://vcs.fourkitchens.com/drupal/7-all-history &amp;gt; mypatch.patch&lt;/code&gt;&lt;br /&gt;
to create a patch reflecting all of your changes relative to &lt;span class="caps"&gt;CVS&lt;/span&gt; &lt;span class="caps"&gt;HEAD&lt;/span&gt;.&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;And when you&amp;#8217;re ready to post a patch, run &lt;code&gt;bzr diff --old bzr://vcs.fourkitchens.com/drupal/7&lt;/code&gt; to create a patch reflecting all of your changes relative to CVS HEAD.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;It will be a while before Drupal.org moves to anything other than &lt;span class="caps"&gt;CVS&lt;/span&gt;. Until then, we can foster decentralized development quite effectively using something like the Four Kitchens&amp;nbsp;repository.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;&lt;strong&gt;Note (2009-12-07):&lt;/strong&gt; Yes, I realize Launchpad has &lt;a href="https://code.launchpad.net/~vcs-imports/drupal/main"&gt;a similar service&lt;/a&gt; that stores more detailed revision data, but I often find Launchpad slow or unresponsive. We also maintain Bazaar branches of stable Drupal 5 and 6; just replace the &amp;#8220;7&amp;#8221; above with &amp;#8220;5&amp;#8221; or &amp;#8220;6&amp;#8221;.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note (2009-02-09):&lt;/strong&gt; I have updated this post to use the &lt;a href="/node/120"&gt;new Bazaar branch for Drupal &lt;span class="caps"&gt;HEAD&lt;/span&gt;&lt;/a&gt;. We also maintain Bazaar branches of stable Drupal 5 and 6; just replace the &amp;#8220;7-all-history&amp;#8221; above with &amp;#8220;5&amp;#8221; or &amp;#8220;6&amp;#8221;. All obsolete information is now &lt;del&gt;crossed out&lt;/del&gt; and &lt;ins&gt;replaced&lt;/ins&gt;. I&amp;#8217;ve maintained the obsolete instructions in case anyone is actively using them; they will continue to&amp;nbsp;function.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=YXvBHQBFXsY:AmwfsLZL_ws:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=YXvBHQBFXsY:AmwfsLZL_ws:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/12/07/using-bazaar-work-drupal-core-patches#comments</comments>
 <category domain="http://fourkitchens.com/tags/version-control/bazaar">Bazaar</category>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Sat, 06 Dec 2008 23:11:36 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">93 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Drupalers for Drupal: DrupalCon campaign buttons</title>
    <link>http://fourkitchens.com/blog/2008/12/05/drupalers-drupal-drupalcon-campaign-buttons</link>
    <description>&lt;p&gt;Just for kicks, here are some DrupalCon &amp;#8220;campaign buttons&amp;#8221; we cooked up while brainstorming T-shirt ideas. We&amp;#8217;re releasing them under the &lt;a href="http://www.gnu.org/copyleft/gpl.html"&gt;&lt;abbr title="GNU General Public License version 3"&gt;GPLv3&lt;/abbr&gt;&lt;/a&gt;, so feel free to use `em as you see&amp;nbsp;fit!&lt;/p&gt;

&lt;p&gt;&lt;abbr title="Scalable Vector Graphics"&gt;&lt;span class="caps"&gt;SVG&lt;/span&gt;&lt;/abbr&gt; and &lt;abbr title="Portable Network Graphics"&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&lt;/abbr&gt; formats are linked below. If you&amp;#8217;d rather not work with a vector program, you can also download all three buttons as a &lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-buttons.psd"&gt;layered, smart object &lt;abbr title="Abode Photoshop format"&gt;&lt;span class="caps"&gt;PSD&lt;/span&gt;&lt;/abbr&gt;&amp;nbsp;file&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Button #1: Drupalers for&amp;nbsp;Drupal&lt;/h2&gt;

&lt;p&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-button-1-300.png" alt="DrupalCon campaign button 1" /&gt;&lt;/p&gt;

&lt;p class="textcenter"&gt;
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-1.svg"&gt;&lt;abbr title="Scalable Vector Graphics"&gt;&lt;span class="caps"&gt;SVG&lt;/span&gt;&lt;/abbr&gt; format&lt;/a&gt; | 
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-1-150.png"&gt;150px &lt;abbr title="Portable Network Graphics"&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&lt;/abbr&gt;&lt;/a&gt; | 
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-1-300.png"&gt;300px&amp;nbsp;&lt;abbr title="Portable Network Graphics"&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&lt;/abbr&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;h2&gt;Button #2: Stars `n&amp;#8217;&amp;nbsp;stripes&lt;/h2&gt;

&lt;p&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-button-2-300.png" alt="DrupalCon campaign button 2" /&gt;&lt;/p&gt;

&lt;p class="textcenter"&gt;
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-2.svg"&gt;&lt;abbr title="Scalable Vector Graphics"&gt;&lt;span class="caps"&gt;SVG&lt;/span&gt;&lt;/abbr&gt; format&lt;/a&gt; | 
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-2-150.png"&gt;150px &lt;abbr title="Portable Network Graphics"&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&lt;/abbr&gt;&lt;/a&gt; | 
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-2-300.png"&gt;300px&amp;nbsp;&lt;abbr title="Portable Network Graphics"&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&lt;/abbr&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;h2&gt;Button #3: America&amp;#8217;s&amp;nbsp;ticket&lt;/h2&gt;

&lt;p&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-button-3-300.png" alt="DrupalCon campaign button 3" /&gt;&lt;/p&gt;

&lt;p class="textcenter"&gt;
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-2.svg"&gt;&lt;abbr title="Scalable Vector Graphics"&gt;&lt;span class="caps"&gt;SVG&lt;/span&gt;&lt;/abbr&gt; format&lt;/a&gt; | 
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-2-150.png"&gt;150px &lt;abbr title="Portable Network Graphics"&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&lt;/abbr&gt;&lt;/a&gt; | 
&lt;a href="http://fourkitchens.com/sites/default/files/drupalcon-button-2-300.png"&gt;300px&amp;nbsp;&lt;abbr title="Portable Network Graphics"&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&lt;/abbr&gt;&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=JdhugmC8378:NmQkwGM9-JU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=JdhugmC8378:NmQkwGM9-JU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/12/05/drupalers-drupal-drupalcon-campaign-buttons#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Fri, 05 Dec 2008 12:22:28 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">87 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Snazzy! Our DrupalCon DC T-shirt submissions</title>
    <link>http://fourkitchens.com/blog/2008/12/04/snazzy-our-drupalcon-dc-t-shirt-submissions</link>
    <description>&amp;lt;!&amp;#8212;break&amp;#8212;&gt;
&lt;p&gt;We&amp;#8217;ve been busy preparing submissions for the &lt;a href="http://dc2009.drupalcon.org/tshirts"&gt;DrupalCon &lt;span class="caps"&gt;DC&lt;/span&gt; T-shirt contest&lt;/a&gt;. Here&amp;#8217;s what we&amp;#8217;ve come up with so&amp;nbsp;far.&lt;/p&gt;

&lt;h2&gt;Retro-fitted!&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/t-shirt/retro-fitted"&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-shirt-1-white.png" alt="Retro-fitted!" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/t-shirt/retro-fitted"&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-shirt-1-black.png" alt="Retro-fitted!" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="textcenter"&gt;&lt;a href="http://www.flickr.com/photos/fourkitchens/3057445582/in/set-72157610020002698/"&gt;Full-size graphics&lt;/a&gt; | &lt;a href="http://dc2009.drupalcon.org/t-shirt/retro-fitted"&gt;Vote for Retro-fitted!&amp;nbsp;&amp;raquo;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Retro-fitted! part two:&amp;nbsp;Refitted&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/t-shirt/retro-fitted-part-two-refitted"&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-shirt-2-white.png" alt="Retro-fitted! part two: Refitted" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/t-shirt/retro-fitted-part-two-refitted"&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-shirt-2-black.png" alt="Retro-fitted! part two: Refitted" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="textcenter"&gt;&lt;a href="http://www.flickr.com/photos/fourkitchens/3059565438/in/set-72157610020002698/"&gt;Full-size graphics&lt;/a&gt; | &lt;a href="http://dc2009.drupalcon.org/t-shirt/retro-fitted-part-two-refitted"&gt;Vote for Retro-fitted! part two&amp;nbsp;&amp;raquo;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Drupal&amp;nbsp;arcade&lt;/h2&gt;

&lt;p&gt;This is my personal favorite (*cough*&amp;nbsp;*cough*).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/t-shirt/drupal-arcade"&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-shirt-3.png" alt="Drupal arcade" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="textcenter"&gt;&lt;a href="http://www.flickr.com/photos/fourkitchens/3060252692/in/set-72157610020002698/"&gt;Full-size graphics&lt;/a&gt; | &lt;a href="http://dc2009.drupalcon.org/t-shirt/drupal-arcade"&gt;Vote for Drupal arcade&amp;nbsp;&amp;raquo;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Project&amp;nbsp;Lincoln&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/t-shirt/project-lincoln"&gt;&lt;img class="aligncenter" src="http://fourkitchens.com/sites/default/files/images/drupalcon-shirt-4.png" alt="Project Lincoln" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="textcenter"&gt;&lt;a href="http://www.flickr.com/photos/fourkitchens/3059892001/in/set-72157610020002698/"&gt;Full-size graphics&lt;/a&gt; | &lt;a href="http://dc2009.drupalcon.org/t-shirt/project-lincoln"&gt;Vote for Project Lincoln&amp;nbsp;&amp;raquo;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Robbie&amp;#8217;s&amp;nbsp;shirt&lt;/h2&gt;

&lt;p&gt;Robbie&amp;#8217;s one of our developer web chefs. He begged us to release him from his coding cage long enough to design a T-shirt. This is what he came up&amp;nbsp;with:&lt;/p&gt;

&lt;p&gt;&lt;img class="aligncenter" src="http://farm4.static.flickr.com/3030/3059469123_2e4cdae0a1.jpg?v=0" alt="Robbie the developer's attempt" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/fourkitchens/3059469123/in/set-72157610020002698/"&gt;According to Robbie&lt;/a&gt;, the only reason he didn&amp;#8217;t submit the design is because he got the year wrong. Poor&amp;nbsp;guy.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=00Npskgrfz8:dPaJ8g3jk1Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=00Npskgrfz8:dPaJ8g3jk1Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/12/04/snazzy-our-drupalcon-dc-t-shirt-submissions#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/t-shirts">T-Shirts</category>
 <pubDate>Thu, 04 Dec 2008 13:47:02 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">81 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>A plethora of DrupalCon DC session proposals</title>
    <link>http://fourkitchens.com/blog/2008/12/04/weve-got-drupalcon-dc-sessions</link>
    <description>&lt;p class="em"&gt;&lt;img src="/sites/default/files/images/session-lager.jpg" /&gt;&lt;br /&gt;
Photo by &lt;a href="http://www.flickr.com/photos/wickenden/1578353125/" title="Don LaVange"&gt;Don&amp;nbsp;LaVange&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Besides sponsoring next year&amp;#8217;s DrupalCon Four Kitchens is also offering to share our know-how in the form of &lt;em&gt;five&lt;/em&gt; session proposals and a &lt;em&gt;&lt;span class="caps"&gt;MEGA&lt;/span&gt; session series&lt;/em&gt; on theming! Oh yes, we have a plethora. Read the rundowns below and if you find one you want to see on the schedule &amp;#8212; go vote for&amp;nbsp;it!&lt;/p&gt;
&lt;h2&gt;Business&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/session/build-your-own-open-source-business"&gt;Build your own open source business&lt;/a&gt;&lt;br /&gt;
This session will share the real experiences and hurdles encountered in the first two and half years of starting a Drupal consulting business. It&amp;#8217;s aimed to enlighten attendees who are interested in a) building their first business with little or no funding and b) who prefer to embrace open source&amp;nbsp;solutions.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/session/project-management-agilescrum-development"&gt;Project Management for Agile/Scrum Development&lt;/a&gt;&lt;br /&gt;
Project Management is essential to successful projects and successful companies. Learn how the Agile/Scrum method can enhance your current project management skills. Or, learn about Project Management for the first time! This session will cover basic &lt;span class="caps"&gt;PM&lt;/span&gt; skills, organization, communication, and tools to make your life as a project manager run&amp;nbsp;smoothly.&lt;/p&gt;
&lt;h2&gt;Core&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/session/building-infrastructure-you-can-scale-monitor-and-maintain"&gt;Building infrastructure you can scale, monitor, and maintain&lt;/a&gt;&lt;br /&gt;
It&amp;#8217;s easy to set up a single &lt;span class="caps"&gt;GNU&lt;/span&gt;/Linux server, but there&amp;#8217;s no obvious way to take those same skills and build functional clusters. If you want to do that, you need a whole new class of tools. At Four Kitchens, we&amp;#8217;ve done the hard work: we maintain an in-office lab to develop and apply cluster-level integration and management techniques to the challenging problems we encounter managing our clients&amp;#8217; infrastructure. We&amp;#8217;d like to show you what we&amp;#8217;ve learned in our lab and in the&amp;nbsp;field.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/session/flexible-development-and-deployment-bazaar"&gt;Flexible development and deployment with Bazaar&lt;/a&gt;&lt;br /&gt;
Bazaar represents a departure from the dichotomy of &amp;#8220;centralized&amp;#8221; versus &amp;#8220;distributed&amp;#8221; because it directly supports both types of workflows, as well as hybrids. While other distributed version control systems also claim to do this, none support it quite so elegantly (and with such good cross-platform support) as Bazaar. Learn how Four Kitchens uses Bazaar to have unprecedented capability in development and deployment &amp;#8212; from our smallest personal projects to our largest enterprise&amp;nbsp;installations.&lt;/p&gt;
&lt;h2&gt;Design&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/session/mega-session-theming-drupal-ground"&gt;&lt;span class="caps"&gt;MEGA&lt;/span&gt; &lt;span class="caps"&gt;SESSION&lt;/span&gt;: Theming Drupal from the ground up&lt;/a&gt;&lt;br /&gt;
This series of sessions will cover the full spectrum of Drupal theming. The first session will cover webdesign basics: &lt;span class="caps"&gt;HTML&lt;/span&gt;, &lt;span class="caps"&gt;CSS&lt;/span&gt;, and three-column layouts. Subsequent sessions will demonstrate how to port a theme to Drupal, aspects of design unique to Drupal, and advanced techniques such as implementing preprocessing functions and overriding theme&amp;nbsp;functions.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; &lt;em&gt;Our resident &lt;span class="caps"&gt;UX&lt;/span&gt; expert Shannon Lucas will be lending his expertise to the newly submitted usability&amp;nbsp;session&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dc2009.drupalcon.org/session/usability-testing-university-baltimore"&gt;Usability testing at the University of Baltimore&lt;/a&gt;&lt;br /&gt;
A report back from the third round of formal usability testing of Drupal core - held at the University of Baltimore, a week before Drupalcon &lt;span class="caps"&gt;DC&lt;/span&gt;. We&amp;#8217;ll give an overview of the state of usability in Drupal core, see where improvements have been made, where there&amp;#8217;s still work to be done. Building on the lessons learned from previous testing at &lt;span class="caps"&gt;UB&lt;/span&gt; and the University of&amp;nbsp;Minnesota.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=d-oAHWSaIK8:jKphCkt7wVo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=d-oAHWSaIK8:jKphCkt7wVo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/12/04/weve-got-drupalcon-dc-sessions#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Thu, 04 Dec 2008 10:55:26 -0500</pubDate>
 <dc:creator>Aaron Stanush</dc:creator>
 <guid isPermaLink="false">78 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>The great Drupal module hunt</title>
    <link>http://fourkitchens.com/blog/2008/11/19/great-drupal-module-hunt</link>
    <description>&lt;img class="floatright" src="/sites/default/files/elephant.jpg" alt="The elephant in the room" /&gt;

&lt;p&gt;If you&amp;#8217;ve keep up with Drupal news, you know there&amp;#8217;s a &lt;a href="http://groups.drupal.org/drupalorg-redesign-plan-drupal-association"&gt;hefty ongoing process&lt;/a&gt; of redesigning &lt;a href="http://drupal.org/"&gt;Drupal.org&lt;/a&gt;. Leisa Reichelt has played a huge part in documenting this process and has started some great discussions as well as set up  some super useful cardsorting exercises to crowdsource site architecture&amp;nbsp;concerns.&lt;/p&gt;

&lt;p&gt;One of the most important examples of these cardsorting exercises is happening right now! It&amp;#8217;s to help organize the &lt;a href="http://drupal.org/project/Modules"&gt;somewhat chaotic page&lt;/a&gt; for finding Drupal modules. The creation of &lt;a href="http://drupalmodules.com/"&gt;DrupalModules.com&lt;/a&gt; was no doubt formed as a solution to categorize and rate the available modules, but no one would argue the problem needs to be fixed at home as&amp;nbsp;well.&lt;/p&gt;

&lt;p&gt;Drupal&amp;#8217;s huge set of freely available community modules is what makes it so versatile. Join the fight, &lt;a href="http://www.disambiguity.com/drupalorg-redesign-cardsorting-module-categories/"&gt;ensure that finding modules is a painless experience for all&amp;nbsp;time!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Extra credit:&lt;/em&gt; Here&amp;#8217;s &lt;a href="http://www.disambiguity.com/drupalorg-what-we-learned-from-the-card-sort/"&gt;what the redesign team learned&lt;/a&gt; from the last card&amp;nbsp;sort.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by&amp;nbsp;&lt;a href="http://www.flickr.com/photos/lizard_queen/114587853/"&gt;Caitlin&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=taQ0oIDPDyQ:VXrMSnkyHkM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=taQ0oIDPDyQ:VXrMSnkyHkM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/11/19/great-drupal-module-hunt#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Wed, 19 Nov 2008 14:07:59 -0500</pubDate>
 <dc:creator>Aaron Stanush</dc:creator>
 <guid isPermaLink="false">76 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Four Kitchens at DrupalCon DC 2009</title>
    <link>http://fourkitchens.com/blog/2008/10/23/four-kitchens-drupalcon-dc-2009</link>
    <description>&lt;p&gt;&lt;img src="/sites/default/files/images/dc-monument-dollar.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Four Kitchens is proud to announce that we are attending and helping sponsor &lt;a href="http://dc2009.drupalcon.org/"&gt;DrupalCon &lt;span class="caps"&gt;DC&lt;/span&gt;&lt;/a&gt;. From March 4th through March 7th, the chefs will be in Washington, &lt;span class="caps"&gt;D.C.&lt;/span&gt; to discuss their recipes for scalability, theme development, module development, design, usability, project management, and business strategy. And we promise we don&amp;#8217;t use any secret&amp;nbsp;sauce!&lt;/p&gt;

&lt;p&gt;If there is a particular topic you would like to see the chefs present a session on, please add a comment to this entry, &lt;a href="http://fourkitchens.com/contact"&gt;contact us&lt;/a&gt;, or send us a tweet on&amp;nbsp;&lt;a href="http://twitter.com/fourkitchens"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p class="small"&gt;&lt;em&gt;Photo by &lt;a href="http://www.zieak.com/" title="Ryan McFarland"&gt;Ryan McFarland&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=TGDOQ6yAOKA:dFPUE0oN09E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=TGDOQ6yAOKA:dFPUE0oN09E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/10/23/four-kitchens-drupalcon-dc-2009#comments</comments>
 <category domain="http://fourkitchens.com/authors/shannon-lucas">Shannon Lucas</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/news">News</category>
 <pubDate>Thu, 23 Oct 2008 10:32:27 -0500</pubDate>
 <dc:creator>Shannon Lucas</dc:creator>
 <guid isPermaLink="false">72 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Formal usability testing of Drupal 7.x/8.x/9.x</title>
    <link>http://fourkitchens.com/blog/2008/10/02/formal-usability-testing-drupal-7x8x9x</link>
    <description>&lt;p&gt;As part of an ongoing effort to enhance user experience, the Drupal User Exeprience Team is submitting a grant proposal to the Knight Drupal Initiative to receive funding for several rounds of formal usability testing on Drupal. The working draft of the proposal is currently open to community discussion, and we encourage anyone who is interested to&amp;nbsp;participate.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.drupal.org/node/15448" rel="nofollow"&gt;&lt;span class="caps"&gt;KDI&lt;/span&gt; Usability&amp;nbsp;Proposal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;About the Knight&amp;nbsp;Foundation&lt;/p&gt;
&lt;p&gt;Since 1950, the &lt;a href="http://www.knightfoundation.org/" rel="nofollow"&gt;Knight Foundation&lt;/a&gt; has invested more than $300 million to advance quality journalism and freedom of expression worldwide. Today, the program focuses on leading journalism excellence into the digital age. We define journalism excellence as the fair, accurate, contextual pursuit of truth. The Foundation is a Miami-based non-profit&amp;nbsp;organization.&lt;/p&gt;
&lt;p&gt;About the Knight Drupal&amp;nbsp;Initiative&lt;/p&gt;
&lt;p&gt;Drupal and the Knight Foundation agree that open source digital publishing can enable powerful agents of transformation in their&amp;nbsp;communities.&lt;/p&gt;
&lt;p&gt;Knight Foundation is working with the Drupal community on the &lt;a href="http://groups.drupal.org/knight-drupal-initiative" rel="nofollow"&gt;Knight Drupal Initiative&lt;/a&gt; with the following goals in&amp;nbsp;mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To enable more people to enter the digital conversation by lowering the technical barriers to&amp;nbsp;entry.&lt;/li&gt;
&lt;li&gt;To provide powerful tools for digital publication, free and open to&amp;nbsp;all.&lt;/li&gt;
&lt;li&gt;To encourage people to improve their communities by supporting the free exchange of information and&amp;nbsp;ideas.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=gyEPtHQSYvw:DXjGxocQIW0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=gyEPtHQSYvw:DXjGxocQIW0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/10/02/formal-usability-testing-drupal-7x8x9x#comments</comments>
 <category domain="http://fourkitchens.com/authors/shannon-lucas">Shannon Lucas</category>
 <category domain="http://fourkitchens.com/tags/design/usability">Usability</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Wed, 01 Oct 2008 19:10:17 -0500</pubDate>
 <dc:creator>Shannon Lucas</dc:creator>
 <guid isPermaLink="false">71 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Download our free Drupal topic icons pack</title>
    <link>http://fourkitchens.com/blog/2008/09/30/download-our-free-drupal-topic-icons-pack</link>
    <description>&amp;lt;!&amp;#8212;break&amp;#8212;&gt;
&lt;img class="aligncenter" src="/sites/default/files/images/drupal-icons-preview-web.png" /&gt;

&lt;p&gt;These icons were originally created to correspond with session tracks for the Drupalcon Szeged 2008 conference. They didn&amp;#8217;t end up being used, but that doesn&amp;#8217;t mean we&amp;#8217;re going to forget about them. Now you can download and use these hot icons for your own Drupal-related events, projects, and websites. These icons are released under the &lt;a href="http://www.gnu.org/copyleft/gpl.html" title="GPLv3 license"&gt;GPLv3&lt;/a&gt; so they are yours to use, modify, and&amp;nbsp;rerelease.&lt;/p&gt;

&lt;p&gt;&lt;a href="/sites/default/files/download/drupal-topic-icons-pack-v1.zip" title="Download the Drupal topic icons pack"&gt;Download the Drupal topic icons pack&amp;nbsp;(1.&lt;span class="caps"&gt;5MB&lt;/span&gt;)&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=YsKK-Q62shQ:DcGYuuYT3wY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=YsKK-Q62shQ:DcGYuuYT3wY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/09/30/download-our-free-drupal-topic-icons-pack#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <pubDate>Tue, 30 Sep 2008 12:46:34 -0500</pubDate>
 <dc:creator>Aaron Stanush</dc:creator>
 <guid isPermaLink="false">68 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Decorators and directories</title>
    <link>http://fourkitchens.com/blog/2008/09/27/decorators-directories</link>
    <description>&lt;p&gt;Nodes have evolved remarkably over Drupal&amp;#8217;s history. In Drupal 4.7, node types were typically created by modules that &amp;#8220;owned&amp;#8221; their node types. There was no way to create a node type without a module behind it. Modules creating node types would implement hook_node_info() and directly handle the the main loading, saving, and editing of the node type. Drupal core handled the loading and saving of the title and body. Modules doing this were effectively subclassing a pseudo-abstract node class (a class containing title and body only) in core and adding their own&amp;nbsp;fields.&lt;/p&gt;
&lt;p&gt;Drupal 4.7 was also the dawn of the Form &lt;span class="caps"&gt;API&lt;/span&gt; and its hook_form_alter(). Combined with the ability (beginning in Drupal 5) to create node types directly in core, the dominant pattern of node type development changed. The &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern" rel="nofollow"&gt;decorator pattern&lt;/a&gt; emerged as the preferred approach. This allowed multiple modules to simultaneously create fields on the same node&amp;nbsp;types.&lt;/p&gt;
&lt;p&gt;Using decorators with node types is&amp;nbsp;straightforward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create your node types using Drupal&amp;#8217;s content type administration&amp;nbsp;tool.&lt;/li&gt;
&lt;li&gt;Create a module that implements hook_form_alter() and hook_nodeapi() that adds fields to selected content&amp;nbsp;types.&lt;/li&gt;
&lt;li&gt;Configure the module to add its fields to the selected content&amp;nbsp;types.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even when it would be equally straightforward to have a module implement its own node type, implementing the fields with a decorator is superior because the approach maintains consistency. All fields are saved and loaded through hook_nodeapi(), and all form elements are defined through hook_form_alter(). No module has any special claim to particular node types. This approach should completely obsolete the implementation of hook_node_info() and other &amp;#8220;I own this node type&amp;#8221; hooks by&amp;nbsp;modules.&lt;/p&gt;
&lt;p&gt;But this model has some downsides, at least in&amp;nbsp;Drupal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When modules directly created node types, data tended to be better consolidated. Because we now prefer to decorate node types using the fields from multiple modules, data is more scattered. We&amp;#8217;re typically implementing each decorator as a table with a foreign key to nid and vid. This has massive performance&amp;nbsp;implications.&lt;/li&gt;
&lt;li&gt;Configuration for managing the mapping of decorators to node types is wildly inconsistent, and there&amp;#8217;s no way to see, globally, which decorators apply to which node&amp;nbsp;types.&lt;/li&gt;
&lt;li&gt;Managing interaction between decorators is inconsistent or absent. This interaction includes namespace conflicts on $node&amp;nbsp;objects.&lt;/li&gt;
&lt;li&gt;The node editing form and $node object are the only places where decorators all come together in a consistent way. This makes data importing and exporting nearly impossible without custom code for each module performing&amp;nbsp;decoration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fortunately, we don&amp;#8217;t have to solve this problem on our own. Systems like Sun&amp;#8217;s &lt;a href="http://www.opends.org/" rel="nofollow"&gt;OpenDS&lt;/a&gt; have sophisticated, well-reasoned data models that allow decorators to elegantly combine to form coherent, node-like objects. OpenDS discusses &lt;a href="https://opends.dev.java.net/public/docs/architecture/schema-design/index.html" rel="nofollow"&gt;its schema model&lt;/a&gt; on its wiki, and I&amp;#8217;ll use it as my&amp;nbsp;example.&lt;/p&gt;
&lt;p&gt;The OpenDS schema contains basic&amp;nbsp;layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attributes, which are&amp;nbsp;fields&lt;/li&gt;
&lt;li&gt;Abstract and structural classes, which contain&amp;nbsp;attributes&lt;/li&gt;
&lt;li&gt;Object classes, which are the set of classes assigned to an&amp;nbsp;object&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Objects (which are node-like) can be assigned multiple object classes, each of which functions like a decorator. The objects may contain values (often even multiple values) for the attributes provided by their object&amp;nbsp;classes.&lt;/p&gt;
&lt;p&gt;Drupal modules would create attributes and directory classes, and Drupal core would contain a unified interface for assigning the classes to node&amp;nbsp;types.&lt;/p&gt;
&lt;p&gt;What this gets&amp;nbsp;us:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Asynchronous multi-master replication support. Right now, node data is scattered all over the database, and there&amp;#8217;s no way to &amp;#8220;package&amp;#8221; it for coherent, asynchronous replication across multiple hosts without a &lt;span class="caps"&gt;PHP&lt;/span&gt;-level implementation. In OpenDS, objects are fundamentally understood and managed by the directory&amp;#8217;s data storage layer. It&amp;#8217;s easy for it to replicate whole&amp;nbsp;nodes.&lt;/li&gt;
&lt;li&gt;Similarly, this ability to &amp;#8220;package&amp;#8221; objects gives us importing and exporting for free. OpenDS can import and export &lt;span class="caps"&gt;LDIF&lt;/span&gt;-formatted data, and this would allow nodes to be transported to dissimilar systems, even different directory servers. You would simply need the same classes supported on the destination&amp;nbsp;system.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;packaged&amp;#8221; objects make sharding and partitioning data much&amp;nbsp;easier.&lt;/li&gt;
&lt;li&gt;We get tools like Apache Directory Studio that give a coherent object view, including the list of classes for each object. There&amp;#8217;s no way to view a node in MySQL without a painful number of&amp;nbsp;joins.&lt;/li&gt;
&lt;li&gt;Built-in protection against namespace collisions for&amp;nbsp;attributes.&lt;/li&gt;
&lt;li&gt;We get unified indexing across decorators. Because decorators currently store their data in multiple tables, we can&amp;#8217;t index, say, a city and the title for a node without denormalization. In OpenDS, you can create &lt;a href="https://www.opends.org/wiki/page/HowToIndexAttributes" rel="nofollow"&gt;&lt;span class="caps"&gt;VLV&lt;/span&gt; indexes that span any set of attributes&lt;/a&gt; and selectable subsets of nodes. It basically allows creation of a comprehensive index for anything configured in the Views module. The only comparable features in relational databases are indexed views in &lt;span class="caps"&gt;SQL&lt;/span&gt; Server and materialized views in Oracle. MySQL does not support such&amp;nbsp;indexes.&lt;/li&gt;
&lt;li&gt;We can change a field from being single-valued to multi-valued without a fundamental change in the way we access the&amp;nbsp;data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;ll be experimenting with using OpenDS as a node back-end in the upcoming weeks. It would be great to have a robust, multi-master, free/open-source node storage&amp;nbsp;system.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=GSAvRRmSWVA:UG_9Ie33uNs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=GSAvRRmSWVA:UG_9Ie33uNs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/09/27/decorators-directories#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/development/drupal-modules">Drupal Modules</category>
 <category domain="http://fourkitchens.com/tags/development/software-architecture">Software Architecture</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/open-source">Open Source</category>
 <category domain="http://fourkitchens.com/tags/software">Software</category>
 <pubDate>Sat, 27 Sep 2008 17:45:40 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">70 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>We've arrived in Szeged for Drupalcon</title>
    <link>http://fourkitchens.com/blog/2008/08/28/weve-arrived-szeged-drupalcon</link>
    <description>&lt;a href="http://www.flickr.com/photos/toddross/2805442572/" title="IMG_0918 by toddross, on Flickr"&gt;&lt;img class="aligncenter" src="http://farm4.static.flickr.com/3218/2805442572_3fbcc6c0c2.jpg" width="500" height="375" alt="IMG_0918" /&gt;&lt;/a&gt;

&lt;p&gt;After all flying into Europe on different days, we finally converged in Munich. From there we hopped trains to Vienna, Budapest, and finally Szeged. It&amp;#8217;s a beautiful city and its modest size is a welcome&amp;nbsp;change.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s more coverage to come, but for now check out David&amp;#8217;s sessions that he&amp;#8217;s presenting or&amp;nbsp;co-presenting:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://szeged2008.drupalcon.org/program/sessions/indexes-and-denormalization-keys-scaling-sites-massive-content"&gt;Indexes and denormalization: keys to scaling sites with massive&amp;nbsp;content&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://szeged2008.drupalcon.org/program/sessions/rdf-storage-back-ends"&gt;&lt;span class="caps"&gt;RDF&lt;/span&gt; storage&amp;nbsp;back-ends&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://szeged2008.drupalcon.org/program/sessions/performance-tuning-expert-panel"&gt;Performance tuning expert&amp;nbsp;panel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by Todd Ross&amp;nbsp;Nienkerk&lt;/em&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=fW7Vi6IlbW8:Od1iCVDDtQw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=fW7Vi6IlbW8:Od1iCVDDtQw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/08/28/weve-arrived-szeged-drupalcon#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Thu, 28 Aug 2008 04:03:16 -0500</pubDate>
 <dc:creator>Four Kitchens</dc:creator>
 <guid isPermaLink="false">65 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Four Kitchens merch is here</title>
    <link>http://fourkitchens.com/blog/2008/08/26/four-kitchens-merch-here</link>
    <description>&lt;img src="/sites/default/files/images/fourkitchens_drupalcon_merch_01.jpg" /&gt;

Just in time for &lt;a href="http://szeged2008.drupalcon.org"&gt;Drupalcon Szeged 2008&lt;/a&gt;, Four Kitchens has a few shirts and lots of stickers with our new logo to give away to our fellow Drupalers meeting up in Szeged.

We&amp;#8217;ll also be giving away some sweet Drupal stickers to put on your laptop, bike, dog, chair, or grandma. To get your hands on one, simply find us—before we find you.

&lt;em&gt;photo by Todd Ross&amp;nbsp;Nienkerk&lt;/em&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=FJ3CkEeLysM:9f7vurRYVKY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=FJ3CkEeLysM:9f7vurRYVKY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/08/26/four-kitchens-merch-here#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <pubDate>Tue, 26 Aug 2008 13:42:26 -0500</pubDate>
 <dc:creator>Four Kitchens</dc:creator>
 <guid isPermaLink="false">45 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Drupalcon Szeged 2008 track icons preview</title>
    <link>http://fourkitchens.com/blog/2008/07/30/drupalcon-szeged-2008-track-icons-preview</link>
    <description>&lt;img class="aligncenter" src="/sites/default/files/images/drupalcon-2008-icons-500px.png" alt="Drupalcon icons preview" /&gt;

&lt;p&gt;Four Kitchens is proud to supply the icons for the tracks of this years Drupalcon conference. The tracks&amp;nbsp;include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Drupal core&lt;/strong&gt; contributions and trends which will focus on Drupal 6 and 7, as well as killer and upcoming contributed modules with some spice added on trends we follow (like the semantic web&amp;nbsp;effort).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Showcases&lt;/strong&gt;, user experience and design will focus on the site builders, themers and those interested in delivering a killer user experience both for Drupal itself and for their own&amp;nbsp;sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code development&lt;/strong&gt; is our hardcore developer track on topics like simpletests, coding practices, scalability, deployment and so&amp;nbsp;on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Growing Drupal&lt;/strong&gt; will be our business and marketing oriented track with a good amount of local community building and focus on efforts such as the Knight Drupal Initiative, Google Summer of Code and&amp;nbsp;&lt;span class="caps"&gt;GHOP&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BoF (Birds of a Feather)&lt;/strong&gt; According to good tradition, Drupalcon will also have its full fledged (unmoderated) unconference in the form of&amp;nbsp;BoFs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the icons are finalized, we will make them freely available to the public under a &lt;a href="http://www.gnu.org/licenses/quick-guide-gplv3.html" title="GPL lecense"&gt;&lt;span class="caps"&gt;GPL&lt;/span&gt;&amp;nbsp;license&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And to our fellow Drupalers out there, if you&amp;#8217;re going to Szeged we&amp;#8217;ll see you&amp;nbsp;August!&lt;/p&gt;

&lt;p&gt;Find out more about &lt;a href="http://szeged2008.drupalcon.org" title="Drupalcon Szeged 2008"&gt;Drupalcon Szeged&amp;nbsp;2008&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=s6NFo8QPmOY:tLzJ213IM5U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=s6NFo8QPmOY:tLzJ213IM5U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/07/30/drupalcon-szeged-2008-track-icons-preview#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/tags/conferences/drupalcon">DrupalCon</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Wed, 30 Jul 2008 12:00:00 -0500</pubDate>
 <dc:creator>Aaron Stanush</dc:creator>
 <guid isPermaLink="false">38 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>BarCamp Austin 3 is this Saturday</title>
    <link>http://fourkitchens.com/blog/2008/03/04/barcamp-austin-3-saturday</link>
    <description>&lt;p&gt;&lt;img class="floatright" src="/sites/default/files/images/bca3_banner_180x150_special.png" alt="BarCamp Austin 3" /&gt;Four Kitchens is proud to help organize this year&amp;#8217;s &lt;a href="http://barcampaustin.org"&gt;BarCamp Austin&lt;/a&gt; alongside our good friend &lt;a href="http://whurley.com"&gt;Whurley&lt;/a&gt; and our new friend &lt;a href="http://www.richardgoodwin.com/"&gt;Richard Goodwin&lt;/a&gt;. If you&amp;#8217;re going to be in Austin this weekend (either because you live here or you&amp;#8217;ll be in town for &lt;span class="caps"&gt;SXSW&lt;/span&gt;) be sure to stop by &lt;a href="http://ideacity.com"&gt;&lt;span class="caps"&gt;GSD&lt;/span&gt;&amp;amp;M Idea City&lt;/a&gt; anytime on Saturday, March 8th.

This year is going to be bigger and better with a lot more room for demos, presentations, and killer robots. This event is free, open to the public, and everyone is invited to participate!

More info at&amp;nbsp;&lt;a href="http://barcampaustin.org"&gt;barcampaustin.org&lt;/a&gt;.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=1DWfeXG-UZE:NqPj8wD_1Cg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=1DWfeXG-UZE:NqPj8wD_1Cg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/03/04/barcamp-austin-3-saturday#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <pubDate>Tue, 04 Mar 2008 12:00:00 -0500</pubDate>
 <dc:creator>Aaron Stanush</dc:creator>
 <guid isPermaLink="false">36 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Drupal 6.0 released!</title>
    <link>http://fourkitchens.com/blog/2008/02/13/drupal-60-released</link>
    <description>&lt;img class="floatright" src="/sites/default/files/images/drupal-birthday-v6.png" alt="Drupal 6 Birthday" /&gt;

&lt;p&gt;Here&amp;#8217;s a few of the new&amp;nbsp;features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag-and-drop&amp;nbsp;administration&lt;/li&gt;
&lt;li&gt;OpenID&amp;nbsp;support&lt;/li&gt;
&lt;li&gt;Update status for core, modules, and&amp;nbsp;themes&lt;/li&gt;
&lt;li&gt;Theme developer&amp;nbsp;module&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be sure to check out the &lt;a href="http://drupal.org/drupal-6.0"&gt;full list of features&lt;/a&gt; and when you&amp;#8217;re finished drooling, &lt;a href="http://ftp.osuosl.org/pub/drupal/files/projects/drupal-6.0.tar.gz"&gt;go download&amp;nbsp;it!&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=lQnBSTT3tb8:ZLyh5Eop9no:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=lQnBSTT3tb8:ZLyh5Eop9no:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/02/13/drupal-60-released#comments</comments>
 <category domain="http://fourkitchens.com/authors/aaron-stanush">Aaron Stanush</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <pubDate>Wed, 13 Feb 2008 12:00:00 -0500</pubDate>
 <dc:creator>Aaron Stanush</dc:creator>
 <guid isPermaLink="false">34 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Who is the best candidate for the open source community?</title>
    <link>http://fourkitchens.com/blog/2008/02/07/who-best-candidate-open-source-community</link>
    <description>&lt;style&gt;div.pds-box {margin: 0 auto;}&lt;/style&gt;
&lt;a href="http://talk.bmc.com/blogs/blog-whurley/whurley/who-is-best-for-open-source-in-2008"&gt;whurley at &lt;span class="caps"&gt;BMC&lt;/span&gt; has posed an interesting question&lt;/a&gt;: Do the candidates have an opinion on open source software? Are they even aware of it? And if not, shouldn&amp;#8217;t they be?

So whurley created a poll to find out who we, the open source community, feel best represents our common interests. (Yes, &amp;#8220;None of them&amp;#8221; is an option!)

&lt;blockquote&gt;Assume for a moment that a knowledge of open source is prerequisite (or integral) in solving issues like patent reform. Who would you vote for? In other words, who would be the best candidate for the open source community?&lt;/blockquote&gt;

Please vote! The more buzz we can build, the better chance we have to educate our elected representatives on the important, complicated, and philosophical questions surround open source, free culture, intellectual property.

&lt;p&gt;
&lt;script type="text/javascript" language="javascript" src="http://s3.polldaddy.com/p/290674.js"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href ="http://www.polldaddy.com/p/290674/" &gt;Take Our Poll&lt;/a&gt;&lt;/noscript&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=xJflNQyKX3g:FHRT4vI2Bh8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=xJflNQyKX3g:FHRT4vI2Bh8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/02/07/who-best-candidate-open-source-community#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <pubDate>Thu, 07 Feb 2008 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">32 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Relaunching GetOpenID.com using a server-side Drupal module</title>
    <link>http://fourkitchens.com/blog/2008/02/07/relaunching-getopenidcom-using-server-side-drupal-module</link>
    <description>&lt;h3&gt;OpenID is blowing&amp;nbsp;up!&lt;/h3&gt;

&lt;p&gt;This morning, the &lt;a href="http://openid.net/2008/02/07/evolving-the-openid-foundation-board/"&gt;OpenID Foundation announced that Google, &lt;span class="caps"&gt;IBM&lt;/span&gt;, Microsoft, VeriSign, and Yahoo! have joined as its first corporate board members&lt;/a&gt;. But don&amp;#8217;t worry: &lt;a href="http://openid.net/"&gt;OpenID.net&lt;/a&gt; was quick to note that the members are not&amp;nbsp;decision-makers:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;While the OpenID Foundation serves a stewardship role around the community’s intellectual property, the Foundation&amp;#8217;s board itself &lt;strong&gt;does not&lt;/strong&gt; make any decisions about the specifications the community is collaboratively building. &lt;em&gt;(Emphasis&amp;nbsp;theirs.)&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;a href="http://getopenid.com/"&gt;&lt;img id="image13" src="/sites/default/files/images/logo-getopenid.gif" alt="GetOpenID logo" align="right" /&gt;

&lt;p&gt;&lt;/p&gt;&lt;/a&gt;Well, we have an announcement of our own: We&amp;#8217;re completely overhauling our OpenID registrar &lt;a href="http://getopenid.com/"&gt;GetOpenID.com&lt;/a&gt; and expect to re-launch the site sometime in April 2008 &amp;mdash; and we&amp;#8217;ll do it on &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt;!

&lt;p&gt;OpenID support for Drupal 5.x and 6.x is currently limited to clients. We plan to build a module to enable server-side support, allowing any Drupal site to become an OpenID registrar. The module will be released to the Drupal community under the&amp;nbsp;&lt;a href="http://www.gnu.org/copyleft/gpl.html"&gt;&lt;span class="caps"&gt;GPL&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Viva free software and open&amp;nbsp;standards!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=EYp7QQRMs0s:xnqsoRrRMx8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=EYp7QQRMs0s:xnqsoRrRMx8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2008/02/07/relaunching-getopenidcom-using-server-side-drupal-module#comments</comments>
 <category domain="http://fourkitchens.com/tags/development/drupal-modules">Drupal Modules</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/openid">OpenID</category>
 <pubDate>Thu, 07 Feb 2008 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">31 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Four Kitchens' new office open for business</title>
    <link>http://fourkitchens.com/blog/2007/05/18/four-kitchens-new-office-open-business</link>
    <description>&lt;p&gt;Four Kitchen Studios and &lt;em&gt;That Other Paper&lt;/em&gt; have relocated to a new facility in North Austin at 183 and MoPac. Here are some pictures of the work in progress courtesy of Kristin (or can &lt;a href="http://www.flickr.com/photos/kristinh/sets/72157600212425993/"&gt;view the entire Flickr&amp;nbsp;set&lt;/a&gt;):&lt;/p&gt;

&lt;div class="imgcaption"  style="width: 510px;"&gt;&lt;img src="/sites/default/files/images/newoffice01.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;An empty, soulless office&amp;nbsp;pre-painting&lt;/p&gt;&lt;/div&gt;

&lt;div class="imgcaption"  style="width: 510px;"&gt;&lt;img src="/sites/default/files/images/newoffice02.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;Albert, Tim, and I discuss the finer points of laying drop&amp;nbsp;cloths&lt;/p&gt;&lt;/div&gt;

&lt;div class="imgcaption"  style="width: 343px;"&gt;&lt;img src="/sites/default/files/images/newoffice03.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;Christine, Stephen, and Chad paint a wall green &amp;mdash; the color of&amp;nbsp;&lt;span class="caps"&gt;MONEY&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;

&lt;div class="imgcaption"  style="width: 510px;"&gt;&lt;img src="h/sites/default/files/images/newoffice04.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;Christine and Stephen pretend to like each other long enough to make a meaningful contribution to the greater&amp;nbsp;good&lt;/p&gt;&lt;/div&gt;

&lt;div class="imgcaption"  style="width: 510px;"&gt;&lt;img src="/sites/default/files/images/newoffice05.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;An action shot of the paint&amp;nbsp;drying&lt;/p&gt;&lt;/div&gt;

&lt;div class="imgcaption"  style="width: 510px;"&gt;&lt;img src="/sites/default/files/images/newoffice06.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;Excelsior!&lt;/p&gt;&lt;/div&gt;

&lt;div class="imgcaption"  style="width: 510px;"&gt;&lt;img src="/sites/default/files/images/newoffice07.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;David and I contemplate the sublime nature of Swedish office&amp;nbsp;furnishings&lt;/p&gt;&lt;/div&gt;

&lt;div class="imgcaption"  style="width: 510px;"&gt;&lt;img src="/sites/default/files/images/newoffice08.jpg" alt="Four Kitchen's new office" /&gt;&lt;p&gt;That&amp;#8217;s me. I&amp;#8217;m&amp;nbsp;working.&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=Zb81VTKcIhI:t_2mood9LoM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=Zb81VTKcIhI:t_2mood9LoM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2007/05/18/four-kitchens-new-office-open-business#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <pubDate>Fri, 18 May 2007 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">29 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Four Kitchens builds Wikimedia's new fundraising system</title>
    <link>http://fourkitchens.com/blog/2006/12/19/four-kitchens-builds-wikimedias-new-fundraising-system</link>
    <description>&lt;p&gt;What do you do when you&amp;#8217;re one of the world&amp;#8217;s top-ten websites, and you support 50 languages, 30 currencies, and four payment systems? And you have, at any given time, about 700 users hitting &amp;#8220;reload&amp;#8221; to find out up-to-the-minute results of worldwide contributions.  You also need a meter to show progress on a site that serves &lt;a href="http://hemlock.knams.wikimedia.org/~leon/stats/reqstats/reqstats-daily.png" rel="nofollow" rel="nofollow"&gt;20,000 requests &lt;em&gt;per&amp;nbsp;second&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;re &lt;a href="http://wikimediafoundation.org/" rel="nofollow" rel="nofollow"&gt;Wikimedia&lt;/a&gt;, the charity behind&amp;nbsp;&lt;a href="http://wikipedia.org/" rel="nofollow" rel="nofollow"&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In collaboration with Wikimedia&amp;#8217;s technical staff and its community, Four Kitchens has built an integrated system to meet these demands. It&amp;#8217;s called &lt;a href="http://fundraising.wikimedia.org/" rel="nofollow"&gt;Fundraising &lt;span class="caps"&gt;C.O.R.E.&lt;/span&gt;&lt;/a&gt; (Central Online Reporting&amp;nbsp;Engine).&lt;/p&gt;
&lt;p&gt;Fundraising &lt;span class="caps"&gt;C.O.R.E.&lt;/span&gt; is built with &lt;a href="http://drupal.org/" rel="nofollow" rel="nofollow"&gt;Drupal&lt;/a&gt;. It uses the Drupal modules &lt;a href="http://civicrm.org/" rel="nofollow" rel="nofollow"&gt;CiviCRM&lt;/a&gt;, i18n, and a custom module built just for this project. The custom Fundraising &lt;span class="caps"&gt;C.O.R.E.&lt;/span&gt; module integrates with CiviContribute&amp;#8217;s fundraising management system to display privacy-conscious real-time data to community&amp;nbsp;members.&lt;/p&gt;
&lt;p&gt;With hundreds of contributions coming in every few hours, the small staff at Wikimedia doesn&amp;#8217;t have the time to enter them all. For that Fundraising &lt;span class="caps"&gt;C.O.R.E.&lt;/span&gt; integrates with the instant notification features of &lt;a href="http://paypal.com/" rel="nofollow" rel="nofollow"&gt;PayPal&lt;/a&gt; and &lt;a href="http://moneybookers.com/" rel="nofollow" rel="nofollow"&gt;Moneybookers&lt;/a&gt;. In case anything gets lost between the payment processer and the fundraising system, Fundraising &lt;span class="caps"&gt;C.O.R.E.&lt;/span&gt; provides the ability to synchronize downloads of&amp;nbsp;records.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=PyZvJxiY4r8:Zj3b2Fo7B5M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=PyZvJxiY4r8:Zj3b2Fo7B5M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/12/19/four-kitchens-builds-wikimedias-new-fundraising-system#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/case-studies">Case Studies</category>
 <category domain="http://fourkitchens.com/tags/civicrm">CiviCRM</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/scalability">Scalability</category>
 <pubDate>Tue, 19 Dec 2006 13:00:00 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">28 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>SANE: Scanner drivers for MacOS X</title>
    <link>http://fourkitchens.com/blog/2006/12/06/sane-scanner-drivers-macos-x</link>
    <description>If you use an old &lt;span class="caps"&gt;USB&lt;/span&gt; scanner with a Mac, you&amp;#8217;re probably unhappy with the out-of-date drivers offered by the manufacturer. (Chances are it runs in the &amp;#8220;Classic&amp;#8221; interface, famously replete with Chicago typeface.) Luckily, the opensource community is developing a solution: the &lt;a href="http://www.ellert.se/twain-sane/"&gt;&lt;span class="caps"&gt;TWAIN&lt;/span&gt; &lt;abbr title="Scanner Access Now Easy"&gt;&lt;span class="caps"&gt;SANE&lt;/span&gt;&lt;/abbr&gt; interface for MacOS X&lt;/a&gt;.

&lt;a href="http://www.sane-project.org/"&gt;&lt;img id="image45" class="floatright" src="/sites/default/files/images/sane_logo.gif" alt="SANE logo" /&gt;&lt;/a&gt;&amp;#8220;&lt;span class="caps"&gt;SANE&lt;/span&gt;&amp;#8221; stands for&amp;#8221;Scanner Access Now Easy.&amp;#8221; (Looks like someone put the acronym before the horse, if you catch my meaning.) I&amp;#8217;ve installed it myself, and it works well enough. I have two major gripes, however: (1) the preview image does not automatically update as I adjust contrast and gamma, requiring me to sit through a &amp;#8220;Preview&amp;#8221; each time I nudge the settings; and (2) the gamma table interface is so geeked out that it displays the &lt;em&gt;mathematical formulas&lt;/em&gt; of the curves instead of a human-readable legend.

Here&amp;#8217;s a quick installation guide:
&lt;ol&gt;
&lt;li&gt;download and install&amp;nbsp;&lt;code&gt;&amp;lt;strong&amp;gt;libusb&amp;lt;/strong&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;after installation, &lt;code&gt;&amp;lt;strong&amp;gt;libusb&amp;lt;/strong&amp;gt;&lt;/code&gt; will unpack &lt;code&gt;&amp;lt;strong&amp;gt;sane-backends.pkg&amp;lt;/strong&amp;gt;&lt;/code&gt;; install&amp;nbsp;it&lt;/li&gt;
&lt;li&gt;install &lt;code&gt;&amp;lt;strong&amp;gt;TWAIN SANE&amp;nbsp;Interface&amp;lt;/strong&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span class="caps"&gt;SANE&lt;/span&gt; should now appear in whatever program you normally use to scan your junk. In Photoshop, you can find it under &lt;code&gt;File &amp;amp;raquo; Import &amp;amp;raquo;&amp;nbsp;&amp;lt;strong&amp;gt;SANE...&amp;lt;/strong&amp;gt;&lt;/code&gt;.&lt;/p&gt;

Read more about &lt;abbr title="Scanner Access Now Easy"&gt;&lt;span class="caps"&gt;SANE&lt;/span&gt;&lt;/abbr&gt; project&amp;nbsp;&lt;a href="http://www.sane-project.org/"&gt;&lt;span class="caps"&gt;SANE&lt;/span&gt;-project.org&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=I2nTGcyjXbA:HboKcrr1qfM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=I2nTGcyjXbA:HboKcrr1qfM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/12/06/sane-scanner-drivers-macos-x#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/software/mac-os">Mac OS</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <pubDate>Wed, 06 Dec 2006 13:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">19 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>That Other Paper (Austin’s ONLY Paper) launches!</title>
    <link>http://fourkitchens.com/blog/2006/12/03/other-paper-austin-s-only-paper-launches</link>
    <description>&lt;p&gt;&lt;strong&gt;Four Kitchen Studios is proud to announce the launch of &lt;em&gt;&lt;a href="http://www.thatotherpaper.com/" title="Austin's ONLY Paper"&gt;That Other Paper&lt;/a&gt;&lt;/em&gt; &amp;mdash; Austin&amp;#8217;s &lt;span class="caps"&gt;FIRST&lt;/span&gt; and &lt;span class="caps"&gt;ONLY&lt;/span&gt;&amp;nbsp;publication!&lt;/strong&gt;&lt;/p&gt;
&lt;div class="imgcaption"&gt;&lt;a href="http://www.thatotherpaper.com/"&gt;&lt;img id="image43" src="/sites/default/files/images/toplaunch.png" alt="That Other Paper | Austin's ONLY Paper" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;lt;!&amp;#8212;break&amp;#8212;&gt;&lt;br /&gt;
From our &lt;a href="http://www.thatotherpaper.com/austin/declaration_of_principles"&gt;Declaration of&amp;nbsp;Principles&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;We will do our best never to bore our&amp;nbsp;readers&lt;/h3&gt;
&lt;p&gt;Years of publishing experience have taught us a simple lesson that seems to evade most writers and editors: Readers have extremely short attention spans. What&amp;#8217;s the value of a 10,000-word expos&amp;eacute; on the backroom dealings of Senator McJerk if the reader is stifling yawns by the fifth&amp;nbsp;paragr&amp;mdash;&lt;/p&gt;
&lt;p&gt;Oh, too late. She already turned the&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;We will infuse everything we do with a sense of humor. Every article, review, and blurb will tell a story. And we&amp;#8217;ll always keep it&amp;nbsp;short.&lt;/p&gt;
&lt;h3&gt;We will cover all forms of entertainment &amp;mdash; not just&amp;nbsp;music&lt;/h3&gt;
&lt;p&gt;Austin may be called the &amp;#8220;Live Music Capital of the World,&amp;#8221; but that doesn&amp;#8217;t mean music is the only entertainment in town. Most notably, Austin has a vibrant live comedy scene on the cusp of national&amp;nbsp;recognition.&lt;/p&gt;
&lt;h3&gt;Our restaurant reviews will be written with the average Austinite in&amp;nbsp;mind&lt;/h3&gt;
&lt;p&gt;You aren&amp;#8217;t rich, and neither are we. Most of us don&amp;#8217;t have the cash to blow on so-called &amp;#8220;fine dining.&amp;#8221; So why waste your time reading pretentious reviews of stuff you can&amp;#8217;t&amp;nbsp;afford?&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re gonna do things differently. If we can&amp;#8217;t afford it, we won&amp;#8217;t review it. Value &amp;mdash; the quality of food and service we get for our money &amp;mdash; will be paramount. And though we have a broad palette, we&amp;#8217;ll deliver our reviews with a plain tongue. If the &lt;span class="caps"&gt;BBQ&lt;/span&gt; kicks ass, we&amp;#8217;ll say&amp;nbsp;so.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll dig deeper, too. We&amp;#8217;ll publish restaurants&amp;#8217; health inspection scores and interview the staff regarding the management&amp;#8217;s treatment of its employees. (Prepare to be shocked at the state of Austin&amp;#8217;s&amp;nbsp;kitchens.)&lt;/p&gt;
&lt;h3&gt;Above all, we will serve you, the citizens of&amp;nbsp;Austin&lt;/h3&gt;
&lt;p&gt;This is for you, Austin. You&amp;#8217;ve educated, employed, and entertained us. Now it&amp;#8217;s time we gave something back, and we know nothing better than&amp;nbsp;entertainment.
&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=fXBz_3333R8:R4vELjelQkM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=fXBz_3333R8:R4vELjelQkM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/12/03/other-paper-austin-s-only-paper-launches#comments</comments>
 <category domain="http://fourkitchens.com/tags/austin">Austin</category>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/design">Design</category>
 <category domain="http://fourkitchens.com/tags/drupal">Drupal</category>
 <category domain="http://fourkitchens.com/tags/press-releases">Press Releases</category>
 <category domain="http://fourkitchens.com/tags/projects">Projects</category>
 <pubDate>Sun, 03 Dec 2006 13:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">17 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Beware StockApplets.com!</title>
    <link>http://fourkitchens.com/blog/2006/10/02/beware-stockappletscom</link>
    <description>Recently, one of our clients wanted to install a stock ticker on her company&amp;#8217;s website. It was a simple request; the only difficulty lay in finding a data feed of stock prices. After several hours of research, we found StockApplets.com, an online purveyor of Java-based stock ticker functions. We plunked down $50 and purchased an applet. Unfortunately, it didn&amp;#8217;t work. Why? Because StockApplets.com doesn&amp;#8217;t provide a data feed.

We requested a refund. This was their reply:
&lt;blockquote&gt;
Dear Sir

Can you please let me know where we state that we are selling content?
&lt;/blockquote&gt;

Sarcasm. That&amp;#8217;s a good sign, right? I asked about the status of the refund. They replied:

&lt;blockquote&gt;
Dear Sir

Your refund request is not accepted because the reason you are mentioning is not real. We are not stating anywhere on our site that we are selling content.

For more details, please read our order page: [link removed]
&lt;/blockquote&gt;

I visited their order page. Since we had purchased the applet, StockApplets.com had revamped their website and added this disclaimer: &lt;em&gt;[&amp;#8230; P]lease note price does not include any data source, we only sell software, not data.&lt;/em&gt; In other words, if you&amp;#8217;re hungry, they&amp;#8217;ll sell you an empty box. But it&amp;#8217;s your job to fill it with Lucky Charms.

&lt;em&gt;What inexplicable timing!&lt;/em&gt; I thought. I certainly didn&amp;#8217;t remember seeing anything like that beforehand. I replied:
&lt;blockquote class="darkblue"&gt;
Why would you sell a product whose purpose is to deliver content, then refuse to deliver the content?

Refund my purchase, or I will contact my credit card company and dispute the charge.
&lt;/blockquote&gt;

What&amp;#8217;s the first rule of doing business? &lt;em&gt;Tell the customer he made a mistake by purchasing your product!&lt;/em&gt; Their reply:

&lt;blockquote&gt;
When you buy a car, do you expect the car company to offer you free gas? It is the same logic here. We state everywhere on our site that we are not data providers and we only sell tools.

Please pay atention next time you make a purchase, we are not stupid nor full of money to pay for your &lt;strong&gt;mistakes&lt;/strong&gt;. We are working very hard to develop tools and  to sell them to make a living, and &lt;strong&gt;your complains are very ofending to our efforts.&lt;/strong&gt;
&lt;/blockquote&gt;

The second rule of doing business is, of course, to tell the customer that his legitimate problems with your service are &amp;#8220;offensive&amp;#8221; to your efforts. After all, a company&amp;#8217;s products should be met with unconditional support, right? &lt;span class="caps"&gt;HOW&lt;/span&gt; &lt;span class="caps"&gt;DARE&lt;/span&gt; &lt;span class="caps"&gt;YOU&lt;/span&gt; &lt;span class="caps"&gt;SAY&lt;/span&gt; &lt;span class="caps"&gt;OUR&lt;/span&gt; &lt;span class="caps"&gt;PRODUCT&lt;/span&gt; &lt;span class="caps"&gt;DOESN&lt;/span&gt;&amp;#8217;T &lt;span class="caps"&gt;MEET&lt;/span&gt; &lt;span class="caps"&gt;YOUR&lt;/span&gt; &lt;span class="caps"&gt;NEEDS&lt;/span&gt;! &lt;span class="caps"&gt;WE&lt;/span&gt; &lt;span class="caps"&gt;WORKED&lt;/span&gt; &lt;span class="caps"&gt;HARD&lt;/span&gt; &lt;span class="caps"&gt;ON&lt;/span&gt; &lt;span class="caps"&gt;IT&lt;/span&gt;, &lt;span class="caps"&gt;AND&lt;/span&gt; &lt;span class="caps"&gt;YOU&lt;/span&gt; &lt;span class="caps"&gt;WILL&lt;/span&gt; &lt;span class="caps"&gt;LIKE&lt;/span&gt; &lt;span class="caps"&gt;IT&lt;/span&gt;!

I decided they needed some good advice:
&lt;blockquote class="darkblue"&gt;
What&amp;#8217;s offensive is your complete lack of concern for your customers&amp;#8217; satisfaction. The product you offered doesn&amp;#8217;t meet our needs. We&amp;#8217;re not using it, and we don&amp;#8217;t intend to pay for it. You&amp;#8217;ll have to deal with the credit card companies now.

Is this really how you intend to operate your business? By making your customers angry and refusing to issue a refund for something that doesn&amp;#8217;t meet their needs? This will be a very expensive fifty dollars.
&lt;/blockquote&gt;

That pretty much sealed the deal&amp;mdash;or so I thought. I contacted our bank and requested a chargeback. A few minutes later, I received one of the most melodramatic, logically flawed emails in human history:

&lt;blockquote&gt;
I asked Shareit to send you refund. I also think this might be a refund it will be very hard to bear for you. &lt;strong&gt;It bears all our work and hopes for a peaceful and better world for everyone that you distroyed.&lt;/strong&gt;

&lt;strong&gt;Because of you we decided to stop selling this product and we will probably stop selling all our stock based products.&lt;/strong&gt;
&lt;/blockquote&gt;

I&amp;#8217;m not making that up. According to StockApplets.com, I &amp;#8220;distroyed&amp;#8221; (sic) &amp;#8220;all [their] work and hopes for a peaceful and better world for everyone&amp;#8221;. And if I&amp;#8217;m to blame for StockApplets.com shutting down&amp;mdash;the obvious implication of that last line&amp;mdash;then I&amp;#8217;ve done the world a favor, and I should be greeted as a hero. Statues should be commissioned in my honor.


Beware StockApplets.com. If you &lt;em&gt;do&lt;/em&gt; purchase a stock ticker from them, you&amp;#8217;ll need to supply your own stock data feed as well as your own programmer to write the code that can pull quotes from the web, scrape the data, and hand it to the applet for display. And by that point, you&amp;#8217;re better off simply writing your own ticker.

If that sounds like too much work, consider this: it&amp;#8217;s better the burden of &amp;#8220;destroying their work and hopes for a peaceful and better world for everyone&amp;#8221;!
&lt;hr /&gt;
&lt;ins datetime="2006-10-02T16:06:57+00:00"&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;: I&amp;#8217;ve found proof that StockApplets.com did indeed market their product as offering a data feed. From &lt;a href="http://freshmeat.net/projects/stock-quotes-monitor-applet/"&gt;their freshmeat.net page&lt;/a&gt;:

&lt;blockquote&gt;
The financial market data is transferred to the applet using an &lt;span class="caps"&gt;HTTP&lt;/span&gt; client-pull connection. &lt;span class="caps"&gt;PHP&lt;/span&gt; and &lt;span class="caps"&gt;ASP&lt;/span&gt; scripts are provided that feed the applet with data from the Yahoo! Financial section. The data connection works without the need to modify proxy servers or firewalls.
&lt;/blockquote&gt;
&lt;p&gt;Sounds like they used to support a data feed, doesn&amp;#8217;t&amp;nbsp;it?
&lt;/p&gt;&lt;/ins&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=xuW1RVz0d5w:gTA2voIoXo0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=xuW1RVz0d5w:gTA2voIoXo0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/10/02/beware-stockappletscom#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <category domain="http://fourkitchens.com/tags/rants">Rants</category>
 <pubDate>Mon, 02 Oct 2006 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">15 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>'Alcalde' article highlights Four Kitchens' approach to creativity and publishing</title>
    <link>http://fourkitchens.com/blog/2006/08/29/alcalde-article-highlights-four-kitchens-approach-creativity-publishing</link>
    <description>&lt;div class="imgcaption" style="float: right; margin: 0 0 10px 10px;"&gt;
&lt;p&gt;&lt;a id="p33" href="/sites/default/files/fourkitchens_alcalde.pdf"&gt;&lt;img id="image35" src="/sites/default/files/images/alcalde_article_small.jpg" alt="Original Thought scan (small)" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Original Thought&amp;#8221;&lt;br /&gt;by &lt;em&gt;Alcalde&lt;/em&gt; assistant editor Tim&amp;nbsp;Taliaferro&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;ins datetime="2006-08-31T19:25:15+00:00"&gt;Update: With Alcalde&amp;#8217;s permission, I&amp;#8217;ve posted the entire text of the article.&lt;/ins&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.texasexes.org/news/alcalde.asp"&gt;&lt;em&gt;Alcalde&lt;/em&gt;&lt;/a&gt;, &lt;abbr title="University of Texas at Austin"&gt;&lt;span class="caps"&gt;UT&lt;/span&gt;-Austin&lt;/abbr&gt;&amp;#8217;s alumni magazine, interviewed me about the formation of our company and our approach to working creatively. Wonderfully assembled by assistant editor Tim Taliaferro, the article explains Four Kitchens&amp;#8217; conception and philosophy (and why we&amp;#8217;ll never again work a desk job!). Here&amp;#8217;s a scan of the full article in &lt;span class="caps"&gt;PDF&lt;/span&gt; format: &lt;a id="p33" href="http://blog.fourkitchens.com/wp-content/uploads/2006/08/fourkitchens_alcalde.pdf"&gt;download &amp;#8220;Original Thought&amp;#8221; by Tim&amp;nbsp;Taliaferro&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tim did a great job assembling my meandering, self-indulgent ramblings into something approaching coherence. Here&amp;#8217;s the full text, added August 30,&amp;nbsp;2006:&lt;/p&gt;
&amp;lt;!&amp;#8212;break&amp;#8212;&gt;
&lt;hr /&gt;

&lt;h2&gt;Original Thought:&lt;br /&gt;
Four Kitchen Studios Offers Creativity&amp;nbsp;Consulting&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Todd Nienkerk lasted exactly one year and one day in the world of cubicles, staff meetings, and pressed khaki pants. Stifled by the doldrums of an 8-to-5er, he co-founded Four Kitchen Studios, a &amp;#8220;creative collective&amp;#8221; that does &amp;#8220;anything and everything involving creativity and publishing.&amp;#8221; He and his comrades are creativity consultants, hired guns sought for their technical skill and restless imaginations. They&amp;#8217;ll spruce up your Web page, brighten your documents, and come up with that type of clever radio or &lt;span class="caps"&gt;TV&lt;/span&gt; ad that always makes people wonder, &amp;#8220;Who thinks of this stuff?&amp;#8221;&lt;/em&gt; &lt;span id="more-31"&gt;&lt;/span&gt; &lt;em&gt;Four Kitchen Studios operates as a hub for quirky people with specific skill sets, a one-stop shop for companies desperately in need of talent. Between the four founding members there&amp;#8217;s a freelance writer, a computer scientist/political campaigner, a cartoonist, and a graphic designer/Webmaster/writer. Then there&amp;#8217;s the talent pool — a small army of freelance writers, editors, designers, comics, ninjas, and artists with other full-time jobs but whom the founders can call on when a project requires their&amp;nbsp;expertise.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Their collective inspiration for the company came from working on the &lt;a class="rom" href="http://texastravesty.com/"&gt;Texas Travesty&lt;/a&gt;, &lt;span class="caps"&gt;UT&lt;/span&gt;&amp;#8217;s humor magazine. The four met there as students and decided, over the many, many late nights they worked together, that it was basically what they wanted to do for the rest of their lives — have this sort of creative freedom and apply it toward something profitable, something that will pay the bills while they do the fun&amp;nbsp;stuff.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s in a Name&lt;/strong&gt;&lt;br /&gt;
Our first client was this guy out in Bastrop who had built a nine-bedroom, four-kitchen house in the middle of the woods. It was like, &amp;#8220;Eccentric old man builds Ewok village.&amp;#8221; That&amp;#8217;s what this place looked like. Yet he left the place wide open, and no one had ever lived there. So the place was infested with mud daubers and all kinds of nasty little vermin. We were trying to strike a deal with this guy where we would do some Web design for him in return for free rent, and it turned into a really bad business deal. A &lt;em&gt;really&lt;/em&gt; bad business deal. But we kept the name because it&amp;#8217;s snappy. Mostly, 99 percent, it&amp;#8217;s a catchy title for a company, and we really like it. One percent is: vet your clients, do a little bit of research, and don&amp;#8217;t let them entice you with lame-brain schemes of &amp;#8220;you can live in my house and do Web&amp;nbsp;design.&amp;#8221;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collective Consciousness&lt;/strong&gt;&lt;br /&gt;
If one person sits down and does something, it can usually be pretty good. But if that person is constantly getting feedback from other people who know what they&amp;#8217;re talking about, it&amp;#8217;s going to be excellent. And that&amp;#8217;s a big part of what we&amp;#8217;re trying to do. We&amp;#8217;re drawing from that entire talent pool. Everyone there has a really good design aesthetic. They may not be able to do what needs to be done because they don&amp;#8217;t know the software or they don&amp;#8217;t know the technique. But they&amp;#8217;ll know it when they see it. I trust everybody there to give me really good feedback. And if they don&amp;#8217;t like something, they just say it. There&amp;#8217;s none of this political couching. The way we approach it is, if something isn&amp;#8217;t good, speak up now and be brutal. And if you can&amp;#8217;t take it, you shouldn&amp;#8217;t be&amp;nbsp;here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motto&lt;/strong&gt;&lt;br /&gt;
We don&amp;#8217;t waste our time with figuring out what other people charge or how other companies go about doing their business. The motto that we&amp;#8217;re all sort of investing in is: do what you love, and the money will follow. And so far, we haven&amp;#8217;t had any trouble finding work. It just falls into our lap, left and right. I think it&amp;#8217;s because people pick up on this vibe that we have as a company, that we&amp;#8217;re all just bristling to do creative&amp;nbsp;stuff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Business&lt;/strong&gt;&lt;br /&gt;
The importance of having an office with a lounge with sofas and receptionists and stuff like that is increasingly unimportant. However, I hope that we get to the point very quickly that we will have an office downtown with a receptionist and a waiting area, because when you reach that point, you&amp;#8217;re a firm. For the time being, we are operating out of our apartment, and we do that to save a lot of money and, as a result, we can charge people a lot less. So I would say that the Web has almost eliminated the barrier to entry for a lot of creative and entrepreneurial types like myself and the people I&amp;#8217;m working&amp;nbsp;with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-Year Goal&lt;/strong&gt;&lt;br /&gt;
Boy, I&amp;#8217;m barely thinking two months from&amp;nbsp;now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two-Month Goal&lt;/strong&gt;&lt;br /&gt;
Doing pretty well. Self-sufficient. I guess a year from now I would like to see us in an office with creative space. My real inspiration as far as proof that this can be done is &lt;span class="caps"&gt;GSD&lt;/span&gt;&amp;amp;M. Either G, S, D, or M — I don&amp;#8217;t know which one — spoke at my commencement ceremony when I graduated a year ago, and he just struck me as such a cool guy. [It was S — Roy Spence, &lt;span class="caps"&gt;BS&lt;/span&gt; &amp;#8216;71.-Ed] And I was already sort of in awe of &lt;span class="caps"&gt;GSD&lt;/span&gt;&amp;amp;M and the fact that they were all recent &lt;span class="caps"&gt;UT&lt;/span&gt; grads who said, &amp;#8220;You know what, we don&amp;#8217;t want to work for anybody; let&amp;#8217;s start our own company.&amp;#8221; And against all odds, they did it. I very much see ourselves doing exactly that, but in a slightly different realm. They&amp;#8217;re doing advertising, and we&amp;#8217;re going to be doing publishing. I would like to turn our company into the &lt;span class="caps"&gt;GSD&lt;/span&gt;&amp;amp;M of the publishing&amp;nbsp;business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No More Khakis&lt;/strong&gt;&lt;br /&gt;
I love the fact that now, not only can I work until I&amp;#8217;m tired, and then go to bed and wake up when I&amp;#8217;m rested, but I can now take off in the middle of the day. If I decide, &amp;#8220;You know, I&amp;#8217;m just not feeling it today, I&amp;#8217;m not getting the kind of work done that I need to and there&amp;#8217;s no use trying,&amp;#8221; I&amp;#8217;m going to go down to the pool at my apartment complex and hang out for a few hours and just&amp;nbsp;relax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nudginess&lt;/strong&gt;&lt;br /&gt;
This kind of business model entirely relies on people being completely self-motivated. And none of us are. So the idea that we are a collective and that we are all relying on each other provides a nudge. We are all, just by our mere presence in the same similar area, nudging each other towards, &amp;#8220;Hey, let&amp;#8217;s get this thing done. Let&amp;#8217;s do this.&amp;#8221; It&amp;#8217;s nudginess. And it works. But we need to know each other really well. This extremely informal approach would not work in a company where people have been cobbled together from&amp;nbsp;résumés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What It&amp;#8217;s Like to Love Your Job&lt;/strong&gt;&lt;br /&gt;
I love my job. My job is my life. I wake up in the morning, and I sit down at my desk, and I just start to work. And I work until I can&amp;#8217;t work any longer. Then, if I want to take the evening off and hang out with my fiancé, that&amp;#8217;s just what we do. I&amp;#8217;m the kind of person who loves taking work home with him if it&amp;#8217;s good. I&amp;#8217;ve always been that way. If I&amp;#8217;m really into a project, and if I really enjoy it, it&amp;#8217;s going to consume me. And that&amp;#8217;s exactly what we&amp;#8217;re trying to do. We&amp;#8217;re trying to filter out all the garbage and take in work that will consume&amp;nbsp;us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stirring Finale to Interview&lt;/strong&gt;&lt;br /&gt;

What we&amp;#8217;re trying to do is merge work and heart. Our attitude is: we&amp;#8217;re going to do stuff and interact with our clients in a way that&amp;#8217;s fun and different and totally not at all stodgy. Yet not sloppy. We&amp;#8217;re T-shirt and jeans; we&amp;#8217;re not stained wife-beater and cut-offs. We try to be fun but still be taken very seriously. I want people to walk away from dealing with our company saying, &amp;#8220;They were a lot of fun to work with, and they were highly professional.&amp;#8221; And that kind of mix you just don&amp;#8217;t really see in the business place. To continue the kitchen analogy, it&amp;#8217;s the pinch of humor, the zest, the dash — whatever your spice or seasoning metaphor is for such a thing — that&amp;#8217;s what we&amp;nbsp;are.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;Originally published in the September/October 2006 edition of the &lt;em&gt;Alcalde&lt;/em&gt; (vol. 95, num. 1). Words and photos by Tim&amp;nbsp;Taliaferro.&lt;/cite&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Thanks, Tim, for a great interview. You&amp;#8217;re doing great work at the&amp;nbsp;&lt;em&gt;Alcalde&lt;/em&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=PddV8LPLRlY:dS8B4gDQGLQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=PddV8LPLRlY:dS8B4gDQGLQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/08/29/alcalde-article-highlights-four-kitchens-approach-creativity-publishing#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <pubDate>Tue, 29 Aug 2006 12:22:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">50 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>OpenID group on StumbleUpon</title>
    <link>http://fourkitchens.com/blog/2006/08/14/openid-group-stumbleupon</link>
    <description>&lt;p&gt;Do you &lt;a href="http://www.stumbleupon.com/"&gt;Stumble&lt;/a&gt;? Do you like &lt;a href="http://iwantmyopenid.org/"&gt;OpenID&lt;/a&gt;? Do you love this cheesy, &lt;a href="http://www.thefreedictionary.com/anaphora"&gt;anaphoric&lt;/a&gt;&amp;nbsp;introduction?&lt;/p&gt;
&lt;p&gt;Even if obscure rhetorical devices aren&amp;#8217;t your bag, you can still join the brand-spanking-new &lt;a href="http://openid.group.stumbleupon.com/"&gt;OpenID StumbleUpon group&lt;/a&gt;. StumbleUpon, in case you&amp;#8217;re unaware, is a social bookmarking tool and Firefox toolbar with a very strong community backbone. You can post your favorite links, rank others&amp;#8217;, and post message board-style in groups and on individual users&amp;#8217; pages. But here&amp;#8217;s the best part: whenever you get bored, hit the &amp;#8220;Stumble!&amp;#8221; button in the toolbar, and you&amp;#8217;ll be whisked away to a site recommended by users who share your&amp;nbsp;interests.&lt;/p&gt;
&lt;p&gt;Help us build OpenID awareness among StumbleUpon&amp;#8217;s rapidly growing ranks! &lt;a href="http://www.stumbleupon.com/"&gt;Download the StumbleUpon toolbar&lt;/a&gt; and join the &lt;a href="http://openid.group.stumbleupon.com/"&gt;OpenID group&lt;/a&gt;. Oh, and don&amp;#8217;t forget to tell the Stumblers about the &lt;a href="http://iwantmyopenid.org/bounty/"&gt;$5,000 bounties&lt;/a&gt; up for&amp;nbsp;grabs&amp;#8230;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=DiN4rE15Ilk:-tIEPPEJW1A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=DiN4rE15Ilk:-tIEPPEJW1A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/08/14/openid-group-stumbleupon#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/openid">OpenID</category>
 <pubDate>Mon, 14 Aug 2006 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">51 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Why do we all possess only half a brain?</title>
    <link>http://fourkitchens.com/blog/2006/08/12/why-do-we-all-possess-only-half-brain</link>
    <description>&lt;p&gt;It&amp;#8217;s an old question&amp;mdash;if not a touch psuedo-scientific&amp;mdash;but it points to a stark divide in human psychology: are you right-brained or&amp;nbsp;left-brained?&lt;/p&gt;
&lt;p&gt;Artists and scientists rarely share the same skin, and those who do are heralded as geniuses, eccentrics, or Renaissance &lt;strike&gt;Men&lt;/strike&gt; Persons of Indeterminate Gender. This split is especially frustrating when working on the web, a sprawling medium that requires two very different talents: programming and&amp;nbsp;design.&lt;/p&gt;
&lt;p&gt;Now here&amp;#8217;s a good idea: &lt;a href="http://programmermeetdesigner.com/"&gt;Programmer Meet Designer&lt;/a&gt;, a community site that introduces programmers to designers (and vice versa) to collaborate and build better websites. Here&amp;#8217;s what &lt;span class="caps"&gt;PMD&lt;/span&gt; has to&amp;nbsp;say:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
This site was created to unite programmers and designers because rarely is a person good at both programming and designing. &lt;span class="caps"&gt;PMD&lt;/span&gt; helps programmers and designers partner up to make websites and web applications that look and work great. It also lets entrepreneurs and writers find people to work&amp;nbsp;with.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It seems like a useful tool for finding the Yin to your Yang, the Bernie Taupin to your Elton John, or the Da Vinci to your, uh, Da&amp;nbsp;Vinci.&lt;/p&gt;
&lt;p&gt;(Of course, if you&amp;#8217;d rather not hunt the web for your left- or right-brained counterpart, you can always &lt;a href="http://fourkitchens.com/info/Contact_us"&gt;call Four Kitchens&lt;/a&gt; instead. We pride ourselves, after all, in delivering the gamut of talent: from web to print, creative to technical!&amp;nbsp;;))&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Source:&amp;nbsp;&lt;a href="http://lifehacker.com/software/top/programmers-meet-designers-193701.php"&gt;Lifehacker&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=23PpuSeDsGE:mxUoGzT0Rcg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=23PpuSeDsGE:mxUoGzT0Rcg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/08/12/why-do-we-all-possess-only-half-brain#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <pubDate>Sat, 12 Aug 2006 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">52 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Olive Garden, Best Buy, and Coca-Cola 2.0?</title>
    <link>http://fourkitchens.com/blog/2006/08/11/olive-garden-best-buy-coca-cola-20</link>
    <description>&lt;p&gt;&lt;a href="http://enthree.com/files/random/web2logos/"&gt;Corporate logos redesigned in Web 2.0&amp;nbsp;style&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Brilliant. Kinda makes me wonder when the whole &amp;#8220;web 2.0&amp;#8221; thing will burn itself out. I mean, haven’t we collectively satisfied the web&amp;#8217;s considerable thirst for shiny gradients and Trebuchet&amp;nbsp;&lt;span class="caps"&gt;MS&lt;/span&gt;?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=t5b9Xun8D5U:l1MVPsySwSc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=t5b9Xun8D5U:l1MVPsySwSc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/08/11/olive-garden-best-buy-coca-cola-20#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/random-junk">Random Junk</category>
 <pubDate>Fri, 11 Aug 2006 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">53 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>OpenID development bounties announced at OSCON 2006</title>
    <link>http://fourkitchens.com/blog/2006/07/27/openid-development-bounties-announced-oscon-2006</link>
    <description>&lt;p&gt;Four Kitchen Studios is proud to co-sponsor over $50,000 worth of bounties to support OpenID development and inclusion in popular open-source Internet software. We&amp;#8217;re contributing both in cash and in kind by designing the handouts for &lt;span class="caps"&gt;OSCON&lt;/span&gt; 2006 and writing the press releases. After &lt;span class="caps"&gt;OSCON&lt;/span&gt;, we&amp;#8217;ve agreed to handle the site redesign for &lt;a href="http://iwantmyopenid.org/"&gt;iwantmyopenid.org&lt;/a&gt;, the bounty&amp;nbsp;headquarters.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll also be personally travelling to Wikimania 2006 to distribute more handouts and answer questions about OpenID&amp;#8217;s future in MediaWiki, the software that runs&amp;nbsp;Wikipedia.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ivHMO0GbNM8:wYKNHQoJ7FU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ivHMO0GbNM8:wYKNHQoJ7FU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/07/27/openid-development-bounties-announced-oscon-2006#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <category domain="http://fourkitchens.com/tags/openid">OpenID</category>
 <pubDate>Thu, 27 Jul 2006 12:00:00 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">54 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>GetOpenID.com launch signals our full support of the OpenID standard</title>
    <link>http://fourkitchens.com/blog/2006/07/17/getopenidcom-launch-signals-our-full-support-openid-standard</link>
    <description>&lt;p&gt;&lt;a href="http://getopenid.com"&gt;&lt;img id="image13" src="/sites/default/files/logo-getopenid.gif" alt="GetOpenID logo" align="right" /&gt;&lt;/a&gt;&lt;em&gt;We &lt;strong&gt;love&lt;/strong&gt; &lt;a href="http://en.wikipedia.org/wiki/OpenID"&gt;OpenID&lt;/a&gt;&lt;/em&gt;. We&amp;#8217;re so hopelessly, head-over-heels, eye-battingly infatuated with the possibility of &lt;a href="http://en.wikipedia.org/wiki/Single_sign-on"&gt;single sign-ons (SSOs)&lt;/a&gt;, in fact, that we&amp;#8217;ve launched &lt;a href="http://getopenid.com"&gt;GetOpenID.com&lt;/a&gt;, our very own OpenID server and registrar. Oh, and we&amp;#8217;ll use it to &lt;em&gt;fully integrate OpenID with all our projects and&amp;nbsp;contracts&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Six Apart (creators of TypeKey and Movable Type), LiveJournal, and VeriSign have already integrated OpenID, and the Wikimedia Foundation (creator of Wikipedia) has announced their intent to support OpenID (&lt;a href="http://video.google.com/videoplay?docid=7747790812939045407&amp;#038;q=wikipedia"&gt;see the&amp;nbsp;video&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;So what is OpenID? It&amp;#8217;s a decentralized identity management system that allows you to sign on to OpenID-enabled sites without having to register or create a new account. If you&amp;#8217;re the type of user who comments or posts to several blogs, message boards, and wikis, you know what a pain remembering and managing dozens of usernames and passwords can be. With OpenID, however, you only need &lt;em&gt;one&lt;/em&gt; username&amp;mdash;your OpenID &amp;#8220;identity&amp;#8221;&amp;mdash;and it&amp;#8217;ll work on any site that accepts&amp;nbsp;OpenID.&lt;/p&gt;
&lt;p&gt;Still not convinced? OpenID allows you to delegate your identity to a &lt;span class="caps"&gt;URL&lt;/span&gt; simply by adding two lines of code to the header. Instead of &lt;code&gt;getopenid.com/fourkitchens&lt;/code&gt;, I could log in to any OpenID-enabled site as simply &lt;code&gt;FourKitchens.com&lt;/code&gt;, and Four Kitchens&amp;#8217; URL will appear as the byline for any post or comment I make. (Hey, marketing professionals: are the branding possibilities making you drool&amp;nbsp;yet?)&lt;/p&gt;
&lt;p&gt;Want to know more? &lt;a href="http://getopenid.com"&gt;Get your own OpenID&lt;/a&gt;, then check out &lt;a href="http://openid.net"&gt;OpenID.net&lt;/a&gt; for specs and&amp;nbsp;documentation.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ibAuj-d70wo:CVu-wsjynys:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=ibAuj-d70wo:CVu-wsjynys:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/07/17/getopenidcom-launch-signals-our-full-support-openid-standard#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/openid">OpenID</category>
 <pubDate>Mon, 17 Jul 2006 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">56 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>I Make Mistakes elevates schadenfreude to a new (more pronounceable) level</title>
    <link>http://fourkitchens.com/blog/2006/07/07/i-make-mistakes-elevates-schadenfreude-new-more-pronounceable-level</link>
    <description>&lt;p&gt;&lt;a href="http://imakemistakes.com/"&gt;&lt;img id="image15" src="/sites/default/files/imakemistakes-logo.gif" alt="I Make Mistakes logo" align="right" /&gt;&lt;/a&gt;&lt;strong&gt;scha·den·freu·de&lt;/strong&gt; &lt;em&gt;(n)&lt;/em&gt; Pleasure derived from the misfortunes of&amp;nbsp;others.&lt;/p&gt;
&lt;p&gt;Mistakes. Everybody makes &amp;#8216;em. Everybody loves to hear about other people making &amp;#8216;em. But why can&amp;#8217;t we vote on them according to prevalence and severity?&amp;nbsp;&lt;em&gt;Why??&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Calm down, imaginary person in my head! &lt;strong&gt;At &lt;a href="http://imakemistakes.com/"&gt;I Make Mistakes&lt;/a&gt;, you can anonymously post your flubs, flaps, and fu&amp;mdash;uh, faults&amp;mdash;and rate those of others.&lt;/strong&gt; Part &lt;a href="http://grouphug.us/" target="_blank"&gt;group hug&lt;/a&gt;, part &lt;a href="http://justcurio.us/" target="_blank"&gt;justcurio.us&lt;/a&gt;, I Make Mistakes is a social experiment-meets-confessional. It&amp;#8217;s a window into the human psyche. No, wait&amp;mdash;it&amp;#8217;s a bathroom stall next to the window of the psyche that overlooks the confessional inside the social&amp;nbsp;experiment.&lt;/p&gt;
&lt;p&gt;Well, whatever it is, it&amp;#8217;s totally anonymous, ad-free, and zero-profit. (And for you web geeks out there, we&amp;#8217;ve integrated the &lt;a href="http://en.wikipedia.org/wiki/Open_id" target="_blank"&gt;OpenID&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Single_sign-on" target="_blank"&gt;single sign-on&lt;/a&gt; (&lt;span class="caps"&gt;SSO&lt;/span&gt;)&amp;nbsp;standard.)&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re adding several features in the coming weeks, including user moderation (to flag spam posts for deletion), work-safe mode, and sydication of your personal Mistake Threat Level on your website or&amp;nbsp;blog.&lt;/p&gt;
&lt;p&gt;Vote for &lt;a href="http://imakemistakes.com/"&gt;I Make Mistakes&lt;/a&gt; on&amp;nbsp;&lt;a href="http://listible.com/" target="_blank"&gt;Listible&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.listible.com/list/complete-list-of-web-2-0-products-and-services"&gt;Complete list of Web2.0&amp;nbsp;services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.listible.com/list/cool-web-3-0-apps"&gt;Cool Web3.0&amp;nbsp;Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Updates:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.100shiki.com/archives/2006/06/_i_make_mistake.html"&gt;We&amp;#8217;re big in&amp;nbsp;Japan!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.genbeta.com/archivos/2006/06/19-i-make-mistakes-otro-confesio.php"&gt;And somewhere else,&amp;nbsp;too!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=onssCPJ3oHE:egsTRHHTQSc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=onssCPJ3oHE:egsTRHHTQSc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/07/07/i-make-mistakes-elevates-schadenfreude-new-more-pronounceable-level#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/news">News</category>
 <category domain="http://fourkitchens.com/tags/projects">Projects</category>
 <pubDate>Fri, 07 Jul 2006 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">55 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Dumping pure MVC for task flows</title>
    <link>http://fourkitchens.com/blog/2006/05/24/dumping-pure-mvc-task-flows</link>
    <description>&lt;p&gt;I&amp;#8217;ve talked a lot about task flows on web sites but not much about how I&amp;#8217;d implement them. Here’s a brain&amp;nbsp;dump.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s how I&amp;#8217;d structure the human side of URLs:&lt;br /&gt;&amp;nbsp;&lt;code&gt;http://example.com/verb_that_maps_to_task/options&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This would generate the task flow, associate it with the user in the database, determine how the user can accomplish the task (if security allows it), and send the user to the first necessary step of the task. The new task would have a unique &lt;span class="caps"&gt;ID&lt;/span&gt; in the database, and the site would forward the user to a &lt;span class="caps"&gt;URL&lt;/span&gt; constructed for that task:&lt;br /&gt;&amp;nbsp;&lt;code&gt;http://example.com/taskflow/task_flow_id&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;These URLs would also be linked from the task bar in the site&amp;#8217;s interface. The user would click on the task bar to jump among independent task&amp;nbsp;flows.&lt;/p&gt;
&lt;p&gt;Tasks would be transactional. More technically, they would be &lt;a href="http://en.wikipedia.org/wiki/ACID" rel="nofollow"&gt;&lt;span class="caps"&gt;ACID&lt;/span&gt;&lt;/a&gt;-like. At the site administrator&amp;#8217;s option, tasks could expire, or users could have a maximum number of concurrent&amp;nbsp;tasks.&lt;/p&gt;
&lt;p&gt;Now, MVCs still have an abstracted role in this system. Task flows actually hop among controller actions, and many task flows would only need to use one controller&amp;#8217;s action to finish. But as systems become more complicated, one controller&amp;#8217;s action doesn&amp;#8217;t always do the job. That’s where this system would&amp;nbsp;shine.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=_St2eAF33Xo:K-g7Zikitlk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=_St2eAF33Xo:K-g7Zikitlk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/05/24/dumping-pure-mvc-task-flows#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <pubDate>Wed, 24 May 2006 12:00:00 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">57 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>How sessions and variable passing fail</title>
    <link>http://fourkitchens.com/blog/2006/05/24/how-sessions-variable-passing-fail</link>
    <description>&lt;p&gt;Another common problem in web development is session management. Basically, web programmers have two choices, use global sessions or precariously pass variables between forms and links. Both have serious&amp;nbsp;problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Global sessions
&lt;ul&gt;
&lt;li&gt;Users can&amp;#8217;t perform the same basic task in multiple windows on the same site&amp;nbsp;simultaneously.&lt;/li&gt;
&lt;li&gt;If a user quits a task and returns to a page related to the task later, the system will show the old task&amp;#8217;s information. This can be good, but it can also be&amp;nbsp;confusing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Passing variables
&lt;ul&gt;
&lt;li&gt;It&amp;#8217;s hard to constrain the user to a path where the programmer can control passing the&amp;nbsp;variables.&lt;/li&gt;
&lt;li&gt;The number of ways programmers must use to pass variables is daunting. &lt;span class="caps"&gt;PHP&lt;/span&gt;&amp;#8217;s non-cookie session method is a good&amp;nbsp;example.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution is a true &amp;#8220;task bar&amp;#8221; (not in the Windows sense). The state of the user&amp;#8217;s actions should be encompassed in tasks, and the tasks should be associated with the user. Clicking on a task would bring the user to the first incomplete step. Deleting a task would remove that branch of work. Ideally, the user could jump between tasks whenever, with the system saving any incomplete state. This would function well for single or multiple browser windows on the same site. And while variables would still have to be passed between immediate steps in a task, the programmer needn&amp;#8217;t worry about the user getting off track, as the user would only need to click on the task to resume work on&amp;nbsp;it.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=AC76Ranh9UY:P87YJG0AdLI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=AC76Ranh9UY:P87YJG0AdLI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/05/24/how-sessions-variable-passing-fail#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <pubDate>Wed, 24 May 2006 12:00:00 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">58 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Superscalar Task Management: A Different Approach to User Routing</title>
    <link>http://fourkitchens.com/blog/2006/05/24/superscalar-task-management-different-approach-user-routing</link>
    <description>Users and programmers don&amp;#8217;t think in terms of means; they think in terms of goals. No one cares that they have to open &lt;a href="http://en.wikipedia.org/wiki/Mozilla_Thunderbird"&gt;Thunderbird&lt;/a&gt;, click Address Book, and then search to find a phone number. They just want to find a phone number. So, why are we programming and using web sites any other way? Right now, as programmers, we have to manually route users around a site. On the &lt;a href="http://en.wikipedia.org/wiki/OpenID"&gt;OpenID&lt;/a&gt; server I&amp;#8217;m currently programming for Four Kitchens, routing a user through the &lt;a href="http://en.wikipedia.org/wiki/Authentication"&gt;authentication&lt;/a&gt; process is tedious.

When a user first arrives to authenticate, he or she has one goal, authentication to the &amp;#8220;OpenID Consumer&amp;#8221; site. This goal has two dependencies, authentication with the OpenID Server and authorization of the OpenID Consumer site through the user&amp;#8217;s trust roots. A user can have any combination satisfied. That means I have to consider four different routes (2^2):
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;State:&lt;/strong&gt; User is authorized with OpenID Server&lt;br /&gt;&lt;strong&gt;State:&lt;/strong&gt; OpenID Consumer is under the user&amp;#8217;s trust roots&lt;br /&gt;&lt;strong&gt;Action:&lt;/strong&gt;&amp;nbsp;Pass-through&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;State:&lt;/strong&gt; User is authorized with OpenID Server&lt;br /&gt;&lt;strong&gt;State:&lt;/strong&gt; OpenID Consumer is &lt;strong&gt;not&lt;/strong&gt; under the user&amp;#8217;s trust roots&lt;br /&gt;&lt;strong&gt;Action:&lt;/strong&gt; Authorize trust&amp;nbsp;root&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State:&lt;/strong&gt; User is &lt;strong&gt;not&lt;/strong&gt; authorized with OpenID Server&lt;br /&gt;&lt;strong&gt;State:&lt;/strong&gt; OpenID Consumer is under the user&amp;#8217;s trust roots&lt;br /&gt;&lt;strong&gt;Action:&lt;/strong&gt;&amp;nbsp;Authenticate&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;State:&lt;/strong&gt; User is &lt;strong&gt;not&lt;/strong&gt; authorized with OpenID Server&lt;br /&gt;&lt;strong&gt;State:&lt;/strong&gt; OpenID Consumer is &lt;strong&gt;not&lt;/strong&gt; under the user&amp;#8217;s trust roots&lt;br /&gt;&lt;strong&gt;Action:&lt;/strong&gt; Authenticate&lt;br /&gt;&lt;strong&gt;Action:&lt;/strong&gt; Then, authorize trust root (must be in this&amp;nbsp;order)&lt;/li&gt;

&lt;/ul&gt;
If we had a &lt;a href="http://en.wikipedia.org/wiki/Superscalar"&gt;superscalar&lt;/a&gt;-style task management system, we would have a set of tasks with dependencies. The system would be responsible for scheduling the dependencies to satisfy them. We can break authentication to an OpenID Consumer into three tasks (in no particular order):
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Task:&lt;/strong&gt; Authenticate the user to the OpenID Consumer site&lt;br /&gt;&lt;strong&gt;Dependency:&lt;/strong&gt; Authentication to the OpenID Server&lt;br /&gt;&lt;strong&gt;Dependency:&lt;/strong&gt; Authorization of the OpenID Consumer under the user&amp;#8217;s trust&amp;nbsp;root&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Task:&lt;/strong&gt; Authenticate the user to the OpenID Server&lt;br /&gt;&lt;strong&gt;Dependencies:&lt;/strong&gt;&amp;nbsp;None&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Task:&lt;/strong&gt; Authorize the OpenID Consumer under the user&amp;#8217;s trust root&lt;br /&gt;&lt;strong&gt;Dependency:&lt;/strong&gt; Authentication to the OpenID&amp;nbsp;Server&lt;/li&gt;
&lt;/ul&gt;
But, unlike a regular superscalar architecture, the programmer would (as directly above) establish tasks, dependencies, and means of accomplishing tasks beforehand. The running system would only need to set goals. The system would even determine a viable, short task path to accomplish the goal.

With such a system, authenticating a user to an OpenID Consumer would be simple. The programmer would establish the controllers (as in &lt;a href="http://en.wikipedia.com/wiki/Model-view-controller"&gt;&lt;span class="caps"&gt;MVC&lt;/span&gt;&lt;/a&gt;) that accomplish the tasks. When a user needs to authenticate, the running system would merely add a goal (authenticate to a given OpenID Consumer) and tell the system, &amp;#8220;Go.&amp;#8221; No more complex routing logic in every&amp;nbsp;controller.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=tIh_rkxIzCA:d8SSmfj8E_0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=tIh_rkxIzCA:d8SSmfj8E_0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/05/24/superscalar-task-management-different-approach-user-routing#comments</comments>
 <category domain="http://fourkitchens.com/authors/david-timothy-strauss">David Timothy Strauss</category>
 <pubDate>Wed, 24 May 2006 12:00:00 -0500</pubDate>
 <dc:creator>David Strauss</dc:creator>
 <guid isPermaLink="false">59 at http://fourkitchens.com</guid>
  </item>
  <item>
    <title>Four Kitchen Studios formed</title>
    <link>http://fourkitchens.com/blog/2006/04/21/four-kitchen-studios-formed</link>
    <description>&lt;p&gt;&lt;strong&gt;It’s official: we’re a real company!&lt;/strong&gt; Today I received a letter from the Texas Secretary of State announcing the formation of &lt;a href="http://fourkitchens.com" rel="nofollow"&gt;Four Kitchen Studios,&amp;nbsp;&lt;span class="caps"&gt;LLC&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There’s much more to be done, of course, so stay tuned for many exciting announcements in the coming days and&amp;nbsp;weeks.&lt;/p&gt;
&lt;p&gt;So what exactly is Four Kitchens? We’re a creative collective based in Austin, &lt;span class="caps"&gt;TX&lt;/span&gt;. Our goal is deceptively simple: to create fun things that people&amp;nbsp;enjoy.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=UqcyQ9piUnw:m3ywrSq5_CY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/fourkitchens?a=UqcyQ9piUnw:m3ywrSq5_CY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fourkitchens?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
     <comments>http://fourkitchens.com/blog/2006/04/21/four-kitchen-studios-formed#comments</comments>
 <category domain="http://fourkitchens.com/authors/todd-ross-nienkerk">Todd Ross Nienkerk</category>
 <category domain="http://fourkitchens.com/tags/news">News</category>
 <pubDate>Fri, 21 Apr 2006 12:00:00 -0500</pubDate>
 <dc:creator>Todd Ross Nienkerk</dc:creator>
 <guid isPermaLink="false">60 at http://fourkitchens.com</guid>
  </item>
  </channel>
</rss>
