<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>scot hacker&#039;s foobar blog &#187; CMS</title>
	<atom:link href="http://birdhouse.org/blog/tag/cms/feed/" rel="self" type="application/rss+xml" />
	<link>http://birdhouse.org/blog</link>
	<description>Like a chicken with a jewel in its beak.</description>
	<lastBuildDate>Mon, 26 Jul 2010 08:40:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Drupal or Django? A Guide for Decision Makers</title>
		<link>http://birdhouse.org/blog/2009/11/11/drupal-or-django/</link>
		<comments>http://birdhouse.org/blog/2009/11/11/drupal-or-django/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 00:07:54 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3611</guid>
		<description><![CDATA[Target Audience There&#8217;s a large body of technical information out there about content management systems and frameworks, but not much written specifically for decision-makers. Programmers will always have preferences, but it&#8217;s the product managers and supervisors of the world who often make the final decision about what platform on which to deploy a sophisticated site. [...]]]></description>
			<content:encoded><![CDATA[<h3>Target Audience</h3>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/11/druplicon.png" alt="druplicon" title="druplicon" width="150" class="alignleft size-full wp-image-3632" />There&#8217;s a large body of technical information out there about content management systems and frameworks, but not much written specifically for decision-makers. Programmers will always have preferences, but it&#8217;s the product managers and supervisors of the world who often make the final decision about what platform on which to deploy a sophisticated site. That&#8217;s tricky, because web platform decisions are more-or-less final &#8212; it&#8217;s very, very hard to change out the platform once the wheels are in motion. Meanwhile, the decision will ultimately be based on highly technical factors, while managers are often not highly technical people. </p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/11/django-logo-negative.png" alt="django-logo-negative" title="django-logo-negative" width="150"  class="alignleft size-full wp-image-3631" />This document aims to lay out <em><strong>what I see as being </strong></em> the pros and cons of two popular web publishing platforms: The PHP-based <a href="http://drupal.org/" title="drupal.org | Community plumbing">Drupal</a> content management system (CMS) and the Python-based <a href="http://www.djangoproject.com/" title="Django | The Web framework for perfectionists with deadlines">Django</a> framework. It&#8217;s impossible to discuss systems like these in a non-technical way. However, I&#8217;ve tried to lay out the main points in straightforward language, with an eye toward helping supervisors make an informed choice. </p>
<p>This document could have covered any of the 600+ systems listed at <a href="http://cmsmatrix.org/" title="The CMS Matrix - cmsmatrix.org - The Content Management Comparison Tool">cmsmatrix.org</a>. We cover only Drupal and Django in this document because those  systems are highest on the radar at our organization. It simply would not be possible to cover every system out there. In a sense, this document is as much about making a decision between using a framework or using a content management system as it is between specific platforms. In a sense, the discussion about Drupal and Django below can be seen as a stand-in for that larger discussion.</p>
<p>				Disclosure: The author is a Django developer, not a Drupal developer. I&#8217;ve tried to provide as even-handed an assessment as possible, though bias may show through. I will update this document with additional information from the Drupal community as it becomes available.
	</p>
<p>		        	<span id="more-3611"></span></p>
<h3>Systems Make Assumptions</h3>
<p>Every web shop has its favorite tools and languages. Settling on just a few keeps toolchains, deployment, and development workflows sane. At both the UC Berkeley Graduate School of Journalism and the Knight Digital Media Center, we&#8217;ve settled on a mix of: </p>
<ul>
<li>WordPress for basic sites and &#8220;modest&#8221; online publications
		        </li>
<li>Django for sites with more complex needs or non-standard data models
		        </li>
</ul>
<p>For example, it makes sense to build student magazines, handbooks, FAQs, and blogs  with WordPress. But it&#8217;s simply not possible to build an equipment checkout system, or a course evaluation system, or a student/faculty/staff directory with WordPress &#8212; not while trying to preserve your sanity. That&#8217;s because WordPress assumes so much about the structure of your data &#8212; it thinks every piece of content has a title, a summary, an author, etc. Start to veer away from that basic data structure and you find yourself quickly needing a platform that doesn&#8217;t make assumptions about how things should be done. For those kinds of problems, we use Django.</p>
<p>Meanwhile, there&#8217;s a lot of <a href="http://drupal.org/" title="drupal.org | Community plumbing">Drupal</a> momentum on the UC Berkeley campus. In fact, there&#8217;s a lot of Drupal momentum all over the world &#8212; e.g. the recent move of <a href="http://techpresident.com/blog-entry/why-white-houses-embrace-drupal-matters-0" title="Why the White House&#039;s Embrace of Drupal Matters | techPresident">whitehouse.gov to Drupal</a>. And with that momentum comes questions from supervisors. </p>
<p>		    <!--more--></p>
<h3>&#8220;Why aren&#8217;t we using Drupal?&#8221;</h3>
<p>To be clear on terms:  </p>
<ul>
<li>WordPress is a simple content management system. </li>
<li>Drupal is an advanced content management system. </li>
<li>Django is a framework.</li>
</ul>
<p>Frameworks operate at a lower level than CMSs, and provide less of a turnkey experience for basic sites. In contrast, a framework is a box of parts from which you build your dream CMS &#8211; the CMS that precisely fits your organization&#8217;s data model and workflow. But the lines aren&#8217;t always so clear. Django comes with a self-generating administrative interface that&#8217;s so good and so user-friendly that we find it works fine <em>as</em> the CMS for the vast majority of projects we work on. The self-generating administrative interface can be tweaked and customized, or ignored altogether. It&#8217;s an optional component &#8211; you&#8217;re free to use it, modify it, or ignore it completely and write your own CMS on top of the framework. </p>
<p>On the other end of the spectrum, Drupal has some framework-like aspects to it. It&#8217;s been said that &#8220;Django is a framework with CMS-like tendencies, while Drupal is a CMS with framework-like tendencies.&#8221; So before you protest that I&#8217;m comparing apples and oranges, remember that in real life, the lines are blurry, and that apples and oranges <em>can</em> be compared, if what you intend is to compare types of fruit.</p>
<p>Every assumption made by a platform can either be a time-saver or an obstacle when it comes time for your site to grow or evolve, depending on: </p>
<ul>
<li>The ways you want that evolution to happen</li>
<li>The skill of your developers</li>
</ul>
<p>By their nature, frameworks are more flexible than CMSs. They make NO assumptions about the shape of your content, the Ajax system you might want to use, which rich text editor to present to your content people, etc.</p>
<p>Here are some of the key architectural points that matter to us when selecting a publishing platform, with pros and cons for Drupal and Django. I&#8217;ve sprinkled in some comments and feedback from members of the Django developer community (relevant comments from the Drupal development community will be included as well). </p>
<h3>Object Orientation</h3>
<p>  Python (the language on which Django is built) is extremely <a href="http://en.wikipedia.org/wiki/Object-oriented_programming" title="Object-oriented programming - Wikipedia, the free encyclopedia">object-oriented</a>, and thus so is Django. This  means that data objects, querysets, variables, templates and arguments can be passed around in the codebase easily. This makes it easier to reduce or completely eliminate redundant code (Django subscribes to the <a href="http://docs.djangoproject.com/en/dev/misc/design-philosophies/" title="Django | Design philosophies | Django Documentation">DRY</a> principle).
		        </p>
<p>Drupal is generally not object-oriented. However, Drupal developer &#8220;catch&#8221; adds:</p>
<blockquote>			 Drupal 7’s field and entity APIs are a step towards an ORM. Drupal&#8217;s database layer and many other subsystems including contributed modules like Views are object oriented to various extents.</blockquote>
</p>
<h3>MVC/MTV</h3>
<p>Django uses the <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" title="Model–view–controller - Wikipedia, the free encyclopedia">model-view-controller</a> methodology (going by the name <a href="http://jeffcroft.com/blog/2007/jan/11/django-and-mtv/" title="JeffCroft.com: Django and MTV">MTV</a> in Django-land). This means that in Django, developers have almost complete separation of logic (programming), data structure, and display logic. MVC/MTV has emerged as a core aspect of modern programming practice.
		        </p>
<p>Django is MVC from the ground up. </p>
<h3>Templating System</h3>
<p>Django is famed for its super-clean, inheritance-based templating system, which makes it almost trivially easy to nest templates within templates, use different templates for different parts of the site, and to completely eliminate any redundancy in template code. Working with Django&#8217;s templating system is often described as &#8220;a joy.&#8221;  </p>
<p>
		    In contrast, a common complaint about Drupal is that  templates can be difficult to customize. In fact, there are entire books about working with templates in Drupal.</p>
<p>Said one Django developer on working with Drupal templates: &#8220;I always felt like I was shoving a square peg in a round hole.&#8221;</p>
<p>Drupal developer &#8220;catch&#8221;:</p>
<blockquote>Drupal’s PHPTemplate theme layer gives you a lot of freedom to do processing in themes, which can be good or bad depending on situation/skillset etc. &#8230; However, even if you do have code which you need to share between themes: since at least Drupal 5, we’ve had theme inheritance (sub themes) which means if you have some central logic which would need to be re-used between multiple themes – whether that’s templates, CSS files, preprocessing etc. (either on the same site or completely different sites) then there’s zero need to copy this between them – you just have your base theme with that stuff in, then build a subtheme on top of it, subthemes can be as light as a single CSS file.</blockquote>
<p>				The theme/sub-theme system does give Drupal the ability to do theme inheritance. However, the basic methodology still allows for the inclusion of business logic in themes, which breaks the separation of presentation, content, and programming logic. The Django project is very strict about this, and has been very good at saying &#8220;NO&#8221; to proposals to make Django&#8217;s templating language include more options for direct programming. The Django philosophy is, &#8220;If you feel like you need to do some programming in your templates, you&#8217;re doing it wrong.&#8221; However, it is possible to create your own <a href="http://docs.djangoproject.com/en/dev/howto/custom-template-tags/" title="Django | Custom template tags and filters | Django Documentation">custom template tags and filters</a> to extend Django&#8217;s base template language. Developers often share these custom tags and filters on sites like <a href="http://www.djangosnippets.org/" title="Django snippets: Welcome">djangosnippets.org</a>.</p>
<p> Once you head down the slippery slope of scattering code logic between internal functions and external templates (which should be kept simple enough for a designer to work on),  you lose the clean separation of logic and presentation and no longer have certainty that certain kinds of code must be in certain places. My view is that Django&#8217;s insistence on keeping as much programming  out of templates as possible makes people better developers, since it enforces &#8220;best practices&#8221; in programming.</p>
<p>Contrast all of this to WordPress theme development, where developers have to copy chunks of logic over to the new theme manually if they ever decide to change themes.</p>
<h3>ORM</h3>
<p>In Django, development begins by defining the data models that describe the organization, publication, or site. For example, these might be Stories, Authors, and Presses, or Equipment, Schedules, and Reservations, or Faculty, Students, Courses and Evaluations, etc. All of these have datatypes and interdependent relationships. </p>
<p>From that data model, database tables are auto-generated, and the system becomes internally &#8220;aware&#8221; of data relationships. To query for various sets of data, the Django developer uses something called the Object Relational Mapper, or ORM. So, rather than writing raw SQL queries, the Django developer writes &#8220;<a href="http://docs.djangoproject.com/en/dev/ref/models/querysets/" title="Django | QuerySet API reference | Django Documentation">querysets</a>&#8221; like:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">	     books = Book.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>author=<span style="color: #483d8b;">'Hacker'</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>In a simple example like that, there&#8217;s no real time savings over writing the equivalent SQL. But when queries become complex, SQL gets difficult and error-prone, while querysets remain straightforward and readable. When developers can save time and reduce errors, organizations save money.</p>
<p>Drupal does not have an ORM.</p>
<blockquote>Preston Holmes: For relatively &#8220;flat&#8221; data, Drupal&#8217;s CCK is usable by non devs to create custom content types, and the Views module allow for simple generic_view style pages. When it comes to more complex objects, Django&#8217;s ORM is far superior.</blockquote>
<p>Starting with the data modeling process is a key point. Django makes no assumptions about the needs of your organization or the shape of your data, which means the end product should fit your organization like a glove. Django projects are built up to fit the organization, whereas Drupal developers often talk about having to remove or work around the things they don&#8217;t need. Many developers who have spent time in both systems say the Django methodology is easier and faster.</p>
<h3>Performance</h3>
<p>I don&#8217;t have numbers to support this, and it would be quite hard to test without building the equivalent test site in both Django and Drupal, but the conventional understanding is that Drupal has a lot of functional &#8220;layers&#8221; through which all page requests must pass. This results in a high query count and  relatively sluggish performance. Granted, this limitation is largely moot given that all high-traffic database-backed sites rely on  caching to keep performance up, but it goes without saying that a system that&#8217;s as light on its feet as possible is desirable. A Drupal site is probably going to require caching to be enabled with a lower amount of traffic than an equivalent Django site.
		        </p>
<blockquote>    Bruno Desthuilliers: I recently had to work on a not-so-complex (functionaly-wise) Drupal project, and the response times on my local station &#8211; all caches disabled of course &#8211; turned the development process into a sluggish nightmare. Never had this kind of problems with Django, even for far more complex apps.</blockquote>
<h3>Learning Curve</h3>
<p>Drupal is sometimes criticized for having a steep learning curve. But as someone who went through the Django learning curve last year, I won&#8217;t claim that Django&#8217;s is much better. This really depends on the pre-existing skills of the developer. In my case, my move from PHP-based systems to Django was my first exposure to object-oriented programming, my first exposure to Python, and my first exposure to MVC/MTV thinking. Not to mention learning the framework itself. I think we hear this complaint more about Drupal than about Django because there are more newbie developers in the Drupal world, while Django for the most part attracts more experienced developers.
		        </p>
<p>In fact, I&#8217;d go as far as to say that Drupal has an advantage here for <em>basic</em> sites, where little to no customization is required. However, as soon as customization is required, you&#8217;re going to need an experienced developer on hand with either system. For systems flexible enough to let you build whatever you can imagine, there are no free lunches. </p>
<h3>Rapid Development</h3>
<p>		        Be careful of the term &#8220;rapid application development.&#8221; Without good skills on-staff, there&#8217;s nothing rapid about working with either system. But <em>with</em> those skills, rapid application development is no myth. I can&#8217;t speak for Drupal here, but a few recent rapid-development case studies are interesting:</p>
<ul>
<li>michaelmoore.com, recently rebuilt in Django in <a href="http://blog.concentricsky.com/2009/10/michaelmoore/" title="MichaelMoore.com | Concentric Sky">five weeks</a>.</li>
<li>texastribune.org, built from the ground up in <a href="http://www.poynter.org/column.asp?id=101&amp;aid=172892" title="Poynter Online - Top Stories">just four weeks</a> with Django.</li>
<li>Mahalo Answers, <a href="http://ctmiller.emurse.com/">built  in 35 days</a> with Django.</li>
<li>baynewsnetwork.org, an RSS <a href="http://baynewsnetwork.org/" title="baynewsnetwork  - home">mashup and aggregation site</a> with a complex back-end that lets member sites have multiple members and single members contribute to multiple sites &#8212; built in 3-4 days with Django.</li>
<li>django-treedata: Winner of the recent DataSF public dataset Hack-a-Thon, built in <a href="http://birdhouse.org/software/2009/11/django-treedata/" title="scot hacker&#8217;s scripts and utils &raquo; django-treedata: A web app for municipal tree tracking">8 hours with Django</a> (and another 8 hours cleaning the public data set).</li>
</ul>
<p>Both systems have fairly steep learning curves. But once developer skills are up to speed, it&#8217;s amazing how easy it is to get the platform to do most of the heavy lifting for you.
		        </p>
<p>
		        Note also that both systems are sometimes distributed as part of larger bundled packages (&#8220;distributions&#8221;) which extend their capabilities. For example Drupal is part of <a href="http://en.wikipedia.org/wiki/CivicSpace" title="CivicSpace - Wikipedia, the free encyclopedia">CivicSpace</a>, which is aimed at building civic/community sites, while the Django world has the option of deploying the <a href="http://pinaxproject.com/" title="Pinax">Pinax</a> project, which bundles together dozens of re-usable apps to greatly reduce time spent integrating parts into a cohesive whole. </p>
<h3>Flexibility</h3>
<p>This is very hard to quantify. Both Django and Drupal let developers  work with data models any way they please. The question is, what happens when you need to change those models, or add new ones? How easy is it to create new views or slices of the same data? What happens to the  logic that ties your data together when the platform is upgraded?  </p>
<p>Both systems value flexibility highly, though both go about things in very different ways. What I do know is that when visiting journalists tell us about their Drupal experiences, a complaint we hear a lot is &#8220;Everything was fine until we tried to change xyz &#8212; then everything fell apart and we&#8217;re still trying to recover.&#8221; Again, much of this comes down to whether you have good developers on staff more than it does to the platform. Still,  the fact that Django is so intensely object-oriented gives it a leg up when it comes to moving things around.</p>
<p>That&#8217;s not to say that a complex Django site is infinitely flexible.  Even well-designed data models have interdependencies, and a change made in one place can have real ramifications for other parts of the system, which may or may not be easy to recover from. Managers should not be given the impression that just because you&#8217;re using a &#8220;flexible system&#8221; and that &#8220;anything is possible&#8221; that the webmasters can turn the whole thing inside out on short notice. Things don&#8217;t work that way. </p>
<p>Drupal has developed a bit of a reputation for being difficult to upgrade, since so much changes internally between major releases. No platform is immune to that problem, but I&#8217;ve rarely seen Django apps affected by upgrades. And when they are, the fix is generally minor. </p>
<blockquote> Bruno Desthuilliers: From my experience, it can take more time doing &#8220;simple customizations&#8221; with Drupal than you&#8217;d need to implement the same features from scratch in Python/Django.</blockquote>
<p>		A recent Django success story was the 4-week (!) launch of <a href="http://texastribune.org/" title="The Texas Tribune">texastribune.org</a>. Asked why the Tribune chose Django over other platforms,  developer Chase Davis replied:</p>
<blockquote>We went with Django for two reasons:</blockquote>
<blockquote>1. We decided early on that the Texas Tribune needed room to evolve. It&#8217;s a startup, and nobody has any idea what it&#8217;s going to look like in six months. That being the case, our goal was to build them a sandbox &#8212; something that could evolve as their organization evolved. We settled on Django because we thought a framework-based approach would give them maximum flexibility, while keeping the benefits of stability and rapid development. If they need a new feature &#8212; no matter what it is &#8212; we can prototype it, built it and integrate it quickly. We&#8217;re not limited by pre-existing modules or dependency issues you find with off-the-shelf systems.<br />
		</blockquote>
<blockquote>2. The Tribune&#8217;s plan going forward is to integrate tremendous amounts of data into their coverage. Their lawmaker directory is one example of that, but they have much more ambitious plans for campaign finance records, financial disclosures, lobbying reports, etc. Rather than segregating that data by walling it off in its own ghetto, we thought Django offered the best chance to integrate it with other content on the site. Drupal isn&#8217;t great for building data apps; Django is. If we used Drupal for the CMS and tucked Django data apps within that, tightly integrating the two could quickly become a headache. But with everything in Django, our data apps and CMS play together seamlessly. You&#8217;ll see a lot more examples of that in the months ahead.<br />
		</blockquote>
<h3>Community Resources</h3>
<p>This is one area where Drupal really has the advantage. Don&#8217;t get me wrong &#8211; Django has a <em>great</em> community of developers who are more than ready to help each other out, respond to questions on IRC or mailing lists, and a <a href="http://planetdjango.org/" title="Planet Django">really active</a> blogosphere. But while there are many sites listing re-usable Django applications ready to become part of any project, Django simply does not have the immense collection of downloadable modules present in Drupal-land.  </p>
<p>    That doesn&#8217;t mean we haven&#8217;t been able to find ready-made solutions for most situations where we&#8217;ve needed them, but there are areas where we&#8217;ve really felt the pinch. Case in point: I recently had to implement a survey system on a Django site. That&#8217;s an important and not-uncommon piece of software, and you&#8217;d hope to find yourself choosing between lots of options. Unfortunately,  I found exactly <em>one</em> re-usable survey app for Django, and it was somewhat buggy.</p>
<p>On the plus side, the developers of django-survey responded literally overnight to the half-dozen bug reports I filed on it the first day, but it would be nice if there were several mature survey apps to choose from. That&#8217;s the kind of thing that happens when community momentum really takes off. Django&#8217;s momentum is increasing by the day, it&#8217;s heading in that direction, but Drupal definitely wins in this arena. </p>
<p>Still, there are community-provided apps and resources I utilize on every Django project I build. And nothing in this department has ever been a show-stopper for me.  Keep in mind that, in many cases, just building the re-usable app you need when an existing one isn&#8217;t available may be easier than expected. </p>
<h3>Popularity / Installed Base</h3>
<p>				By some measures, particularly for decision makers, popularity counts. Is the platform popular enough that I know it&#8217;s not going to be abandoned? Can I readily find qualified developers? Is the platform proven in the marketplace? Drupal developer Zack Rosen has this to say:</p>
<ol>
<li>Drupal by all measures of an open-source project is a magnitude larger than Django. Core contributors, community members, deployed sites, any way you want to compare numbers Drupal is a much more established project.</li>
<li>Drupal is more proven in the market place. It runs magnitudes more websites (500,000+), and many of note. Whitehouse.gov yes, but Viacom, Warner Brothers, Yahoo, Wikipedia and others all run highly trafficked Drupal sites and have made strategic business decisions to invest in the platform.</li>
<li>Drupal has far better commercial support in the marketplace than Django. There are many more (and more qualified) Drupal development shops and specialized service providers in the marketplace.</li>
</ol>
<p>Excellent points, which I would qualify by noting that Django&#8217;s popularity is rising, along with the number of qualified Django developers on the scene, and the number of high-profile Django sites appearing (just tonight, the Mozilla foundation announced that it would be <a href="http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/" title="All Night Diner : AMO Development Changes in 2010">moving</a> its addons site from CakePHP to Django.)</p>
<h3>Language</h3>
<p>After years of working with both custom and open source PHP code and applications, we felt that we had had our fill of PHP, which has a tendency to sprawl. Granted, sprawl is not much of an issue when working with pre-fab solutions like WordPress or Drupal, but Python&#8217;s syntax is clean and uncluttered, which speeds development time and encourages developers to think in more object-oriented ways. Simply put, clean code is easier to write and easier to maintain.
		        </p>
<blockquote>Mike Ramirez: Finally, there is the maturity of the language. PHP is still adding in features other, similar languages already have had. For example namespaces are just barely a year old in php, initial release in the dev versions, less than 6 months for the actual first appearance in a stable release. To quote wikipedia[3] on missing features from PHP: &#8220;PHP currently does not have native support for Unicode or multibyte strings; Unicode support will be included in PHP 6 and will allow strings as well as class, method and function names to contain non-ASCII characters.&#8221; Seriously, in todays global world and well, for the past what 10-15 years, hasn&#8217;t this been mandatory? I do not understand why web developers who use php, still do. I don&#8217;t understand why companies and schools support it.<br />
		        </blockquote>
<p>People often work in PHP  because it&#8217;s the default, and easy to gravitate towards.  But that doesn&#8217;t mean life couldn&#8217;t be a lot better with a cleaner language to work with.
		        </p>
<h3>Security</h3>
<p>        Security is a multi-headed hydra, and affects all web applications, large or small. SQL injection, form sanitization, cross-site scripting, and many other attack vectors require web application developers to stay up to speed on current security trends and to examine old code for new vulnerabilities. It&#8217;s a constant chore. </p>
<p>        One benefit of using a mature framework or CMS is that many of the most common security issues are handled by the system itself. This doesn&#8217;t mean we can afford to get lazy about it, but it&#8217;s good to know that hundreds of people smarter than oneself have pored over the code to identify and mitigate security issues. </p>
<p>	That much is true of both systems. However, it&#8217;s also true that Drupal has a <a href="http://drupal.org/security" title="Security advisories | drupal.org">history of security issues</a>, whereas similar issues in Django are extremely rare. This is in part due to the fact that Django has a lower public profile, and in part because Django makes fewer assumptions about where things live and how they&#8217;re configured. In other words, less about a site&#8217;s setup is known to a would-be attacker since sites built from a clean slate by various developers share less in common with one another. </p>
<p>	There are other factors that may contribute to Django&#8217;s excellent security track record, such as its URL mapping system, which simply prevents access to URL patterns that haven&#8217;t been predetermined by the developer, and its exceptional form generation and handling system. </p>
<p>	Still, I don&#8217;t want to emphasize the security point too much &#8211; all systems can be vulnerable if you do dumb things with them, and vice versa.</p>
<p>	Drupal developer &#8220;catch&#8221; adds:</p>
<blockquote>The Drupal security team regularly releases SAs for security issues which in some cases are theoretical, in many cases have never been exploited (simply reported after code review), and very often require either authenticated or some level of administrative access to a site. Additionally, the 3-4,000 contributed modules are hosted centrally on Drupal.org, not distributed around the web, and have the same rules for security announcements as Drupal core, handled by the same process. The number of security announcements for Drupal core itself is relatively low given code base and deployments.</blockquote>
<h3>Deployment</h3>
<p>On the other hand, PHP-based systems have a slight leg up in deployment. Since virtually every web host offers PHP hosting. In contrast, setting up a Django system on a server will take some level of fiddling that may not be familiar to the typical web developer. Fortunately, a growing number of web hosts <a href="http://djangohosting.org/" title="Django Hosting">specialize</a> in Django hosting, which makes this problem go away in many use cases.
		        </p>
<blockquote>Preston Holmes: &#8220;Where Drupal has its single biggest advantage, is that a technical user, a sysadmin etc, can get Drupal up and running. Someone doesn&#8217;t have to know PHP AT ALL to get drupal going. This is because Drupal has a decent admin-UI &#8211; where modules are pretty much drop in, activate and configure. Setting up even a basic Django site REQUIRES someone who has some programming skills, even if thats just a matter of setting up the settings.py file.<br />
		        </blockquote>
<p>		        But the Python/Django deployment hurdle is not huge, and is a one-time problem to solve. Once Apache has been configured to work with Django, you don&#8217;t need to think about it again.  This hurdle  affects hobbyists, who tend to look for a simple button in their web hosting control panel, far more than serious sites for whom server configuration is just part of doing business on the web.</p>
<h3>Developer Feedback</h3>
<p>I asked members of the django-users mailing list who had done development work with both Django and Drupal to provide comarison-oriented feedback for this article. Here are a few of their comments:</p>
<blockquote>Preston Holmes: What happens is that non-developer/technical decision makers will evaluate Drupal and think that all their needs will be met out of the box. When they find out they aren&#8217;t, they need to hire developers, and then those developers have to massage existing modules to customize and tweak. Then at some point they have this monster of hodgepodge code. But its that entry point that is the key to Drupal&#8217;s popularity. &#8230; I don&#8217;t think people appreciate how much Drupal development is spawned by this existence of a usable entry point for Drupal by non- developers. (and that it has 1-click installs on hosts, and in general uses the far more common infrastructure of PHP-MySQL).</blockquote>
<blockquote>Javier Guerra: &#8220;Many people feel they have to code less to write their own Django-based CMS than to customize an existing one. If that&#8217;s your case, you&#8217;re a lot less likely to break something when going with Django.&#8221;</blockquote>
<blockquote>Clifford Ilkay: &#8220;On balance, I&#8217;d say Django is the more flexible and powerful of the two but Drupal gives the *illusion* of productivity quicker. With Django, I build up from a base, whereas with Drupal, I seem to spend an inordinate amount of time trying to figure out how to make it *not* do something I want done differently. Django is lean and simple by comparison to Drupal, which is neither lean nor simple. Both have very active and helpful communities. If I had the choice, I&#8217;d pick Django simply because I prefer Python to PHP and find Django to be more productive. Prototyping and debugging PHP is very crude by comparison to Python. Much of Drupal&#8217;s convoluted architecture and reliance on naming convention &#8220;magic&#8221; to provide quasi-inheritance is due to the limitations of PHP. I often say, half-seriously, that Drupal is good despite PHP, not because of it.&#8221;</blockquote>
<blockquote>Alexandru Nedelcu: Development in Django is a lot easier, because the modules are more generic and the development process is more predictable because of its simpler architecture.</blockquote>
<blockquote>Mike Ramirez: Django has made making web apps almost trivial and the most time I spend now, is on the UI (both Dojo and JQuery make this almost trivial also), rather than the back-end.</blockquote>
<blockquote>Preston Holmes: Both have the problem of often complex dependencies. The biggest problem with Drupal is its relatively fast moving core &#8211; so that modules for the &#8220;current version&#8221; are hard to find, or often abandoned. Also Drupal modules almost always seem to do 80% of what you need.</blockquote>
<blockquote>    Milan Andric: Drupal might get you quickly to Point A, but the problem is in customization, pushing a site to do *exactly*  what you want (nothing more or less) &#8230; My main problem with Drupal has been all the time spent removing stuff. The best tool for web developers right now is a framework, not a CMS. Regardless of the language it&#8217;s written in.</blockquote>
<blockquote>catch: Drupal 6’s API was officially frozen 2.5 years ago and Drupal 7 has been in rapid development for more than 18 months, with probably 1-3,000 patches committed by this point.<br />
</blockquote>
<blockquote>Preston Holmes: (On the ease of getting the system to do highly custom tasks): Django just wins this so hands down. Here is part of the reason why. Drupals assumptions translate into your code having to jump through a lot of hoops &#8211; where as in Django, you make the assumptions and you make the hoops.</blockquote>
<h3>Conclusion</h3>
<p>Drupal represents a middle ground between framework and CMS that we&#8217;ve chosen not to take. Drupal is far more capable than a CMS like WordPress, but also much less flexible than a pure framework. But more importantly, the facts that Drupal isn&#8217;t object-oriented, isn&#8217;t MVC/MTV, doesn&#8217;t have an ORM, and is generally less flexible than a pure framework, not to mention our preference for working in Python over PHP, all contribute to our decision not to use it. </p>
<p>In the end, a good developer can do good work with just about any system, while a bad developer can make mincemeat of even the best system. It&#8217;s not <em>all</em> about the platform. But modern tools and best practices in platform design go a long way toward ending up with a cleaner, faster, better-designed architecture that precisely matches the needs of your organizations, with no assumptions or historical baggage to work around. </p>
<p>	    <strong>Note:</strong>  Public comments below may be incorporated into the document above. Thanks for your feedback.</p>
<p><strong>Update:</strong> This post sparked an <a href="http://groups.google.com/group/wp-hackers/browse_thread/thread/c56f50dd781617a7#">interesting thread</a> on the WordPress Hackers mailing list.</p>
<p><strong>Update:</strong> Drupal developer Nick Sergeant has posted a similar piece: <a href="http://nicksergeant.com/blog/django/drupal-v-django#comment-18297">Drupal v. Django</a></p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/11/11/drupal-or-django/feed/</wfw:commentRss>
		<slash:comments>90</slash:comments>
		</item>
		<item>
		<title>Notes on a Django Migration</title>
		<link>http://birdhouse.org/blog/2008/11/19/notes-on-a-django-migration/</link>
		<comments>http://birdhouse.org/blog/2008/11/19/notes-on-a-django-migration/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 17:45:07 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3176</guid>
		<description><![CDATA[Earlier this year, I inherited responsibility for the website of the Knight Digital Media Center at UC Berkeley&#8217;s Graduate School of Journalism. The site is built with Django, a web application framework written in Python. The J-School has primarily been a PHP shop, using a mixture of open-source apps &#8212; lots of WordPress, Smarty templates [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.djangoproject.com/"><img title="Powered by Django." src="http://media.djangoproject.com/img/badges/djangopowered126x54.gif" border="0" alt="Powered by Django." hspace="6" class="alignleft"  /></a> Earlier this year, I inherited responsibility for the website of the <a href="http://multimedia.journalism.berkeley.edu/">Knight Digital Media Center</a> at UC Berkeley&#8217;s <a href="http://journalism.berkeley.edu/">Graduate School of Journalism</a>. The site is built with <a href="http://www.djangoproject.com/">Django</a>, a web application framework written in Python. The J-School has primarily been a PHP shop, using a mixture of open-source apps &#8212; lots of WordPress, <a href="http://www.smarty.net/">Smarty</a> templates and piles of home-brew code. Because it&#8217;s grown organically over time with no clear underlying architecture and a constantly changing array of publications to support, the organization sits on top of dozens of unrelated databases.</p>
<p>These are my notes and observations on how the J-School got into this mess, why we&#8217;ve fallen in love with Django, and how we plan to dig ourselves out.</p>
<p><span id="more-3176"></span></p>
<h3>Bailing Wire</h3>
<p>I personally have no formal CS or programming background. Over the course of the six years I managed most of the <a href="http://journalism.berkeley.edu/">J-School</a> web properties, I learned just as much PHP and shell scripting as required, on an as-needed basis. Job pressures and constant deadlines never allowed time for pure training.</p>
<p>Even without training, I&#8217;ve been extremely productive with ad-hoc PHP. I ended up developing and/or implementing some very effective web apps, such as a course and instructor review system, events database, story submission database, application and review system, online quiz system, etc. &#8211; all more or less stitched together with bailing wire and duct tape.</p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/spaghetti.jpg" border="0" alt="Spaghetti"  width="200" height="150" class="alignright"  /> But everything people say about PHP systems not scaling well eventually came around to bite us &#8211; our systems are sprawling. Login systems are disconnected, disparate databases that should be unified are spread all the place. Instead of a centralized content management system, we have dozens of loosely connected CMSs. From a certain perspective, this made sense, as much of what we do is not about running a single site, but a loose federation of barely related sites. At a journalism school, students, classes, and organizations demand one publication site after another, few of which have anything to do with one another.</p>
<p>But at a certain point, non-unified systems simply fail to scale. It&#8217;s not about traffic, but about consistency. You can&#8217;t require students and faculty to create new logins all over the place, and you can&#8217;t expect web developers to master dozens of different platforms that work in dozens of different ways. Over the past year, we&#8217;ve known it was time to consolidate as much as possible into a single, centralized framework or CMS. The scaling problem is organizational &#8212; too many parties, too many tools, too many different ways of doing things, too many cooks in the kitchen. A classic example of PHP spaghetti.</p>
<p>Quite a while ago, we realized that something had to give. We needed to rebuild everything in a single system &#8211; one that came with a foundation flexible enough to model everything the organization is and does, and to build any kind of web-based representation or tools we needed on top of that model. We needed something more than a typical CMS. We didn&#8217;t want to have to shoehorn parts into places where they don&#8217;t belong. We wanted a system to work for us, rather than against us.</p>
<h3>Framework vs. CMS</h3>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/blueprint.jpg" border="0" alt="Blueprint"  width="200" height="189" class="alignleft"  /> What&#8217;s the difference between a content management system and a framework? Look at it this way: If you write in a raw language, like PHP or Perl, it&#8217;s like going to Home Depot and buying lumber and nails. You have absolute flexibility, but you&#8217;re responsible for every square centimeter of the house you build. If you deploy a content management system, it&#8217;s like buying a house &#8211; you can rearrange the furniture, but you&#8217;re pretty much stuck with the floor plan.</p>
<p>A framework lies somewhere between those two poles &#8211; as if you&#8217;re buying parts of a pre-fab house. &#8220;Now I need walls. Now plumbing. Now kitchen appliances. Now air conditioning.&#8221; The nitty gritty stuff is taken care of, but you have full control over which pieces you use and how they fit together. &#8220;Now I need a commenting system. Now I need RSS. Now I need search. Now I need form validation.&#8221;</p>
<p>CMSs have a nasty habit of becoming inflexible. Editorial staff get tired of hearing &#8220;we can&#8217;t do x, y, or z because the CMS won&#8217;t let us.&#8221; CMSs make assumptions about how you work, and about how a site is structured. As long as you work within that set of assumptions, all is well. But try to bend a CMS to do things it wasn&#8217;t meant to do, and you open the door to failure.</p>
<p>For example, we do a ton of work with WordPress. WordPress assumes that the basic content type is the story, and that that story has a headline, summary, article body, and maybe a bit of metadata. WordPress is an amazing tool, ideally suited to publication-oriented sites such as blogs and focused publications. But building a custom database application involving arbitrary arrays of fields, or building custom workflow tools, would be a matter of bending WordPress in ways it wasn&#8217;t meant to be bent. You may or may not be successful, but you&#8217;ll probably never call your solution graceful. You&#8217;ll always be working against, not with WordPress&#8217; assumptions about the structure of your content. It&#8217;s true that WordPress is much more than just a blogging system &#8211; it&#8217;s a darn good CMS for a lot of site types. But you wouldn&#8217;t use it to be build an equipment checkout system, or an alumni database, or an application processing system. Its limitations come from its assumptions.</p>
<p>In contrast, a framework is a <em>toolkit</em> you use to build the CMS that matches your organization&#8217;s specific needs. No assumptions, just tools and conventions you can use to model data structures and create a workflow based on those structures. A framework takes care of much of the heavy lifting involved in the creation of highly customized web apps, so you don&#8217;t have to pour countless hours into things like fighting spam, managing fine-grained permissions, building <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a> tools, etc.</p>
<p>Because a framework works at a lower level than a CMS, it generally has a steeper learning curve. In exchange for that learning curve, you get more flexibility as your organization changes, grows, and scales. It&#8217;s a middle ground between (on one hand) raw code that makes no assumptions but leaves you responsible for every bit, and (on the other) a full-blown CMS that makes too many assumptions about content types, and often feels convoluted and/or limiting (not to mention bloated, which most major  CMSs are).</p>
<p>There are <a href="http://en.wikipedia.org/wiki/Web_application_framework">web application frameworks</a> written in many languages. PHP has Cake, Symfony, Zend and others. Ruby is famous for <a href="http://www.rubyonrails.org/">Rails</a>. Perl has Catalyst and Gantry. Python has Zope, TurboGears, and, in recent years, <a href="http://www.djangoproject.com/">Django</a>. I haven&#8217;t done enough work with frameworks to be able to offer meaningful side-by-side comparisons, but I can tell you what it&#8217;s been like for a PHP guy to learn Django over the past six months.</p>
<h3>Starting From Scratch</h3>
<p>Here&#8217;s why PHP is so popular: You don&#8217;t have to learn much up-front. Start with an HTML page, drop in one measly function call, and you get immediate gratification. Need to do something else? Look up another function and drop it in. Over time, you get a head-full of function calls you can use in a pinch, and get to call yourself a programmer. It&#8217;s a double-edged sword. The fact that PHP takes no real study to become productive means there are millions of PHP developers who don&#8217;t have a grasp of &#8220;real&#8221; programming concepts. Like me. That doesn&#8217;t mean we aren&#8217;t productive, but it does mean we tend to build things in non-optimal ways under deadline pressure. And we tend to build things that turn around and bite us in the ass when organizations and data models grow, change, and evolve, because our code is littered with secrets and mysteries, and because we lack the foundations needed to be &#8220;real&#8221; programmers. I&#8217;m generalizing grossly (and being unnecessarily self-deprecating) to make a point.</p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/framework.jpg" border="0" alt="Framework"  width="200" height="227" class="alignright"  /> For me, learning a framework has been another story. There is no &#8220;instant gratification&#8221; entry point. You need to have a grasp of the language the framework is written in. For Django, that means learning some Python &#8211; at the very least lists, dictionaries and tuples. You need to learn that language&#8217;s programming structures &#8211; how it handles conditionals, loops, I/O, etc. You need to have some basic grounding in object-oriented programming principles &#8211; something I&#8217;ve simply never gotten around to.  In most cases &#8211; certainly in Django &#8211; you need to learn <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a> (model view controller) or in Django&#8217;s case <a href="http://docs.djangoproject.com/en/dev/faq/general/#mtv">MTV</a> (model template view) principles. And you need to learn the framework itself. How it thinks, how data moves through the system, where to look when things go wrong.</p>
<p>Finally, you need to know how to deploy. Because PHP is built into virtually every Apache host out there, deployment is something most PHP devs don&#8217;t have to think about. For Rails or Django, it&#8217;s a different story. Suddenly you&#8217;re compiling apache modules, building database bindings, configuring the web server&#8230; or looking around for a host who&#8217;s done all of that for you.</p>
<p>I signed up for an online Python course through University Extension. I spent many, many hours reading <a href="http://docs.djangoproject.com/en/dev/">documentation</a>, blog posts, and watching tutorial videos. I went through the official tutorials, and struggled to get development environments working both locally and on production servers.</p>
<p>Nothing about it was easy. Which is ironic for a system designed to make you more productive. After years of extreme productivity, I felt like I had been thrown back to Square One, and was starting my web development education all over again. Painful, but much-needed. Only after I started to assimilate and internalize the absolute elegance of the Django <em><a href="http://www.aolsvc.merriam-webster.aol.com/dictionary/weltanschauung">weltanschauung</a></em> did I realize just how bad the systems I&#8217;d built over the years really were &#8211; both from data modeling and coding perspectives. I needed to completely re-think the way I was doing things. It was time for a hard reset.</p>
<p>After several months of diving in, experimenting, failing, getting frustrated, and finally succeeding, I realized:</p>
<ul>
<li>It&#8217;s all about the data model. Get this right and you win. Think long and hard about the data model your organization is built around, and build web apps around that. Get this right and you can build any view, any tool that will do right by the organization. Get it wrong and you&#8217;ll struggle forever.</li>
<li>Amateur approaches will only get you so far. Learning on a catch-as-can basis will only get you halfway there. You may be a hero in the short term, but in the long run, real accomplishments come from real programmers. It takes time to learn the bigger picture, but if you do it, you win.</li>
<li>As a PHP dev, I wasn&#8217;t used to having to spend long periods of time reading documentation. I read just enough to get each little job done. Django made me sit back and read everything. To grasp the gestalt of what I was dealing with before trying to move forward.</li>
<li>As long as you expect it to be easy, you&#8217;ll be disappointed. As with all things in life, there&#8217;s the easy way, and there&#8217;s the right way. The right way takes extra effort, but pays off in the end. Yes, Django will make you more productive and enable you to solve hard problems quickly &#8211; but only after you&#8217;ve put in the effort to wrap your head around completely new ways of doing things. The paradox is that Django (and Rails) claim to make web development easier. And it&#8217;s true &#8211; they do. But only after slogging through a long ramping-up period. More work up front in order to do less work later.</li>
</ul>
<p>I&#8217;ve been incredibly lucky to be allowed a big stretch of time to learn Python/Django on the boss&#8217; clock. The key is in getting people on board, convincing them that moving the organization forward means training time is required. You can&#8217;t just change languages/systems in mid-stream and expect everything to carry on at the same pace it has been. The larger organization has to feel the pain of the current systems as well, and therefore to support the time/expense of real training.</p>
<h3>Why Django?</h3>
<p>Since we were already a PHP shop, why wouldn&#8217;t we choose one of the existing PHP frameworks? Yes, we could have gone that route, but none of the PHP frameworks have the credibility or momentum of Rails or Django. I don&#8217;t want to say that PHP is a <em>bad</em> language, but it wasn&#8217;t built as an object-oriented language from the ground up. The web framework momentum today is in cleaner, more O-O  languages. And from what we could see, the PHP-based frameworks themselves didn&#8217;t look as <em>clean</em> as Rails or Django. We had learned the hard way, and were ready to move on.</p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/rails-1.png" border="0" alt="Rails-1"  width="87" height="112" class="alignleft"  /> To be fair, I&#8217;ve only experimented briefly with Ruby on Rails, and am not qualified to say a lot about it. What I do know is that there have been a lot of complaints about RoR scalability and stability over the past few years. I&#8217;m sure the Rails community would refute those claims as myths, but for whatever reason, they have been prevalent. And in my reading of half a dozen comparisons between the two frameworks, I haven&#8217;t yet found one that showed faster development times or better scalability for  RoR over Django. When you don&#8217;t have the resources to compare things side-by-side for yourself (how long would it take to learn enough about every framework on the market in order to do a truly objective comparison/analysis?), you have to lean on the <a href="http://www.djangoproject.com/weblog/2006/dec/06/comparisons/">opinion of developers</a> who actually have. And from what I can tell, most developers who have tried both <a href="http://jesusphreak.infogami.com/blog/why_django">prefer Django over Rails</a>.</p>
<p>The fact that the RoR community is much larger than Django&#8217;s was certainly a point in Rails&#8217; favor, but not enough to tip the scales for us.</p>
<p>One of the real &#8220;wins&#8221; for Django is in its automatically generated &#8220;admin&#8221; interface. Once your data models have been defined, a mini-CMS is built for you around that data model, with all of the form widgets properly reflecting the models&#8217; relationships. If a field is a ForeignKey to another model, you get a picklist of that foreign model&#8217;s instances. If a field is a DateTime, you get slick little date/time pickers. If a field describes a many-to-many relationship with another model, the admin gives you a combo box. If a field is designated required, the right database constraints and field validations are put in place automatically.</p>
<p>The Django admin isn&#8217;t perfect and isn&#8217;t suitable for all tasks, but for the most part it &#8220;just works,&#8221; and saves you tons of time. In most cases, you can forget about ever having to write CRUD apps. In the journalism context, it means the developer can sit down with the reporter, get a good handle on the data models that describe the feature, and the journalist can start entering data immediately, while the developer continues work on the public-facing site.</p>
<p>People will tell you &#8220;Django is a framework, not a CMS.&#8221; That&#8217;s true, but the presence of the admin means you essentially get a CMS for free, alongside the framework. The admin is a huge win for Django.  If the Admin doesn&#8217;t serve a particular purpose, no problem &#8211; build your own custom workflow on top of the model you&#8217;ve defined, outside of the Admin. Rails doesn&#8217;t have anything comparable, as far as I know.</p>
<p>On the flip side, Django is currently missing an equivalent of Rails&#8217; official &#8220;migrations&#8221; system, which helps keep database schemas in sync when an application&#8217;s data models change. Right now, it&#8217;s a mostly manual affair. However, there are currently three separate Django projects in the works to address this need. Thankfully, all three developers are now working together to bring their projects into a single unified solution, eventually to be bundled in Django core (listen to Russell Keith-Magee on <a href="http://www.thisweekindjango.com/twid/episode/44/this-week-in-django-44/">episode 44</a> of This Week in Django to learn more about why model migrations is an inherently hard problem).</p>
<p>Unlike Rails, no one complains about Django <a href="http://www.jonathanboutelle.com/mt/archives/2008/08/rails_being_sin.html">not scaling</a> to very high traffic situations, or about ongoing <a href="http://www.reddit.com/r/programming/comments/7dndb/switching_from_rails_to_django_why/">stability problems</a>. And no one complains about the project being run/controlled by difficult people. Django grew out of the real publishing needs of a real-world news publication trying to do difficult things on tight deadlines (hence &#8220;The web framework for perfectionists with deadlines.&#8221;) It may look like a small player, but it&#8217;s battle-hardened. According to <a href="http://www.google.com/trends?q=django%2C+ruby+on+rails&amp;ctab=0&amp;geo=all&amp;date=all&amp;sort=0">Google Trends</a>, interest in Django over the past year has surpassed Rails. Something&#8217;s going on.</p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/djangorails.png" border="0" alt="Djangorails"  width="598" height="295" /></p>
<p><em>(The search above excludes &#8220;Reinhardt&#8221; to eliminate results on jazz guitarist Django Reinhardt)</em></p>
<p>To reiterate: I am <em>not</em> dissing on Rails. I haven&#8217;t used it enough to have an opinion, and I know it&#8217;s chock-full of excellent code and good practices. I just have the strong impression Django has an edge in terms of development speed, scalability, quality docs, and no-bull OSS leadership.</p>
<p>The <a href="http://www2.ljworld.com/news/2008/jun/17/new_foundation_django/">open sourcing of Django</a> and the creation of the <a href="http://www.djangoproject.com/foundation/">Django Software Foundation</a> opened the doors to wider adoption, and the September release of Django 1.0 &#8211; a version guaranteed to be production-ready and stable &#8211; will give bean counters confidence.</p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/appengine.jpg" border="0" alt="Appengine"  width="142" height="109" class="alignleft"  /> But nothing speaks to market confidence in Django more loudly than its blessing by Google. Google engineers have been <a href="http://www.youtube.com/watch?v=v1gTI4BOPUw">Python-centric</a> for years (Python creator Guido van Rossum works at Google). But when Google launched <a href="http://code.google.com/appengine/">AppEngine</a> &#8211; a cloud-based web app framework &#8211; they released it with just one deployment option: A somewhat modified version of Django. In their eyes, Django was not only good enough to run in heavy production, but also deemed easy enough to learn that they were willing to ask developers to learn it if they wanted to use AppEngine. Any other company would have looked for the lowest common denominator and made AppEngine work with the most popular languages/frameworks first, in order to snare the the most possible developers. Not Google &#8211; they let their love for the language and the framework speak for itself with the offering (of course AppEngine will support more languages in the future, but it&#8217;s been all-Django so far).</p>
<p>And oh yeah &#8211; Django has a <a href="http://djangopony.com/">magical pony</a>.</p>
<h3>Digging In</h3>
<p>In September, two of us spent a few days at Google headquarters in Mountain View for the first annual <a href="http://djangocon.org/">DjangoCon</a> &#8211; an international conference bringing together  heroes of the Django world with developers who traveled from all corners for the privilege. Heard a lot of great talks, learned heaps about Django best practices, met some great people, etc. Drank the Kool-Aid and got all fired up (video from the complete session is <a href="http://www.youtube.com/results?search_query=djangocon&amp;search_type=&amp;aq=f">available on YouTube</a>).</p>
<p><a onclick="window.open(\'http://birdhouse.org/blog/wp-content/uploads/2008/11/django-todo-datepicker.png\',\'popup\',\'width=627,height=457,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0\');return false" href="http://birdhouse.org/blog/wp-content/uploads/2008/11/django-todo-datepicker.png" rel="lightbox"><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/django-todo-datepicker-tm.jpg" border="0" alt="Django-Todo-Datepicker"  width="175" height="127" class="alignright"  /></a> Shortly after, I realized that part of my Django education needed to involve creating my own <a href="http://djangoplugables.com/">pluggable</a> Django application, so set to work on a multi-user, multi-group task list management system called django-todo (yes, I could have built a blog engine from scratch like most Django newbies do, but the truth is I have no intention of ditching WordPress any time soon, so doing that would only have been an academic exercise).</p>
<p>I was able to finish <a href="http://code.google.com/p/django-todo/">Django-todo</a> in about a week, and eventually got it up onto Google code, where it&#8217;s gotten some good feedback and a few dozen downloads. Even got a mention in <a href="http://www.thisweekindjango.com/twid/episode/40/this-week-in-django-40/">episode 40</a> of This Week in Django!</p>
<p>Django is renowned for its excellent documentation.  It&#8217;s true that the documentation is incredibly thorough and well-presented, but from a newbie&#8217;s perspective, I often found it frustrating, since you don&#8217;t know what to search on to find answers to specific problems. Trying to figure out how to make global variables available to my templates, I found nothing, because the answer is in Django&#8217;s &#8220;context processors.&#8221; All well and good if you already know that that&#8217;s what you need to search on. Similarly, quite a few of the code examples in the docs show interactions with the Django API through Python shell examples. Those examples do a good job of showing how the API interaction is occurring, but offer no help for the newbie trying to figure out how to actually implement things.</p>
<p>For example, I found the docs on Django&#8217;s <a href="http://docs.djangoproject.com/en/dev/topics/pagination/">pagination</a> functionality completely inscrutable. Shell examples? Why should users be submerged by that level of abstraction?  Show me a <em>web-based</em> example &#8211; with working snippets from model, view, and template -  applicable to common scenarios, which I can use as a starting point. Fortunately, I found an excellent <a href="http://www.ninjacipher.com/2008/08/04/new-django-paginator-example/">blog post</a> on Django pagination in the wild. After corresponding with the author a bit, I was able to modify the official documentation (which is bundled with every Django checkout), submit a <a href="http://code.djangoproject.com/ticket/9215">Trac ticket</a>, re-build the docs, submit an <tt>svn diff</tt> patch, and get it accepted into the official docs &#8212; which is why you see it there now.</p>
<h3>Hosting on Birdhouse</h3>
<p>If there&#8217;s one big downside to working with a framework based on a language that lacks the widespread support of PHP, it&#8217;s in deployment. When you work in PHP, you never have to wonder whether your host will support your app or framework of choice. PHP is like air or water &#8211; it&#8217;s just there.</p>
<p>If you want to deploy a site with Ruby on Rails, it&#8217;s a bit more difficult &#8211; you&#8217;ve either got to run/manage your own server, or find a web host that supports RoR out of the box. Luckily for Ror developers, the world&#8217;s most popular web hosting control panel <a href="http://cpanel.net/">cPanel</a> supports RoR natively in recent builds.</p>
<p><a onclick="window.open(\'http://birdhouse.org/blog/wp-content/uploads/2008/11/ra17.jpg\',\'popup\',\'width=300,height=168,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0\');return false" href="http://birdhouse.org/blog/wp-content/uploads/2008/11/ra17.jpg" rel="lightbox"><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/ra17-tm.jpg" border="0" alt="Ra17"  width="200" height="112" class="alignleft"  /></a> Django folks don&#8217;t have it so good. cPanel doesn&#8217;t yet support Django (though I&#8217;ve filed a <a href="http://bugzilla.cpanel.net/show_bug.cgi?id=6681">feature request</a>). So if you&#8217;re not managing your own server, you&#8217;ve got to choose from among a fairly limited <a href="http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts">selection</a>. Trouble is, I already run a cPanel-based <a href="http://hosting.birdhouse.org/">web hosting service</a>. If I was going to be able to deploy any of the sites I was already starting to build,  I wasn&#8217;t going to be able to wait around for official Django support in cPanel &#8211; I&#8217;d have to roll my own.</p>
<p>Fortunately, this problem had already been largely solved by <a href="http://m.andric.us/">@mandric</a>, who has been the hidden mentor/kick-starter behind Django activity at the J-School, and who wrote up an <a href="http://m.andric.us/post/43754517/django-python-with-cpanel">excellent summary</a> on setting up Django with cPanel. Based on his notes, I  was  able to get Django working on a cPanel host myself, and took my <a href="http://forums.cpanel.net/showpost.php?p=439009&amp;postcount=23">own notes</a> on the process. Today, Birdhouse Hosting officially <a href="http://hosting.birdhouse.org/faqs/web-hosting/django/">supports</a> Django hosting.  Looks like the first official Django user on Birdhouse will be a commercial wine database with a fairly sophisticated data model. More on that as the project comes along.</p>
<h3>A Django Shop</h3>
<p><a onclick="window.open(\'http://birdhouse.org/blog/wp-content/uploads/2008/11/django-reinhardt.jpg\',\'popup\',\'width=328,height=418,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0\');return false" href="http://birdhouse.org/blog/wp-content/uploads/2008/11/django-reinhardt.jpg" rel="lightbox"><img src="http://birdhouse.org/blog/wp-content/uploads/2008/11/django-reinhardt-tm.jpg" border="0" alt="Django-Reinhardt"  width="200" height="254" class="alignright"  /></a> Long story short, we finally came to a decision: The J-School is now officially a Django shop. For better or worse, we&#8217;re embarking on the long road toward unifying all of our toolsets around Python and Django. Which means A) Finally creating that mythical Grand Unified Database that represents the entire organization and B) Rebuilding a whole lot of tools around that new database. There&#8217;s a lot more web to the J-School than meets the eye &#8212; we&#8217;ve got a pretty expansive hidden intranet and a whole lot of less-visible sites to support that most J-School site visitors never see. It&#8217;s going to be a ton of work, and there will be plenty of bumps in the road, but I&#8217;m excited &#8212; not just at the prospect of getting all of our stuff into one bucket for a change, but at the learning opportunities this decision represents.</p>
<p>Despite the many frustrations I&#8217;ve had with the early stages of the learning process, Django development is <em>fun</em>. There&#8217;s nothing like watching things &#8220;just work,&#8221; the feeling that &#8220;web development was meant to be this way.&#8221; I look forward to not having to struggle against the expectations and limitations of a monolithic content management system, or of the ghostly chains of bad historical decisions. The process is going to rock as much as the final result.</p>
<p>Wish us luck.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2008/11/19/notes-on-a-django-migration/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>CMS Roundup</title>
		<link>http://birdhouse.org/blog/2008/03/12/cms-roundup/</link>
		<comments>http://birdhouse.org/blog/2008/03/12/cms-roundup/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 18:01:27 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[sxsw]]></category>
		<category><![CDATA[sxsw2008]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/2008/03/12/cms-roundup/</guid>
		<description><![CDATA[Loose notes from SXSW 2008 panel Content Management System Roundup, with: George DeMet Owner, Palantir.net Jeff Eaton Lullabot Tiffany Farriss Pres, Palantir.net Mike Essl Owner Operator, mike.essl.com Matthew McDermott Principal Consultant, Catapult Systems The perennial question on every web dev mailing list: What CMS should I choose? Expression Engine made a huge splash at this [...]]]></description>
			<content:encoded><![CDATA[<p>Loose notes from <a href="http://2008.sxsw.com/interactive/programming/panels_schedule/?action=show&#038;id=IAP060364">SXSW 2008</a> panel Content Management System Roundup, with:</p>
<p>George DeMet   Owner,   Palantir.net<br />
Jeff Eaton  Lullabot<br />
Tiffany Farriss   Pres,   Palantir.net<br />
Mike Essl   Owner Operator,   mike.essl.com<br />
Matthew McDermott   Principal Consultant,   Catapult Systems </p>
<p>The perennial question on every web dev mailing list: What CMS should I choose? Expression Engine made a huge splash at this year&#8217;s SXSW, but the Drupalites were out in force as well. This panel basically boiled down to MS Sharepoint (missed this, but not interested), EE, Drupal, and observations on a smattering of other systems. In a software category that offers around 600 choices, it&#8217;s impossible ever to represent the whole picture with anything approaching accuracy, but the conversation was still useful. </p>
<p><span id="more-2841"></span><br />
<strong>DRUPAL</strong></p>
<p>Built by the people who USE it (which has upsides and downsides). Dmitri &#8211; 12-year-old who does amazing and scary things with Javascript. Sony BMG, Lifetime, etc. contributing code back in. Oh, and Belgians (we got a lot of them). </p>
<p>Major sites/launches: Fast Company had to roll in around 100,000 person social network, and to port in all their existing content.  Lifetime Television. Lots of artists sites. MTV UK with lots of social networking. Inc. Mag. Us Mag. DC Comics + IBM recently launched a site. The Onion &#8211; The guy who built their Drupal site got hired by The Times.</p>
<p>3000 plugin modules. </p>
<p>Under the hood &#8211; six layers</p>
<p>Theme layer<br />
Views of content<br />
Content<br />
Users<br />
Modules<br />
Drupal core</p>
<p>Content layer: news, blogs, wikis, images, etc. </p>
<p>Building a drupal site is a process of identifying: 1) Who&#8217;s going to be using, 2) What kind of content will they be using</p>
<p>User roles, new content types. Start layering in capabilities and it all comes together nicely.</p>
<p>Drupal Sucks if &#8220;I just want to make a page&#8221; or &#8220;I want to make the next Twitter&#8221; &#8220;I just need another static site&#8221; or &#8220;Just another blog&#8221;</p>
<p>Drupal rocks if Lots of user-generated content, communities, many kinds of content, many views of content, Open APIs, web standards</p>
<p>Sony artist sites: Massive traffic boost, rolling out new artists fast, supporting open source, playing &#8220;It&#8217;s Britney, Bitch&#8221; on page load.</p>
<p><strong>EXPRESSION ENGINE</strong></p>
<p>Mr. T site in 2004 &#8211; built with not a spec of custom PHP &#8211; everything needed was built in. </p>
<p>You can define all kinds of custom fields for every content type. You can move custom fields around, define different sets for different content types.</p>
<p>Paid support staff in the forums. That&#8217;s huge. You know you&#8217;re going to get help when you need it. </p>
<p>See my EE notes for more.</p>
<p><strong>EVOLUTION OF CMS CHOICES</strong><br />
Art Institute of Chicago Case Study &#8211; they&#8217;ll use whatever CMS makes sense for any give project.</p>
<p>Round 1: Dreamweaver + custom CMS </p>
<p>Round 2: Serena Collage &#8211; Requires you to set up &#8220;contribution layouts&#8221; (content entry views). Collage is very metadata-driven. Spits out static HTML like Movable Type. Allows custom workflows. Includes version control, breadcrumbs, links as assets. Downsides: Expensive licensing, excruciatingly slow interface, not Mac-friendly, navigation, training developers, interferred with PHP code, no support for dynamic frameworks, end of life product.</p>
<p>Round 3: Drupal &#8211; They needed to ramp up to handle many thousands of images with smooth back-end. Lots of meta-data for each image. Fell in love with Drupal &#8211; solved all problems.  Needed ability to create lots of individualized artist sites with completely different themes (themed sub-sites)</p>
<p>Drupal pros: Powerful templating, remote data handling, great usre management, JQuery integration, solid, flexible framework, ability to write own modules. Drupal cons: Reverse proxy difficult in D5. Not great at handling edge cases (one-off exceptions).</p>
<p>Drupal is like getting a garbage truck full of legos &#8211; to really master it you need to learn what all the pieces are.</p>
<p>Every time someone would ask how to do something fancy in Drupal, they&#8217;d get a long answer, then the EE guy would say &#8220;EE has that built in.&#8221;</p>
<p>Is there a trend toward abstracting away the developer role. </p>
<p>Chirp &#8211; like Tumblr on your own server.</p>
<p>Sharepoint: License is $25,000 !!! (but they&#8217;re working on cheaper licenses)</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2008/03/12/cms-roundup/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Expression Engine 2.0</title>
		<link>http://birdhouse.org/blog/2008/03/08/expression-engine-20/</link>
		<comments>http://birdhouse.org/blog/2008/03/08/expression-engine-20/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 07:03:10 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[sxsw]]></category>
		<category><![CDATA[sxsw2008]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/2008/03/08/expression-engine-20/</guid>
		<description><![CDATA[Loose notes from SXSW 2008. Panel session on upcoming massive update to CMS Expression Engine 2.o: Now powered by code igniter &#8212; fully objeect-oriented OSS PHP framework. The ingredients of EE left uncooked. So now EE is built on a framework. This is a big deal. Code has merged, communities are merging. Faster, easier development [...]]]></description>
			<content:encoded><![CDATA[<p>Loose notes from <a href="http://2008.sxsw.com/">SXSW 2008</a>. Panel session on upcoming massive update to CMS <a href="http://expressionengine.com/">Expression Engine</a> 2.o:</p>
<p>Now powered by <a href="http://codeigniter.com/">code igniter</a> &#8212; fully objeect-oriented OSS PHP framework. The ingredients of EE left uncooked. So now EE is built on a framework. This is a big deal. Code has merged, communities are merging. Faster, easier development for Ellis Lab and for 3rd party devs. Instant increase in capabilities of both systems.<br />
<span id="more-2826"></span></p>
<p>Database: Abstracted querying. Tools, such as the database forge class. YOu can manipulate your database at the code level. </p>
<p>New libraries: Session, HTML generation, form generation, unit testing. JQuery and javascript libraries.</p>
<p>Obsessive about making CodeIgniter the fastest in its class. No bloat! Super efficient. Performance is highest priority.</p>
<p>Code Igniter is fully MVC.</p>
<p>EE 2.0 control panel just rocks. Super well designed, fast, smartly laid out. I want this! Includes a wiki engine.  Capable of building arbitrarily complex tools on the back-end. Control panel is completely redesigned and super-slick. Infinitely customizable. </p>
<p>Want to talk to people who have worked with both Drupal and EE. How do they stack up? I think you get a lot more &#8220;out of the box&#8221; with EE. And the support is supposed to be fanatical. </p>
<p>Timing is great &#8211; we&#8217;ve been debating on frameworks (Django) vs. CMSs (primarily EE)  for the past week at a &#8220;web summit&#8221; the three of us J-School web devs were holding. By letting us drop all of our existing PHP tools into place without modification, EE could provide a migration path that would be very painful if we were to move everything to Django. </p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2008/03/08/expression-engine-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Future Post</title>
		<link>http://birdhouse.org/blog/2007/11/22/future-post/</link>
		<comments>http://birdhouse.org/blog/2007/11/22/future-post/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 17:53:25 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/2007/11/22/future-post/</guid>
		<description><![CDATA[One of WordPress&#8217; little-used features is its ability to set a &#8220;drip date&#8221; &#8211; to set a post&#8217;s timestamp in the future so that it doesn&#8217;t go live on the site until that time comes around. Recently I was working on a site for a client who needed an Events section. For various reasons, I [...]]]></description>
			<content:encoded><![CDATA[<p>One of WordPress&#8217; little-used features is its ability to set a &#8220;drip date&#8221; &#8211; to set a post&#8217;s timestamp in the future so that it doesn&#8217;t go live on the site until that time comes around. Recently I was working on a site for a client who needed an Events section. For various reasons, I didn&#8217;t want to use any of the existing events plugins for WP &#8211; I just wanted to override the behavior for future-dated posts so that they&#8217;d go live on the site immediately, without waiting. </p>
<p>For the past year or so, I&#8217;ve virtually never found a case where anything I wanted to do with WP hadn&#8217;t already been solved by an existing plugin or tweak to template logic. But amazingly, I couldn&#8217;t find anything to override the default future post behavior. Posted on <a href="http://codex.wordpress.org/Mailing_Lists">WP-Hackers</a> about the problem and got a few solutions volunteered within a few hours (there&#8217;s nothing like a vibrant open source community). By far the most elegant was this one from the magical <a href="http://boren.nu/">Ryan Boren</a> (same guy who planted the semi-secret <a href="http://birdhouse.org/blog/2007/08/25/the-other-wp-cache/">WordPress t-shirt geocache</a>):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> setup_future_hook<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #666666; font-style: italic;">// Replace native future_post function with replacement</span>
 remove_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'future_post'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'_future_post_hook'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'future_post'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'publish_future_post_now'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> publish_future_post_now<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #666666; font-style: italic;">// Set new post's post_status to &quot;publish&quot; rather than &quot;future.&quot;</span>
 wp_publish_post<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'init'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'setup_future_hook'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Stick this in a php document in your plugins folder (remember not to include any whitespace after the closing php tag!), activate it, and create a post with a future timestamp. The post&#8217;s status field in wp_posts will be set to &#8220;publish&#8221; rather than &#8220;future&#8221; and it&#8217;ll go live on the site immediately.</p>
<p>You can also download this as a <a href="http://wordpress.org/extend/plugins/the-future-is-now/">ready-to-go plugin</a>. </p>
<p>Ryan&#8217;s too busy to host this trivial but super-useful plugin himself, but invited me to. I&#8217;ve submitted it to <a href="http://wordpress.org/extend/plugins/">WP-Plugins</a> and am awaiting a response &#8211; should be available there as well before long.</p>
<div class="music">Music: <a href="http://www.google.com/search?q=%22Daniel Mille%22">Daniel Mille</a> :: Les Minots</div>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2007/11/22/future-post/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenID: The Missing Link</title>
		<link>http://birdhouse.org/blog/2007/04/18/openid-the-missing-link/</link>
		<comments>http://birdhouse.org/blog/2007/04/18/openid-the-missing-link/#comments</comments>
		<pubDate>Thu, 19 Apr 2007 05:37:55 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/2007/04/18/openid-the-missing-link/</guid>
		<description><![CDATA[The OpenID light went on today, after a little setup and testing. I can now go to a blog or CMS or discussion board or other service that supports OpenID and type in &#8220;birdhouse.org&#8221; &#8211; no username, no password. Hit Return, and I&#8217;m in. If I&#8217;ve never been there before, I get standard user-level permissions. [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://openid.net/">OpenID</a> light went on today, after a little setup and testing. I can now go to a blog or CMS or discussion board or other service that supports OpenID and type in &#8220;birdhouse.org&#8221; &#8211; no username, no password. Hit Return, and I&#8217;m in. If I&#8217;ve never been there before, I get standard user-level permissions. If I&#8217;ve been there before and an admin has escalated my privs, I&#8217;m in as admin. Securely. How is this possible? </p>
<p>Created an ID for myself at <a href="https://www.myopenid.com/">MyOpenID</a> (though you could use any OpenID provider). Doing so gave me an identity URL through that provider. But here&#8217;s the dirty little OpenID secret that shouldn&#8217;t be a secret: The protocol supports &#8220;delegation&#8221; &#8212; by adding <a href="http://simonwillison.net/2006/Dec/19/openid/">a couple of meta lines</a> to the header of any URL you control (the birdhouse.org homepage, in my case), that URL can stand in as your identity URL. So when I typed &#8220;birdhouse.org&#8221; into a blog that supported OpenID earlier today, it fetched that URI and read its delegation headers. It then knew my &#8220;real&#8221; identity URL at the provider. The provider was able to determine that I was already logged into their service and pass &#8220;true&#8221; back to the blog I was trying to access. If I hadn&#8217;t been logged into MyOpenID at the time, I would have been prompted to log in there first, as a middle step in a seamless process. </p>
<p>Once authenticated to the blog, which had the WordPress <a href="http://verselogic.net/projects/wordpress/wordpress-openid-plugin/">OpenID plugin</a> installed, a user-level account in that blog was created automatically for me. The admin could then escalate my privileges to admin or whatever, and I&#8217;d still only need to type &#8220;birdhouse.org&#8221; to log in there as admin. And you can&#8217;t. So there.</p>
<p>Distributed single sign-on works. Totally elegant.</p>
<p>A while back, Six Apart launched <a href="http://www.sixapart.com/typekey/">TypeKey</a>, a single sign-on mechanism first made available for Movable Type blogs.  TK never really took off, for a couple of reasons. First, most blog owners had already discovered that requiring <em>any</em> kind of sign-on had a chilling effect on blog conversation &#8212; any barrier to commenting was too high, and tended to stop casual &#8220;stopper-by&#8221; conversation dead. Second, a lot of people didn&#8217;t want to put all their identity eggs in the Six Apart basket, didn&#8217;t feel comfortable having a corporation behind the critical task of identity maintenance. That assumption was bogus &#8211; TypeKey was always an open API &#8211; but a lot of people didn&#8217;t feel comfortable with it. TypeKey isn&#8217;t dead, but there aren&#8217;t many sites using it. </p>
<p>Lots of identity conversation at <a href="http://birdhouse.org/blog/index.php?s=sxsw2007">SXSW</a> this year, with <a href="http://openid.net/">OpenID</a> emerging as the &#8220;final&#8221; solution to  the distributed  identity problem. Ended up not attending that panel, but did get to eat sushi with <a href="http://www.netsquared.org/kaliya">Kaliya</a> &#8220;identity is a commons that no one can own&#8221; Hamlin, who (by some accounts) is single-handedly responsible for wrangling the monolithic corporate gargoyles (who all wanted to sell the world on their own proprietary silo identity systems and end up falling into the same hole that swallowed TypeKey), tying them up in a room and making them take mushrooms and hug until they agreed to adopt OpenID. Now <a href="http://dev.aol.com/aol-and-63-million-openids">even AOL</a> is an OpenID provider. </p>
<p>Free love works! </p>
<p><span class="minor">Thanks Milan</span></p>
<div class="music">Music: <a href="http://www.google.com/search?q=%22Linton Kwesi Johnson%22" target="_blank">Linton Kwesi Johnson</a> :: Brain Smashing Dub</div>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2007/04/18/openid-the-missing-link/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>katovichlaw.com</title>
		<link>http://birdhouse.org/blog/2006/10/09/katovichlawcom/</link>
		<comments>http://birdhouse.org/blog/2006/10/09/katovichlawcom/#comments</comments>
		<pubDate>Tue, 10 Oct 2006 05:05:50 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/2006/10/09/katovichlawcom/</guid>
		<description><![CDATA[Birdhouse Hosting welcomes katovichlaw.com: Katovich Law Group assists clients in integrating sustainable, socially and environmentally responsible practices into their businesses at every level. Katovich Law came to Birdhouse as a Plone site. The Plone CMS embeds its own server, and is therefore incompatible with Apache (without doing fancy port re-routing). Rather than go down that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hosting.birdhouse.org/">Birdhouse Hosting</a> welcomes <a href="http://katovichlaw.com/">katovichlaw.com</a>:</p>
<blockquote>Katovich Law Group  assists  clients in integrating sustainable, socially and environmentally responsible practices into their businesses at every level.<br />
</blockquote>
<p>Katovich Law came to Birdhouse as a <a href="http://plone.org/">Plone</a> site. The Plone CMS embeds its own server, and is therefore incompatible with Apache (without doing fancy port re-routing). Rather than go down that road (and because circumstances were going to make it very difficult to get a raw data dump or even a Plone backup from the old host), I offered to port the site to a more common/compatible CMS (Katovich had no particular attraction to any particular CMS &#8211; they were on Plone by circumstance).</p>
<p>Since the site had a pretty straightforward structure, decided to see if I could pull it off in WordPress (it&#8217;s what&#8217;s for breakfast). There were a few rough edges where WordPress&#8217; blog orientation made things a bit tricky, but overall, the experience underscored my confidence in WP&#8217;s flexibility. Had never had cause to dig into the parent/child relationship of WordPress <a href="http://codex.wordpress.org/Pages">pages</a>, but found them an incredibly easy way to organize hierarchical material and get logically nested URLs and nav sub-menus with zero effort.</p>
<p>Actually wanting to start <strike>mastering</strike> messing with Drupal, but this was a useful experiment.</p>
<div class="music">Music: <a href="http://www.google.com/search?q=%22Spaceways Incorporated%22">Spaceways Incorporated</a> :: Future</div>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2006/10/09/katovichlawcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMS &#8211; Build vs. Buy</title>
		<link>http://birdhouse.org/blog/2006/09/29/cms-build-vs-buy/</link>
		<comments>http://birdhouse.org/blog/2006/09/29/cms-build-vs-buy/#comments</comments>
		<pubDate>Fri, 29 Sep 2006 21:08:10 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/2006/09/29/cms-build-vs-buy/</guid>
		<description><![CDATA[A few months ago, I posted about the newsinitiative site I had spent most of the summer working on*, and mentioned that we had decided to build our own content management system for it from scratch. Promised to say more about the CMS &#8220;build vs. buy**&#8221; decision process we went through, but never got around [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago, I <a href="http://birdhouse.org/blog/2006/07/03/news21/">posted</a> about the <a href="http://newsinitiative.org/">newsinitiative</a> site  I had spent most of  the summer working on*, and mentioned that we had  decided  to build our  own content management system for it  from scratch. Promised to say more about  the CMS &#8220;build vs. buy**&#8221; decision process we went through, but never  got  around to it.  After installing <a href="http://www.thunderguy.com/semicolon/wordpress/search-meter-wordpress-plugin/">Search Meter</a> for WordPress a month ago,  discovered that people have  actually been searching this site for more info on that decision.</p>
<p>CMSs are a funny category of software. When you go to choose a word processor, you&#8217;ve got three or four serious options to consider (but it generally comes  down to Word). Image editor? Maybe a dozen (but it generally comes down to  Photoshop). There are usually more options for  server-side web application software. Survey package? Maybe a dozen. Blogging platform? Again, maybe a dozen (but it generally comes down to  Movable Type  and WordPress). But the game changes immensely when you start looking at  content management  systems.  </p>
<p><span id="more-2151"></span></p>
<p><a href="http://www.opensourcecms.com/">OpenSourceCMS</a> lets you try out  demo  installations of around 50 free CMSs. <a href="http://www.cmsmatrix.org/">cmsmatrix.org</a> lets you create feature  comparison tables on, wait for it, 643 different content management systems, ranging in price from  $0 to $200k (at the higher  end, you&#8217;re  paying for a team of  guys in jumpsuits to come to  your organization and live under the desks).</p>
<p>On the university web development mailing lists I&#8217;m on, &#8220;Which CMS is right for us?&#8221; is the single-most frequent topic of discussion, by a wide margin. Everyone needs one (or thinks  they need  one &#8212; I think they&#8217;re often deployed <a href="http://www.oreillynet.com/mac/blog/2005/07/avoiding_cms_data_lockin.html">unnecessarily</a>), but no one knows which way to jump.  There is probably no harder  software  choice  you  can make, for several reasons: </p>
<p>1) Unlike, say, email clients or HTML editors, you can&#8217;t  switch CMSs on a dime. Once you buy into a CMS, it&#8217;s <em>very</em> hard to switch to  another one. You have both data lock-in and systems lock-in (this alone is a very good reason to  think hard about whether you really need a CMS or just think you need one).</p>
<p>2) Actual needs can be very  difficult to quantify correctly in advance, and difficult to  correlate with product  descriptions.</p>
<p>3) It takes a lot of time to evaluate the options &#8211; you really need to install a CMS and work with it for a good while before you know whether it&#8217;s going to  work for you. But these things are not plug and play &#8212; it&#8217;s  not like  installing a piece  of  desktop software  and being able  to figure it out by studying the menu options. Bringing a new  CMS up to the point where you can even duplicate your normal workflow could take days or weeks of research and experimentation. </p>
<p>4) There are simply too many to choose from. If you have to go  through step #3 for each of half a dozen finalists, you&#8217;re talking about a major expenditure of  resources, just to make the decision. </p>
<p>CMSs are complicated beasts. Once you&#8217;ve made your  decision, the real development work begins, which generally involves understanding that system&#8217;s internal workflow, node hierarchy, templating and conditional languages, plugin options, data structures, etc.</p>
<p>So why are there so many CMSs on the market? Two factors contribute to the reason. One, because choosing from among  existing systems is so damn hard, and  so time-consuming. And two, because organizations&#8217; needs differ so radically. For a CMS to encompass everything anyone might want to do, it has to emerge &#8220;out of the box&#8221; as a very generalized,  rarefied system. There&#8217;s no such thing as a CMS that works the way you  want it to work as soon as it&#8217;s  installed. Making a CMS sit  up and do the tricks you  need it to do is going to require development time, period. Faced with these options, many organizations with in-house programming talent just throw up their hands and say screw it, let&#8217;s  just build something. How hard can it be?</p>
<p>In a sense, they&#8217;re right. A basic CMS is a pretty trivial programming task. Create, update, and display content in a database. But the devil is in the details. You probably need a user management system, with authority roles. You  need a workflow system to move content through draft, review, and published states. You  need a system to  manage incoming non-text media. You might need the ability to run surveys and polls, or to handle other kinds of form  data. If your content takes public comments, you need to be able  to manage  those comments on the back end (and deal with comment spam as it  arrives). You need it  to be able to generate email to authors and editors when content states change. You might want built-in blogging, and everything that comes along with that.  You want RSS feeds coming out of its ears. You need to deal with all those  nasty curly  quotes and other special characters being pasted out of MS Word  into your forms.  You need author bio pages. You  need  to accommodate static content sections, like &#8220;About This Site&#8221; and &#8220;Contact Us&#8221; (again, with spambot protection). You need form field validation to make sure authors are putting the right kind of data in the  right places. You might need to accommodate multiple-author bylines. You need pagination for longer  pieces of  content. You  need both a back-end and a public display system. You need  &#8220;E-mail  this page  to a friend&#8221; and &#8220;Print  this  page&#8221; functionality. You  need  to  think about security at every step of  the way. You need to  be able  to preview content before publishing. You need context-sensitive usage  documentation for all  of the authors and editors. You need  the ability to modify timestamps and story slugs. You need  to come up with a way to create clean URLs. You might need multi-level search (site-wide and project-wide). If you&#8217;ve got multiple developers, you need a code checkin/checkout system (CVS or SVN).  The list goes on, and every little piece piece needs  to be built by you &#8212; hopefully with enough forethought that  it  scales outwards nicely as you add features. </p>
<p>So once a group  has put in all of  the time required to get the results they want, they decide they may as well release it  into  the wild, either as  open source or commercial  software. And &#8220;walla,&#8221; we now have 643 systems to choose  from.</p>
<p>Our case called for a multiple team layout (the four participating universities), each with its  own project.  Some projects would have  custom Flash interfaces, others  would  not.  We needed  projects attached both to schools  and to semesters, so we could  refresh the whole  thing next time. We needed to handle multimedia content from many sources, in an elegant manner that didn&#8217;t require users to mess with paths or HTML. We needed the  ability to have user-selectable layout templates nested within master templates. We need the ability to embed custom HTML blobs, to alter story order, to embed custom database  applications with story bodies. And so on.</p>
<p>Given enough time, we probably could have  found an existing CMS that could  have been hammered into shape. But the clock was ticking, and our experiments with existing CMSs were showing that the research and discovery process was going to take too  long. If we built it  ourselves, we reasoned, we&#8217;d  grok every  square  millimeter of  the project,  and be  able  to  tweak anything without having to study docs or hang out in forums. </p>
<p>After several  weeks, we drew a line in the  sand and said &#8220;We can build this.&#8221; Almost immediately, we  started getting feedback from people who had  been in the same boat, and either vehemently agreed  or  disagreed  that we had  taken the right approach. Arguments in favor  were pretty much  in line with our  own reasoning.  Arguments against included things we already knew, such as the fact  that  we wouldn&#8217;t  benefit from free security and feature enhancements  and would not be able to  take  advantage of existing plugins and modules  that could  save  us  a lot of time. All true, but in  the end, we  have no regrets. We even got  accused of  having a bad case of <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">Not  Invented Here</a>  syndrome (which simply wasn&#8217;t  true &#8211; we were just trying to do the right thing for the organization and for ourselves, and would  have gone with an existing solution if we had  thought it would be  easier).</p>
<p>Ultimately, I think the two-month  timeframe  it took  to construct our CMS from scratch was about what it would  have taken to  choose and implement  an existing CMS, so it was probably a wash, time-wise. </p>
<p>The fact that major news organizations have already inquired about adopting our CMS makes us proud. Ironically, in the end, I&#8217;m still not convinced that the site we produced warranted a CMS at all. We spent months developing our system. Formatting 100 or so pages manually inside a simple templating system would have taken a fraction of that. The number of pages you ultimately have to manage, the frequency of updates etc. needs to be considered very carefully when deciding whether you need a CMS at all (<em>don&#8217;t</em> adopt a CMS just because everyone else is doing it, or because you think it will  ipso facto make your life  easier &#8211; ye olde  permissions-based filesystem, favorite HTML editor, and templating system remain a <em>great</em> way to manage large amounts of  content in many contexts &#8212; that&#8217;s  what we did  for the <a href="http://birdhouse.org/blog/2006/08/22/new-j-school-site/">new  J-School site</a>,  and we couldn&#8217;t be happier).</p>
<p>One thing is clear: Anyone who could really master the whole CMS minefield could make a great living as a CMS consultant. Organizations need good, educated advice from people who have  been in lots of trenches. And they need it bad.</p>
<p>I&#8217;ve left a whole other category/approache out of  this discussion: Frameworks (Ruby on Rails, Cake, Symfony, Code Igniter, <a href="http://www.djangoproject.com/">Django</a>). We did spend time talking about frameworks vs. CMSs, and in retrospect, I  kind of  wish we had used one rather than build completely from scratch. But like CMSs, frameworks require quite  a bit of exposure developer/experience before you can really be productive,  so the same time constraints we faced pretty much kept  frameworks off the table. We went  with plain old PHP, which is what we know best. We&#8217;re now developing some in-house Django talent, which will probably guide our next big project.</p>
<p>Has  your organization been through the  build vs.  buy CMS decision? Which way did you go? Any regrets?</p>
<p><span class="minor">* No, we weren&#8217;t  responsible  for  the  visual design,  just  the CMS.</span></p>
<p><span class="minor">** When I say &#8220;buy&#8221; I&#8217;m being colloquial &#8211; if we had not done it ourselves we would have used an open source CMS such as Drupal.<br />
</span></p>
<p><!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/cms" rel="tag">cms</a>, <a href="http://www.technorati.com/tag/contentmanagement" rel="tag">contentmanagement</a>, <a href="http://www.technorati.com/tag/frameworks" rel="tag">frameworks</a>, <a href="http://www.technorati.com/tag/php" rel="tag">php</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2006/09/29/cms-build-vs-buy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>News21</title>
		<link>http://birdhouse.org/blog/2006/07/03/news21/</link>
		<comments>http://birdhouse.org/blog/2006/07/03/news21/#comments</comments>
		<pubDate>Mon, 03 Jul 2006 20:51:46 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Media]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Journalism]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/2006/07/03/news21/</guid>
		<description><![CDATA[Got pulled off my regular job a couple months ago to work full time on the Carnegie-Knight &#8220;Initiative for the Future of Journalism,&#8221; an aggregate effort by five of the top journalism schools to revamp and renew approaches to journalism, and ultimately to transform the way journalism is taught. As part of the planning for [...]]]></description>
			<content:encoded><![CDATA[<p>Got pulled off my regular job a couple months ago to work full time on the Carnegie-Knight &#8220;Initiative for the Future of  Journalism,&#8221; an aggregate effort by five of the top journalism schools to revamp and renew approaches to journalism, and ultimately to transform the way journalism is taught.</p>
<blockquote>As part of the planning for the initiative, the five participating deans drafted a vision for change that seeks to renew the mission of schools of journalism much the same way that schools of business, medicine and law have renewed themselves at different junctures in history. </blockquote>
<p>Online now is a <a href="http://newsinitiative.org">starter/brochure site</a>, and currently all of the advance reportage is happening through external blogs. But a compadre and I (yes, we have two webmasters at the jschool now!) have been hard at work building a custom content management system* to meet the project&#8217;s fancy multimedia and nested template needs &#8212; the largest pure programming job I&#8217;ve ever been involved with, and the first time I&#8217;ve done any kind of team programming &#8212; a very satisfying experience. We&#8217;ll be rolling out the &#8220;official&#8221; site on top of our CMS later this summer. For now, the reporting fellows are scattered all over the globe, gathering material.</p>
<p>The project was recently blogged at Dan Gillmor&#8217;s <a href="http://citmedia.org/blog/2006/06/23/student-journalists-major-league-project">Center for Citizen Media</a>, at <a href="http://www.boingboing.net/2006/06/27/future_of_journalism.html">Boing-Boing</a> and also at <a href="http://utterlyboring.com/archives/2006/07/01/great_journalis.php">Utterly Boring</a>, though the interesting stuff is yet to come, once the story packages are completed by the fellows and we wrap up the CMS.</p>
<p><span class="minor">* Will have  to post separately sometime on the old  build vs. buy CMS question.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2006/07/03/news21/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Hosting FAQs on WordPress</title>
		<link>http://birdhouse.org/blog/2006/01/25/hosting-faqs-on-wordpress/</link>
		<comments>http://birdhouse.org/blog/2006/01/25/hosting-faqs-on-wordpress/#comments</comments>
		<pubDate>Wed, 25 Jan 2006 08:16:31 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.birdhouse.org/wordpress/?p=1835</guid>
		<description><![CDATA[Overdue for a thorough going-over of the Hosting FAQs, but before I dove in, wanted a clean publishing back-end for them (I&#8217;ve been maintaining them through phpMyAdmin out of laziness &#8212; the thought of building yet another CRUD back-end fills me with dread). Also wanted to build in a search engine for users. Flirted with [...]]]></description>
			<content:encoded><![CDATA[<p>Overdue for a thorough going-over of the <a href="http://hosting.birdhouse.org/faqs/">Hosting FAQs</a>, but before I dove in, wanted a clean publishing back-end for them (I&#8217;ve  been maintaining them through <a href="http://www.phpmyadmin.net/">phpMyAdmin</a> out of laziness &#8212; the thought of building yet another <a href="http://en.wikipedia.org/wiki/CRUD_%28acronym%29">CRUD</a> back-end fills me with dread). Also wanted to build in a search engine for users. Flirted with the thought of making the FAQs a Movable Type site, but decided to try something new and employ <a href="http://wordpress.org/">WordPress</a> as a CMS instead.<br />
<span id="more-1835"></span><br />
Quickly realized that hacking an existing theme to match the current templates was more work than it was worth. Started from scratch with the <a href="http://codex.wordpress.org/Blog_Design_and_Layout#Themes_and_Templates">theme docs</a> and built a fresh theme from raw ingredients &#8211; no content on index page, entries grouped by category, no comments or RSS, clean URLs. About half a day&#8217;s work, and I had a clean CMS. Another four hours to clean up all the content and write a couple new FAQs (<a href="http://hosting.birdhouse.org/faqs/mail_quota/">Managing Mail Quotas</a> and <a href="http://hosting.birdhouse.org/faqs/ftp/">Traditional FTP</a>), and we&#8217;re live. </p>
<p>Interesting to learn how template inheritance works in WP &#8211; it&#8217;s not at all obvious from studying template code which parts of a site will be handled by which templates. For example, a link to a content page will be handled by the <em>index</em> template <em>unless</em> a single.php template is present, in which case the exact same link will be handled by that template instead. And so on. Unintuitive at first, but it&#8217;s part of what makes the system so flexible.</p>
<p>Biggest hangup was in trying to properly format content that included HTML or  PHP snippets  (text formatting options in Movable Type are much better at handling this kind of thing). Solved with Priyadi&#8217;s <a href="http://priyadi.net/archives/2005/09/27/wordpress-plugin-code-autoescape/">Autoescape</a> plugin.</p>
<p>Anyway, an interesting learning experience. Also currently working with another WordPress site: <a href="http://citmedia.org/blog/about/about-dan-gillmor/">Dan Gillmor</a> recently launched  the <a href="http://citmedia.org/blog/">Center for Citizen Media</a> out of the J-School, and I&#8217;ve been working with him on that.</p>
<div class="music">Music: <a href="http://www.google.com/search?q=%22John Lurie%22">John Lurie</a> :: Nose Punch (Short Version)</div>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2006/01/25/hosting-faqs-on-wordpress/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Avoiding CMS Data Lock-in</title>
		<link>http://birdhouse.org/blog/2005/07/02/avoiding-cms-data-lock-in/</link>
		<comments>http://birdhouse.org/blog/2005/07/02/avoiding-cms-data-lock-in/#comments</comments>
		<pubDate>Sat, 02 Jul 2005 16:11:42 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.birdhouse.org/wordpress/?p=1628</guid>
		<description><![CDATA[ORA blog: Avoiding CMS Data Lock-in, on how I decided to use Smarty Templates rather than a full content management system for the coming J-School site rebuild. Music: 13th Floor Elevators :: Reverberation]]></description>
			<content:encoded><![CDATA[<p>ORA blog: <a href="http://www.oreillynet.com/pub/wlg/7315">Avoiding CMS Data Lock-in</a>, on how I decided to use <a href="http://smarty.php.net/">Smarty Templates</a> rather than a full content management system for the coming J-School site rebuild.</p>
<div class="music">Music: <a href="http://www.google.com/search?q=%2213th Floor Elevators%22">13th Floor Elevators</a> :: Reverberation</div>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2005/07/02/avoiding-cms-data-lock-in/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Skookum Tools: WordPress, VideoCue, Dashboard</title>
		<link>http://birdhouse.org/blog/2005/06/08/skookum-tools-wordpress-videocue-dashboard/</link>
		<comments>http://birdhouse.org/blog/2005/06/08/skookum-tools-wordpress-videocue-dashboard/#comments</comments>
		<pubDate>Wed, 08 Jun 2005 20:27:45 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.birdhouse.org/wordpress/?p=1599</guid>
		<description><![CDATA[As WordPress has evolved and grown itself a larger, more supportive community and a larger body of plugins, I&#8217;ve become increasingly enamored of it, using it for more side projects. I also love that my hosting customers can install a WordPress blog with literally three clicks from their cPanel interfaces. On Monday I hooked up [...]]]></description>
			<content:encoded><![CDATA[<p>As <a href="http://wordpress.org/">WordPress</a> has evolved and grown itself a larger, more supportive community and a larger body of plugins, I&#8217;ve become increasingly enamored of it, using it for more side projects. I also love that my hosting customers can install a WordPress blog with literally three clicks from their cPanel interfaces. On Monday I hooked up with <a href="http://photomatt.net/">Matt Mullenweg</a> (co-creator of WordPress) for lunch, who got me totally juiced up about the advanced capabilities of WP. The biggest thing that&#8217;s held me back from a full-scale migration from MovableType is the fact that WP still doesn&#8217;t have multi-blog capabilities built in from the ground-up. At the J-School I have about 300 users scattered across 20+ blogs, all with varying levels of permission. WP has nothing like this&#8230; or so I thought. Turns out there&#8217;s an alpha version of a <a href="http://mu.wordpress.org/">multi-user WordPress</a> out there. Apparently, WordPress-mu is pretty much production quality despite being listed as alpha. Need to check that out. </p>
<p>Mullenweg, FWIW, is one of the sweetest, most charming guys you could hope to meet. Was very interested to learn that <a href="http://www.cnet.com/">c|net</a> uses WP (with a simple caching plugin) for a huge number of public publishing projects. Last I heard was that c|net had basically invented the massive Vignette CMS. Very interesting to learn they&#8217;ve basically abandoned their own baby in favor of simple, lightweight, open source tools.</p>
<p>Yesterday hooked up with Simon Clarke of <a href="http://varasoft.com/">Vara Software</a> &#8212; I know Simon from the  <a href="http://adamation.com/">Adamation</a> days (can&#8217;t believe there&#8217;s still a web site there), where he and another engineer were responsible for personalStudio (BeOS video editing application, later released for Windows). Vara is doing some really cool stuff, and I&#8217;ve decided to stop using Channel Storm&#8217;s <a href="http://varasoft.com/">LiveChannel</a> for J-School webcasting and switch to Vara&#8217;s WireCast. It&#8217;s that cool, and won&#8217;t result in any loss of functionality. Also got a personal demo of Vara&#8217;s <a href="http://varasoft.com/products/videocue/">VideoCue</a> &#8212;  teleprompter software that also takes camera input, lets you mix in images and titles, output to QuickTime, and optionally post results directly to a blog. <a href="http://www.jumpropenet.com/educational_products.htm">Skookum</a> stuff. </p>
<p>Just emerged from a couple of sessions on building <a href="http://www.apple.com/macosx/features/dashboard/">Dashboard</a> Widgets and am totally fired up. Just need to clear a few days (yeah, right) and go for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2005/06/08/skookum-tools-wordpress-videocue-dashboard/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MovableType 3 Sting</title>
		<link>http://birdhouse.org/blog/2004/06/04/movabletype-3-sting/</link>
		<comments>http://birdhouse.org/blog/2004/06/04/movabletype-3-sting/#comments</comments>
		<pubDate>Fri, 04 Jun 2004 10:19:34 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://www.birdhouse.org/wordpress/?p=1233</guid>
		<description><![CDATA[Completely sick of the comment spammers. MT-Blacklist is great at what it does, but only works after a string has been blacklisted, so every morning brings a heap of new garbage, &#8220;flies buzzing around my eyes, blood on my saddle.&#8221; Is the only viable long-term solution comment registration? To get that, you have to move [...]]]></description>
			<content:encoded><![CDATA[<p>Completely sick of the comment spammers. <a href="http://www.jayallen.org/projects/mt-blacklist/">MT-Blacklist</a> is great at what it does, but only works <em>after</em> a string has been blacklisted, so every morning brings a heap of new garbage, &#8220;flies buzzing around my eyes, blood on my saddle.&#8221; Is the only viable long-term solution  comment registration? To get that, you have to move to MovableType 3.0. </p>
<p>The J-School has been looking forward to MT3 for a long time, hoping for new features that would make it easier to manage the 17 blogs and 260 authors (with ~50 new authors added per semester) we currently support. What we didn&#8217;t anticipate was the new licensing scheme that could not only become prohibitively expensive, but a logistical nightmare as we try to track and pay for licenses for each new author, semester to semester. diveintomark has an <a href="http://diveintomark.org/archives/2004/05/14/freedom-0">excellent piece</a> on why the &#8220;free enough&#8221; approach MT takes isn&#8217;t enough. Even if there&#8217;s a free version,  tie yourself to a corporation and you&#8217;re subject to all their whims, prat falls, and unfortunate licensing decisions. Unless SixApart responds soon to my query on custom licensing, we&#8217;ll either be moving on to <a href="http://wordpress.org/">WordPress</a>, a homebrew PHP/MySQL solution, or all of our blogs will be integrated into whatever CMS I choose for the rest of the J-School site this summer.</p>
<p>The licensing issue doesn&#8217;t apply to birdhouse &#8212; SixApart still offers a free version for non-commercial purposes. Disappointingly, MT3 offers almost no new features beyond comment registration. That&#8217;s okay &#8211; I&#8217;ve seen software revved to major numbers for minor changes plenty of times, and I wanted <em>some</em>  real solution to the comment spam problem. So I ran the upgrade tonight. A few technical misfires (apparently not uncommon)  &#8212; finally succeeded by installing the full version rather than the upgrade and then running the database upgrade script. Signed up for <a href="http://www.typekey.com/">TypeKey</a>, and received a token to drop into the new and improved back-end. Added the new DynamicComments directive to mt.cfg. But wait &#8212; after integrating the new comment registration tag into my templates, things fell apart. Not only were existing comments hidden from view, but when users clicked on the &#8220;Sign up to comment&#8221; link, they were told that birdhouse was not registered with TypeKey (it was). Screw it. Backpedal. Restore the original MT directory; fortunately it still worked, even though the upgrade script had modified some database structures.</p>
<p>MT3 is almost certainly  a no-go for the J-School, and I&#8217;m increasingly skeptical about using it for birdhouse. There seems to be an MT &#8211;&gt; WordPress <a href="http://www.rousette.org.uk/blog/archives/2004/04/11/why-wordpress/">exodus</a> afoot, and I&#8217;ll probably join it. Lots of content out there on migration strategies. </p>
<div class="music">Music: <a href="http://www.google.com/search?q=%22The Mekons%22">The Mekons</a> :: Funeral</div>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2004/06/04/movabletype-3-sting/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Speeding Up Movable Type</title>
		<link>http://birdhouse.org/blog/2003/11/02/speeding-up-movable-type/</link>
		<comments>http://birdhouse.org/blog/2003/11/02/speeding-up-movable-type/#comments</comments>
		<pubDate>Mon, 03 Nov 2003 07:39:00 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[CMS]]></category>

		<guid isPermaLink="false">http://www.birdhouse.org/wordpress/?p=1034</guid>
		<description><![CDATA[Pardon the dust around here recently. Have been growing increasingly frustrated with the time it took to post a new entry &#8212; as long as 80 seconds, and around 60 for guests to leave a new comment. The latter was becoming a genuine problem because people would get impatient and hit the Post button repeatedly, [...]]]></description>
			<content:encoded><![CDATA[<p>Pardon the dust around here recently. Have been growing increasingly frustrated with the time it took to post a new entry &#8212; as long as 80 seconds, and around 60 for guests to leave a new comment. The latter was becoming a genuine problem because people would get impatient and hit the Post button repeatedly, so I&#8217;d end up with duplicate or triplicate comments.<br />
<span id="more-1034"></span><br />
This isn&#8217;t the fastest CGI server in the world (trying to garner enough <a href="http://hosting.birdhouse.org/">customers</a> to warrant an <a href="http://www.apple.com/xserve/">upgrade</a>), but I knew something wasn&#8217;t right. Post time had been increasing with the size of the database, which didn&#8217;t make sense since as a well-designed web app doesn&#8217;t care about the size of the database; the millionth entry should post as quickly as the first, pert near. Movable Type is exceptionally well designed, so I couldn&#8217;t believe it would contain a design flaw this glaring, and yet it was true; slower by the day, with just over a thousand entries. Other blogs with fewer entries on the very same server take only seconds to generate new entries. MT entry  URLs are padded to ten million posts; one has to wonder what the post time would be like after a decade of blogging, even on a superfast server. Decided to get to the root of the problem.</p>
<p>I had read various <a href="http://www.movabletype.org/support/index.php?act=ST&#38;f=14&#38;t=25221&#38;hl=speed&#38;s=3c44e58b3a760f954614b74472d2ed23">theories</a> about this in the MT forums. The most common suggestion is to not use MT Modules and includes. Instead, generate include files via Index Templates, then suck the output into your pages via PHP, SSI, or whatever you like. By putting re-usable content into index templates, custom MT tags still get properly parsed, but MT won&#8217;t need to generate the same data for every page each time the database is modified. Instead MT will crunch the include file once, and the http daemon will include it in the page at request time. I replaced all of my MT includes with PHP includes. Result: almost nothing. Post and comment time was virtually unchanged. MT modules were not at fault.</p>
<p>Next I tried removing everything fancy and stripping the templates down to &#8220;factory install.&#8221; No significant change. </p>
<p>A few times in the past, I&#8217;ve modified the timestamp of entries, which resulted in  their numerical order not matching their chronological order. I&#8217;ve often wondered if this fact was causing MT to do more work. The only way I could think of to test this cleanly was to export all entries, create a new test blog, import all entries (thus re-assigning the post IDs to each entry), and testing post and comment time again. Some success! The &#8220;virgin&#8221; blog took &#8220;only&#8221; 62 seconds to generate a new post,  and 40 seconds to leave a comment. Better, but still unacceptable. If I were to write a blogging system myself with PHP, post and comment time would be virtually nil, even if generating static pages like MT does.  I was looking for something closer to five seconds.</p>
<p>Thinking about what one user had said about the &lt;MTEntryArchive&gt; tag being slow, I went into the Archiving section of the config and disabled Monthly and Category archives. Unfortunately, I now got a build error with my Archives include, since MT is no longer maintaining these archive types. So I made the Monthly and Category archive lists into static PHP includes and tried again. Whoa! Post time decreased to 18 seconds and comment time to 15 seconds. Not quite what I was after, but it was at least within the realm of the acceptable. </p>
<p>However, this means that new posts are no longer added to the Monthly or Category pages automatically. My first thought was to use the <a href="http://mt-plugins.org/archives/mini/mtrebuild.php">MTRebuild</a> plugin to rebuild those archives once a night via cron, but of course that won&#8217;t work since I&#8217;ve disabled archiving for those two types. They can&#8217;t be rebuilt if MT isn&#8217;t aware of them. That means I&#8217;ll have to rebuild them manually from time to  time by turning archiving on for those two, rebuilding, and turning it off again.</p>
<p>So. I&#8217;ve achieved a significant speedup (leaving comments should be less frustrating now) but at the expense of some of the cooler automated features. I still consider this a big flaw in MT&#8217;s design, and hope it will be worked out in MT Pro.  </p>
<div class="music">Music: <a href="http://www.google.com/search?q=%22Daevid Allen%22">Daevid Allen</a> :: The Switch Doctor</div>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2003/11/02/speeding-up-movable-type/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>MovableType as CMS</title>
		<link>http://birdhouse.org/blog/2002/10/19/movabletype-as-cms/</link>
		<comments>http://birdhouse.org/blog/2002/10/19/movabletype-as-cms/#comments</comments>
		<pubDate>Sat, 19 Oct 2002 10:00:12 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[CMS]]></category>

		<guid isPermaLink="false">http://www.birdhouse.org/wordpress/?p=517</guid>
		<description><![CDATA[Preparing a database-backed site for J-School students to produce election-night coverage, and it occurred to me that I might not be giving MovableType enough credit as a generic publishing solution rather than pure blogging tool. With some deeper modifications to templates, removal of comments and calendaring, rearranged permalinks etc., there&#8217;s no reason MovableType can&#8217;t function [...]]]></description>
			<content:encoded><![CDATA[<p>Preparing a database-backed site for J-School students to produce election-night coverage, and it occurred to me that I might not be giving MovableType enough credit as a generic publishing solution rather than pure blogging tool. With some deeper modifications to templates, removal of comments and calendaring, rearranged permalinks etc., there&#8217;s no reason MovableType can&#8217;t function as a full CMS. The Categories feature plays perfectly for creating &#8220;Departments&#8221; for the site. So far so good, but there are two problems with the scenario.<br />
<span id="more-517"></span><br />
1) There is no way to weight certain stories so they aren&#8217;t pushed down the page as new stories are published. That&#8217;s how slashdot works &#8211; it&#8217;s not how CNN.com works &#8211; stories need to be at  the top of the page if they&#8217;re important, not just because they&#8217;re new. </p>
<p>2) Blogging software assumes that the person who publishes the story is also the author. But in our case, we&#8217;ll have a bunch of people writing but only two &#8220;techie&#8221; people publishing their stories. We need actual author bylines, and don&#8217;t care about who actually posted the piece. There&#8217;s no way to add a &#8220;byline&#8221; field without hacking the actual MT engine and modifying the database. Go down that road and you instantly cut yourself off from future updates (you just  forked the code). I want to limit modifications to things I can do with  templates and plugins. To get around this, we&#8217;ll simply put the byline into the story body manually. Inelegant from a database perspective, but it will get the job done.</p>
<p>I&#8217;m beginning to realize how  flexible this could be as a generic publishing solution for lots of j-school  students &#8211; it&#8217;s near perfect &#8211; MT just needs a few more generic CMS features to replace the more specific blogging features.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2002/10/19/movabletype-as-cms/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
