<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0"><channel><title>Playground Blues feed</title><link>http://playgroundblues.com/posts/</link><description>Playground Blues posts feed.</description><language>en-us</language><lastBuildDate>Sun, 25 Oct 2009 22:31:29 -0600</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/PlaygroundBlues" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>
  Interface harmony


</title><link>http://nathanborror.com/posts/2009/oct/25/interface-harmony/</link><description>


  &lt;p&gt;Interface consistency is one of those things that, if done correctly, should go unnoticed. I&amp;#8217;ve slowly been working on a new interface for a &lt;a href="http://readernaut.com" title="Readernaut"&gt;side project&lt;/a&gt; and thought it&amp;#8217;d be a treat to share my approach.
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/4044799031/sizes/o/"&gt;&lt;img src="http://farm3.static.flickr.com/2727/4044799031_7e01c461d0_m.jpg" title="Readernaut UI" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;Interfaces evolve based on the needs of people using them. Each task may require a different element. Common elements include buttons, dialogs, drop-downs, select boxes, checkboxes, input fields, etc. These elements are like notes in a composition seeking harmony.
&lt;/p&gt;
&lt;p&gt;To ensure harmony I&amp;#8217;ll arrange my elements on a single canvas and show the different levels of interaction. By doing this I can easily spot inconstancies. This also helps build a style guide for future elements and interaction.
&lt;/p&gt;
&lt;p&gt;This is not groundbreaking by any means. Just thought I&amp;#8217;d share and help promote the practice :)
&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://nathanborror.com/posts/2009/oct/25/interface-harmony/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Sun, 25 Oct 2009 22:31:29 -0600</pubDate><guid>http://nathanborror.com/posts/2009/oct/25/interface-harmony/</guid></item><item><title>
  Working with Python and RabbitMQ


</title><link>http://playgroundblues.com/posts/2009/may/20/working-django-and-rabbitmq/</link><description>


  &lt;p&gt;I recently installed &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; to handle some message queuing needs at &lt;a href="http://readernaut.com"&gt;Readernaut&lt;/a&gt; and thought I&amp;#8217;d share how everything came together. If you&amp;#8217;d like to learn more about RabbitMQ please read the excellent &lt;a href="http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/"&gt;Rabbits and Warrens&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;To use RabbitMQ with python you need &lt;a href="http://barryp.org/software/py-amqplib/"&gt;amqplib&lt;/a&gt; because Rabbit uses the &lt;a href="http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol"&gt;AMQP&lt;/a&gt; standard. To make amqplib a little easier to use I needed a simple script that did three things:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
     Easy way to connect to RabbitMQ.
 &lt;/li&gt;
&lt;li&gt;
     Easy way to pull stuff out of the queue.
 &lt;/li&gt;
&lt;li&gt;
     Easy way to throw stuff into the queue.
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;#8217;s a project called &lt;a href="http://github.com/ask/carrot/tree/master"&gt;Carrot&lt;/a&gt; which handles all this and much more but it&amp;#8217;s a little too complex for what I&amp;#8217;m doing. All I needed was something very small, straightforward, and EASY.
&lt;/p&gt;
&lt;p&gt;After staring at Carrot for a few days I decided to distill down what I needed into a single script I&amp;#8217;m calling Flopsy (this is what happens when you&amp;#8217;re coding and watching a movie about &lt;a href="http://en.wikipedia.org/wiki/Beatrix_Potter"&gt;Beatrix Potter&lt;/a&gt;, right?). So here we go:
&lt;/p&gt;
&lt;p&gt;Step 1: Set global variables:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AMQP_SERVER = 'localhost'
AMQP_PORT = 5672
AMQP_USER = 'guest'
AMQP_PASSWORD = 'guest'
AMQP_VHOST = '/'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Step 2: Create a consumer (a script that consumes messages from the queue):
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from flopsy import Connection, Consumer
&amp;gt;&amp;gt;&amp;gt; consumer = Consumer(connection=Connection())
&amp;gt;&amp;gt;&amp;gt; consumer.declare(queue='books', exchange='readernaut', routing_key='importer', auto_delete=False)

&amp;gt;&amp;gt;&amp;gt; def message_callback(message):
...     print 'Recieved: ' + message.body
...     consumer.channel.basic_ack(message.delivery_tag)
&amp;gt;&amp;gt;&amp;gt;
&amp;gt;&amp;gt;&amp;gt; consumer.register(message_callback)
&amp;gt;&amp;gt;&amp;gt; consumer.wait()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Step 3: Create a publisher (a script that publishes messages to the queue):
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from flopsy import Connection, Publisher
&amp;gt;&amp;gt;&amp;gt; publisher = Publisher(connection=Connection(), exchange='readernaut', routing_key='importer')
&amp;gt;&amp;gt;&amp;gt; publisher.publish('Test message!')
&amp;gt;&amp;gt;&amp;gt; publisher.close()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And there we go! Flopsy weighs in at under 80 lines of code and it can be found on &lt;a href="http://github.com/nathanborror/flopsy"&gt;Github&lt;/a&gt;. Most of the above will make a lot more sense after reading the &lt;a href="http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/"&gt;Rabbits and Warrens&lt;/a&gt; article and investigating &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I just realized, this isn&amp;#8217;t at all Django specific so my title is a little misleading (changing). That said, you could most certainly use Flopsy with straight up Python :) 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2009/may/20/working-django-and-rabbitmq/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Wed, 20 May 2009 18:00:00 -0600</pubDate><guid>http://playgroundblues.com/posts/2009/may/20/working-django-and-rabbitmq/</guid></item><item><title>
  Capturing content in Django templates


</title><link>http://playgroundblues.com/posts/2009/feb/28/capturing-content-django-templates/</link><description>


  &lt;p&gt;As a template designer there are times when you have structural code surrounding a block which is waiting on content from a child template. It may look something like:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;content_title&amp;quot;&amp;gt;
    {% block content_title %}{% endblock %}
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sometimes this block is never filled so ideally I want the &lt;code&gt;DIV&lt;/code&gt; element in this case gone. This isn&amp;#8217;t easy because there&amp;#8217;s no way to know whether content is headed towards the block so one solution that I&amp;#8217;ve used is:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{% block content_title_wrapper %}
    &amp;lt;div class=&amp;quot;content_title&amp;quot;&amp;gt;
        {% block content_title %}{% endblock %}
    &amp;lt;/div&amp;gt;
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This requires me to make an empty call to a wrapper block in a child template to clear out the div element. It&amp;#8217;s obviously gross because I end up with empty block calls all over child templates. Yuk!
&lt;/p&gt;
&lt;p&gt;Django community to the rescue! After asking around and some help from &lt;a href="http://lazypython.blogspot.com/" title="Alex Gaynor"&gt;Alex&lt;/a&gt;, &lt;a href="http://ericholscher.com/" title="Eric Holscher"&gt;Eric&lt;/a&gt;, and &lt;a href="http://traviscline.com/blog/" title="Travis Cline"&gt;Travis&lt;/a&gt; we stumbled upon &lt;a href="http://www.djangosnippets.org/snippets/545/" title="Django Capture"&gt;Django Capture&lt;/a&gt;, a django snippet created by kcarnold (Kenneth Arnold). Capture essentially takes a blob of content and makes it into a variable for you like so:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{% capture as content_title %}
    {% block content_title %}{% endblock %}
{% endcapture %}

{% if content_title %}
    &amp;lt;div class=&amp;quot;content_title&amp;quot;&amp;gt;{{ content_title }}&amp;lt;/div&amp;gt;
{% endif %}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This eliminates the need for all those crufty wrappers in child templates. I&amp;#8217;m sure there are other uses for this too, one being the ability to print content multiple times on the page like pagination before and after lists. Kenneth originally used the example of capturing content for translations. 
&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a &lt;a href="http://code.djangoproject.com/ticket/6378"&gt;ticket open&lt;/a&gt; with some thoughts on adding this functionality to the existing &lt;code&gt;with&lt;/code&gt; tag which makes perfect sense. It&amp;#8217;d be great if we could hash this out and get it into Django proper because I&amp;#8217;m sure others would find it useful.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2009/feb/28/capturing-content-django-templates/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Sat, 28 Feb 2009 09:00:00 -0600</pubDate><guid>http://playgroundblues.com/posts/2009/feb/28/capturing-content-django-templates/</guid></item><item><title>
  What&amp;#39;s next


</title><link>http://playgroundblues.com/posts/2008/dec/13/whats-next/</link><description>


  &lt;p&gt;Does it make sense to reinvent the wheel every time we sit down to a new project? No. My work echoes my past and I stand by it. Some say, &amp;#8220;that looks like Readernaut&amp;#8221; or &amp;#8220;that looks like Playground Blues&amp;#8221; and I say yes, they are me.
&lt;/p&gt;
&lt;p&gt;If it worked there it will work here. When a problem is solved I move on because each project has its fair amount of new problems and I&amp;#8217;d rather spend time on new, more interesting problems. This doesn&amp;#8217;t mean I don&amp;#8217;t improve on past solutions. Everything evolves with me.
&lt;/p&gt;
&lt;p&gt;We all bring our individual design style and solutions to the table. Projects are a collection of problems and if you quickly eliminate the solved problems you can dig your heals into the unsolved.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/dec/13/whats-next/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Sat, 13 Dec 2008 09:16:02 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/dec/13/whats-next/</guid></item><item><title>
  Save RAM with mobile middleware


</title><link>http://playgroundblues.com/posts/2008/oct/7/save-ram-mobile-middleware/</link><description>


  &lt;p&gt;A while back I wrote an article on how to &lt;a href="/posts/2008/feb/18/going-mobile/" title="Going mobile"&gt;set up a mobile site with Django&lt;/a&gt;. Currently I have a &lt;a href="http://www.slicehost.com" title="Slicehost"&gt;Slicehost&lt;/a&gt; account which includes 256MB of RAM. My resources are tight and I really dislike having another set of unnecessary Apache processes for a mobile site that, aside from different templates, is using the same code base. The solution is quite simple, write a middleware.
&lt;/p&gt;
&lt;p&gt;The following code checks the incoming request for &amp;#8216;m&amp;#8217; or &amp;#8216;mobile&amp;#8217; in the domain name. If it exists the &lt;code&gt;TEMPLATE_DIRS&lt;/code&gt; is replaced by a &lt;code&gt;MOBILE_TEMPLATE_DIRS&lt;/code&gt; setting:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class MobileMiddleware(object):
  def process_request(self, request):
    domain = request.META.get('HTTP_HOST', '').split('.')

    if 'm' in domain or 'mobile' in domain:
      settings.TEMPLATE_DIRS = settings.MOBILE_TEMPLATE_DIRS
    else:
      settings.TEMPLATE_DIRS = settings.DESKTOP_TEMPLATE_DIRS
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&amp;#8217;ll notice this requires you to also have a &lt;code&gt;DESKTOP_TEMPLATE_DIRS&lt;/code&gt; (or whatever you want to call it) so you can switch back to the desktop version.
&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re using any sort of caching you&amp;#8217;ll want be sure and change &lt;code&gt;CACHE_MIDDLEWARE_KEY_PREFIX&lt;/code&gt; when you change to mobile templates and back again.
&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll probably want to place this middleware after Session and Authentication Middleware and before the Cache Middleware like so:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'playgroundblues.middleware.MobileMiddleware',
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Go Green! Save RAM! (kidding)
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/oct/7/save-ram-mobile-middleware/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Tue, 07 Oct 2008 18:00:00 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/oct/7/save-ram-mobile-middleware/</guid></item><item><title>
  Message Queuing imports


</title><link>http://playgroundblues.com/posts/2008/sep/5/message-queuing-imports/</link><description>


  &lt;p&gt;Last week I ran into some problems dealing with large book imports on &lt;a href="http://readernaut.com"&gt;Readernaut&lt;/a&gt;. I tested the system for around 50-100 books but had no idea people would upload lists of 900+ books. This begged the question, how do you handle importing very large sets of data before the browser times out?
&lt;/p&gt;
&lt;h3&gt;Brief example&lt;/h3&gt;
&lt;p&gt;User uploads a list of 1000 ISBNs to be imported into their library. Each book, if not already in the system, needs to be imported via another service like Amazon.
&lt;/p&gt;
&lt;h3&gt;Solution 1: Threading&lt;/h3&gt;
&lt;p&gt;Use threading to push off the long running process to another thread while directing the browser to a status page. You could setup an Ajax request to periodically check on the status of the import and update a progress bar.
&lt;/p&gt;
&lt;p&gt;This solution is generally a bad idea. It&amp;#8217;s super easy to do and tests well in a development environment, but has scary consequences down the road, especially if you don&amp;#8217;t have a lot of server resources.
&lt;/p&gt;
&lt;h3&gt;Solution 2: Message Queuing&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Message_queue"&gt;Message queuing&lt;/a&gt; is a very basic asynchronous method of storing items in a queue to be processed later.
&lt;/p&gt;
&lt;p&gt;So for this instance I created a model called Message that has three fields:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Message(models.Model):
    user = models.ForeignKey(User)
    subject = models.CharField(max_length=100)
    message = models.TextField()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This allowed me to slurp in the list of ISBNs and break them out into 20 book chunks. Each chunk gets related to a user and a subject of &amp;#8220;book_import.&amp;#8221; Once it&amp;#8217;s finished I can send the user to a progress page where each chunk is processed one by one until they&amp;#8217;re gone. Here&amp;#8217;s a simple example of a progress view:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def book_import_progress(request):
    message_list = Message.objects.filter(user=request.user, subject='book_import')
    handle_message(message_list[0])
    if len(message_list) &amp;gt; 0:
        return render_to_response('books/progress.html', {}, context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/user/books')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;First we get a list of messages, then we process the first 20 books. If there are more messages to be processed we refresh the page otherwise we send the user to their books page.
&lt;/p&gt;
&lt;p&gt;Additionally it&amp;#8217;s super simple to Ajaxify the progress page by using Django&amp;#8217;s handy &lt;code&gt;request.is_ajax()&lt;/code&gt; and returning a JSON object with info on the progress of the import. Message Queuing is pretty handy for a lot of situations and Amazon even has a service for it called &lt;a href="http://www.amazon.com/Simple-Queue-Service-home-page/b?ie=UTF8&amp;amp;node=13584001"&gt;Simple Queuing Service&lt;/a&gt; (SQS). 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/sep/5/message-queuing-imports/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Fri, 05 Sep 2008 09:00:00 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/sep/5/message-queuing-imports/</guid></item><item><title>
  Creating a basic API with Django


</title><link>http://playgroundblues.com/posts/2008/aug/11/creating-basic-api-django/</link><description>


  &lt;p&gt;Creating a simple public API for your site is a lot easier than you may think with Django. You&amp;#8217;re basically just creating another view and serving it as XML or JSON instead of HTML. 
&lt;/p&gt;
&lt;h3&gt;Step 1) What&amp;#8217;s public?&lt;/h3&gt;
&lt;p&gt;Decide what you want to be public. The best answer is the stuff you&amp;#8217;re already displaying in your HTML templates. Then you need to create an entry in your url conf.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;url(r'^api/v1/(?P&amp;lt;username&amp;gt;[-\w]+)/notes/?$', 'readernaut.api.views.user_notes'),
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 2) Create the view.&lt;/h3&gt;
&lt;p&gt;In the case for &lt;a href="http://readernaut.com"&gt;Readernaut&lt;/a&gt; I wanted to provide an XML feed for users notes. Here is what the view looks like:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def user_notes(request, username):
    reader = get_object_or_404(User, username__iexact=username)
    note_list = Note.objects.filter(user=reader)
    context = { 'reader': reader, 'note_list': note_list }
    return render_to_response('api/note_list.html', context, context_instance=RequestContext(request), mimetype='application/xml')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is a simplified version of the view but, as you can see, you could easily add pagination and other hooks to handle ordering and such.
&lt;/p&gt;
&lt;h3&gt;Step 3) Create the template.&lt;/h3&gt;
&lt;p&gt;The view is pointing to the template &lt;code&gt;api/note_list.html&lt;/code&gt; so all we need to do is create that file and build out our XML schema. 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;notes version=&amp;quot;1.0&amp;quot;&amp;gt;
    {% for note in note_list %}
    &amp;lt;note&amp;gt;
        &amp;lt;note_id&amp;gt;{{ note.id }}&amp;lt;/note_id&amp;gt;
            &amp;lt;user&amp;gt;
            &amp;lt;username&amp;gt;{{ note.user }}&amp;lt;/username&amp;gt;
        &amp;lt;/user&amp;gt;
        &amp;lt;book_edtion&amp;gt;
            &amp;lt;title&amp;gt;{{ note.book_edition }}&amp;lt;/title&amp;gt;
            &amp;lt;isbn&amp;gt;{{ note.book_edition.isbn }}&amp;lt;/isbn&amp;gt;
        &amp;lt;/book_edtion&amp;gt;
        &amp;lt;body&amp;gt;&amp;lt;![CDATA[{{ note.note }}]]&amp;gt;&amp;lt;/body&amp;gt;
        &amp;lt;page_reference&amp;gt;{{ note.page_reference }}&amp;lt;/page_reference&amp;gt;
        &amp;lt;created&amp;gt;{{ note.created|date:&amp;quot;Y-m-d G:i T&amp;quot; }}&amp;lt;/created&amp;gt;
        &amp;lt;modified&amp;gt;{{ note.modified|date:&amp;quot;Y-m-d G:i T&amp;quot; }}&amp;lt;/modified&amp;gt;
    &amp;lt;/note&amp;gt;
    {% endfor %}
&amp;lt;/notes&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;How you define your XML templates is up to you. I name my templates with the &lt;code&gt;.html&lt;/code&gt; extention  simply because my text editor highlights the syntax better than if it were XML. It doesn&amp;#8217;t matter because the mimetype dictates how the file is served up. Good luck!
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/aug/11/creating-basic-api-django/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Mon, 11 Aug 2008 23:31:49 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/aug/11/creating-basic-api-django/</guid></item><item><title>
  Give me one column


</title><link>http://playgroundblues.com/posts/2008/may/13/give-me-one-column/</link><description>


  &lt;p&gt;Think about the top five sites you actually go to on a daily basis and count how many of them display their content down a single column, excluding a side rail for ads or navigation. 
&lt;/p&gt;
&lt;p&gt;On a regular basis I visit Twitter, Flickr, Google Reader, Boing Boing, and Digg. All five have a single content column. I also regularly visit Wired, NYTimes, Pownce, FFFFound and Monoscope. Three out of five are single column with Wired a distant fourth because eventually it becomes a single column. 
&lt;/p&gt;
&lt;p&gt;The trouble I have with multi-column sites like Washington Post, New York Times, or LJWorld (a site I designed) is I can&amp;#8217;t remember where I left off. When I open up Boing Boing or Gizmodo I scroll until I reach the last thing I saw a few hours ago. If I noticed an interesting story at 9:00am and I decide to go read it at noon on the Times, it&amp;#8217;s vanished.
&lt;/p&gt;
&lt;p&gt;I blame the pastiche of newspapers and the recent evangelizing of grids. Don&amp;#8217;t get me wrong, I love grids but grids do not equal column bloat. The web is no place for this, especially if you&amp;#8217;re a content heavy beast like a newspaper. It&amp;#8217;s hard enough to grab someone&amp;#8217;s attention why present them with columns worth of information when you can promote scrolling to take in one piece of content at a time. 
&lt;/p&gt;
&lt;p&gt;Blogs have conditioned us to zipping down the page and hardware enhancements like the scroll wheel, two finger touchpad gesture, and multi-touch devices have made it even easier (and fun). People want to scroll when given a single column. I don&amp;#8217;t have the data but I would bet people scroll less when the amount of columns are increased.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/may/13/give-me-one-column/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Tue, 13 May 2008 15:47:45 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/may/13/give-me-one-column/</guid></item><item><title>
  Gadget fast


</title><link>http://playgroundblues.com/posts/2008/apr/18/gadget-fast/</link><description>


  &lt;p&gt;My iPhone and laptop will be unplugged starting Friday evening for two days. I&amp;#8217;ve let the fog of distractions generated by these two devices grow too thick so for the next few days (&lt;a href="http://www.nytimes.com/2008/04/15/world/asia/15beijing.html?ex=1365998400&amp;amp;en=dcf809d03fc3958e&amp;amp;ei=5124&amp;amp;partner=permalink&amp;amp;exprod=permalink"&gt;much like China&lt;/a&gt;) they&amp;#8217;ll be turned off. 
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/2423256635/sizes/o/"&gt;&lt;img src="http://farm3.static.flickr.com/2052/2423256635_42a9945bc6_m.jpg" title="Gadget fast" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;It doesn&amp;#8217;t stop there. The following week Twitter, Flickr, an my feed reader will be muted. I have nothing against these services, but it&amp;#8217;s time to step back and take the pulse of things around me and see if I&amp;#8217;m missing something. 
&lt;/p&gt;
&lt;p&gt;I used to do more gadget/service fasting and I&amp;#8217;m well over due. My plan is to do some brainstorming for a few projects currently on my plate and catch up on some reading, but more importantly, spend time with my girlfriend. 
&lt;/p&gt;
&lt;p&gt;See you all next week!
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/apr/18/gadget-fast/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Fri, 18 Apr 2008 15:49:50 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/apr/18/gadget-fast/</guid></item><item><title>
  Capistrano rules


</title><link>http://playgroundblues.com/posts/2008/mar/17/capistrano-rules/</link><description>


  &lt;p&gt;I&amp;#8217;ve grown tired of committing changes to my subversion repository, logging into my server, updating my live checkout, and restarting python processes. I finally decided to implement &lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt; and eliminate this repetition. 
&lt;/p&gt;
&lt;p&gt;Here are my repetitive set of commands:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ssh playgroundblues.com
$ cd ~/projects/playgroundblues
$ svn up
$ cd ~/www/playgroundblues.com/www
$ touch django.fcgi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, with the help of Capistrano, I just type:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cap deploy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&amp;#8217;ll first need to &lt;a href="http://www.capify.org/install"&gt;install Capistrano&lt;/a&gt; which is as simple as &lt;code&gt;gem install -y capistrano&lt;/code&gt;. Once that&amp;#8217;s complete you need to create a &amp;#8220;capfile&amp;#8221; which is where you&amp;#8217;ll define your tasks:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;task :deploy, :hosts =&amp;gt; &amp;quot;username@playgroundblues.com&amp;quot; do
  run &amp;quot;cd ~/projects/playgroundblues; svn up; cd ~/www/playgroundblues.com/www/; touch django.fcgi&amp;quot;
end
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The above will vary depending on your host and directory setup. After you save the above file and as long as you&amp;#8217;re in the directory where the capfile resides you can, in the terminal, type &lt;code&gt;cap deploy&lt;/code&gt; and Capistrano does the rest. Bliss.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/mar/17/capistrano-rules/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Mon, 17 Mar 2008 23:03:55 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/mar/17/capistrano-rules/</guid></item><item><title>
  Aspen Simulator


</title><link>http://playgroundblues.com/posts/2008/mar/13/aspen-simulator/</link><description>


  &lt;p&gt;As much as I&amp;#8217;d like to blog about my trip to Austin and SXSW last week I&amp;#8217;m just too excited over the &lt;a href="http://developer.apple.com/iphone/program/"&gt;iPhone SDK&lt;/a&gt; goodies that dropped last Thursday. 
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/2332111168/sizes/o/"&gt;&lt;img src="http://farm3.static.flickr.com/2273/2332111168_c7811d1e0e_m.jpg" title="Aspen Simulator" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;You may be asking yourself, &amp;#8220;he&amp;#8217;s a web guy, why does he care?&amp;#8221; Well, there happens to be a beautiful gem tucked away called the Aspen Simulator.
&lt;/p&gt;
&lt;p&gt;This is a complete pixel and functionally perfect replica of the iPhone and it&amp;#8217;s fantastic for testing web apps. Before I was spending a lot of time back and forth between my iPhone and my desktop but since this thing is so identical I really don&amp;#8217;t have to own an iPhone (but I will anyway). 
&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a little hard to find, but after installing the &lt;a href="http://developer.apple.com/iphone/devcenter/"&gt;developer tools&lt;/a&gt; look under / Developer / Platforms / AspenSimulator.platform / Developer / Applications. 
&lt;/p&gt;
&lt;h3&gt;A few tricks&lt;/h3&gt;
&lt;p&gt;If you want to do a two finger zoom just hold down the option key while click dragging. You can also rotate the the phone by using the command key and right left arrows. To lock the phone press command L. Still try to figure out how to do a two finger scroll.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/mar/13/aspen-simulator/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Thu, 13 Mar 2008 17:50:30 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/mar/13/aspen-simulator/</guid></item><item><title>
  Ah-ha Event Delegation


</title><link>http://playgroundblues.com/posts/2008/mar/5/ah-ha-event-delegation/</link><description>


  &lt;p&gt;Wrapping my head around things like OOP took months. It&amp;#8217;s not because I&amp;#8217;m an idiot (I don&amp;#8217;t think) - it&amp;#8217;s just because I needed all the explanations to marinate before having an ah-ha! moment. 
&lt;/p&gt;
&lt;p&gt;I had an ah-ha today, with regards to Event Delegation. I&amp;#8217;ve never seemed to completely understand events, yet I use them all the time. They&amp;#8217;re an essential aspect of Actionscript and Javascript and there are two basic ways of capturing events, Event Handling and Event Delegation. 
&lt;/p&gt;
&lt;p&gt;Most of us, whether we realize it or not, are familiar with Event Handling. Imagine we have an unordered list with a class name &lt;code&gt;.nav&lt;/code&gt; and each item has a link. For this example, I&amp;#8217;m going to use jQuery, so if you wanted to call a javascript function when the user clicks a link in the list, you&amp;#8217;d do the following:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$('.nav a').each(function() {
    $(this).click(handleClick);
});

function handleClick(event) {
    // fun stuff goes here
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you&amp;#8217;re jQuery savvy, the above code should be familiar. We&amp;#8217;re looping over all the anchor tags within the unordered list and assigning the function &amp;#8220;handleClick&amp;#8221; to the click event. Each time someone clicks a link, &amp;#8220;handleClick&amp;#8221; is called and the anchor tag is in the function scope. This is Event Handling.
&lt;/p&gt;
&lt;p&gt;Event Delegation makes things a little simpler by eliminating the need to loop over every anchor tag. We simply apply the click event to the unordered list like so:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$('.nav').click(handleClick);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Since the click event is registered with the unordered list, it gets fired off when anything inside the list is clicked. The scope of the handleClick function is set to the &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; but if you want to target the anchor tag below the mouse click, you use &lt;a href="http://docs.jquery.com/Events_%28Guide%29#event.target"&gt;event.target&lt;/a&gt;. This is Event Delegation.
&lt;/p&gt;
&lt;p&gt;Both are very powerful but in most instances Event Delegation is going to require less code while boosting performance. Many thanks to &lt;a href="http://www.jacobian.org"&gt;Jacob&lt;/a&gt; for making this ah-ha moment possible.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/mar/5/ah-ha-event-delegation/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Wed, 05 Mar 2008 00:24:56 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/mar/5/ah-ha-event-delegation/</guid></item><item><title>
  Going mobile


</title><link>http://playgroundblues.com/posts/2008/feb/18/going-mobile/</link><description>


  &lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/2276634164/sizes/o/"&gt;&lt;img src="http://farm3.static.flickr.com/2291/2276634164_cc599ccc10_m.jpg" title="Mobile Playground" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;Over the weekend, I decided to whip up a mobile (iPhone) version of Playground Blues. I walked into Broadway Cafe around 3pm on Saturday, and by 5:30, I had &lt;a href="http://m.playgroundblues.com" title="Mobile playground"&gt;m.playgroundblues.com&lt;/a&gt;. Here&amp;#8217;s how it went down.
&lt;/p&gt;
&lt;h3&gt;Step 1&lt;/h3&gt;
&lt;p&gt;Since I&amp;#8217;m still using Dreamhost and FastCGI, I created my .htaccess file along with my dispatch.fcgi file for my new sub-domain as usual. Made one little change to my dispatch file: instead of having &lt;code&gt;DJANGO_SETTINGS_MODULE&lt;/code&gt; pointing to playgroundblues.settings, I pointed it to playgroundblues.settings_mobile.
&lt;/p&gt;
&lt;p&gt;Then, in my project folder, I made a duplicate of my settings file and renamed it to settings_mobile.py. Let me emphasize again, this is a duplicate.
&lt;/p&gt;
&lt;h3&gt;Step 2&lt;/h3&gt;
&lt;p&gt;Created a new templates folder and named it &amp;#8220;templates_mobile.&amp;#8221; Opened up my settings_mobile.py file and added a new line to the top of my &lt;code&gt;TEMPLATE_DIRS&lt;/code&gt; tuple. This tells Django to first look in mobile templates, and if the template doesn&amp;#8217;t exist, fall back on regular site templates. (Remember, this is only for my mobile site.)
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TEMPLATE_DIRS = (
  &amp;quot;/home/playgroundblues/templates_mobile/&amp;quot;,
  &amp;quot;/home/playgroundblues/templates/&amp;quot;,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 3&lt;/h3&gt;
&lt;p&gt;In my new templates_mobile folder, I created a new base template called &amp;#8220;base_mobile.html&amp;#8221; which I&amp;#8217;ll use to extend in all my child templates instead of the main sites base.html. Then I went through the sites pages and recreated mirrored templates in the mobile folder. So /templates/blog/post_detail.html was overwritten by /templates_mobile/blog/post_detail.html. I stripped out extraneous content that was unnecessary for someone on the go, leaving core content and functionality. 
&lt;/p&gt;
&lt;p&gt;The nice thing is if someone happens to creep into a section that you haven&amp;#8217;t gotten to (as long as you didn&amp;#8217;t override base.html), your site will display as it would on a computer proper. If there&amp;#8217;s a more succinct way of doing this, please let me know.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/feb/18/going-mobile/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Mon, 18 Feb 2008 23:17:58 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/feb/18/going-mobile/</guid></item><item><title>
  iPhone bookmark iconage


</title><link>http://playgroundblues.com/posts/2008/jan/15/iphone-bookmark-iconage/</link><description>


  &lt;p&gt;If you&amp;#8217;re wondering how to control the icon that gets generated for your webpage with the new 1.1.3 iPhone release, look no further than &lt;a href="http://developer.apple.com/iphone/devcenter/designingcontent.html"&gt;Apple&amp;#8217;s iPhone Dev Center&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Apple has added a section called &amp;#8220;Create a WebClip Bookmark Icon&amp;#8221; and it calls for a 57x57 pixel icon. After some testing today I&amp;#8217;ve concluded this recommended sizing results in a fuzzy icon, largely due to the iPhone being a 163 ppi display. 
&lt;/p&gt;
&lt;p&gt;Instead of sticking with the recommended sizing I bumped it up to 158x158. When this gets scaled you&amp;#8217;ll be left with a crisp icon that sits nicely amongst Apples crisp icons. Onward.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2008/jan/15/iphone-bookmark-iconage/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Tue, 15 Jan 2008 16:09:40 -0600</pubDate><guid>http://playgroundblues.com/posts/2008/jan/15/iphone-bookmark-iconage/</guid></item><item><title>
  Flash, meet H.264


</title><link>http://playgroundblues.com/posts/2007/dec/4/flash-meet-h264/</link><description>


  &lt;p&gt;Adobe just &lt;a href="http://www.adobe.com/aboutadobe/pressroom/pressreleases/200712/120407adobemoviestar.html" title="Update 3 Flash Player"&gt;released&lt;/a&gt; Update 3 of Flash Player 9. This is HUGE. Streaming video is no longer a laughing matter. Streaming High Definition video will become common place and it starts today. 
&lt;/p&gt;
&lt;p&gt;Everyone talks about BlueRay and HD-DVD, but what they don&amp;#8217;t realize is they&amp;#8217;ve already been obsolesced before catching stride. VHS is dead, brick and mortar video rental is on life support, and DVD just checked in with chest pains.
&lt;/p&gt;
&lt;h3&gt;How long will it take?&lt;/h3&gt;
&lt;p&gt;I give Adobe four months to capture 80% of the market share. It usually takes about a year to cover 90% of the web with a new Flash version, but once YouTube and MySpace deliver, the game&amp;#8217;s over. 
&lt;/p&gt;
&lt;h3&gt;What does this mean?&lt;/h3&gt;
&lt;p&gt;It means you can cancel your cable. I recently did because I&amp;#8217;m getting most of my content from iTunes and YouTube. I paid around $100 a month for cable and watched nothing worthwhile. Now I could &lt;strong&gt;own&lt;/strong&gt; around fifty shows a month for the same price &amp;#8212; not to mention most of the stuff I like is free. Let&amp;#8217;s also not forget the portability factor :)
&lt;/p&gt;
&lt;p&gt;This is a huge step forward in providing tools to people who need them. Now go &lt;a href="http://www.adobe.com/go/getflashplayer" title="Upgrade Flash"&gt;upgrade&lt;/a&gt;.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/dec/4/flash-meet-h264/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Tue, 04 Dec 2007 22:58:06 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/dec/4/flash-meet-h264/</guid></item><item><title>
  Django Basic Apps


</title><link>http://playgroundblues.com/posts/2007/dec/2/django-basic-apps/</link><description>


  &lt;p&gt;I&amp;#8217;ve been working on abstracting some Django applications from past projects so they can effortlessly be plugged into future projects. I hate writing the same blog application repeatedly, so this is an attempt to make life easier. I think this will be a fun, little suite of plug-n-play Django apps that everyone can benefit from. 
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/2082654505/sizes/o/"&gt;&lt;img src="http://farm3.static.flickr.com/2212/2082654505_fc62bd9732_m.jpg" title="Django Basic App Colors" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m calling this suite Basic Apps with the hopes they&amp;#8217;ll live up to their name. They&amp;#8217;re freely distributed under the &lt;a href="http://www.opensource.org/licenses/bsd-license.php" title="New BSD License"&gt;New BSD License&lt;/a&gt; and hosted at Google Code. The goal is to use the month of December to get feedback from everyone and finalize the models, so &lt;strong&gt;beware of model changes.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;The apps I&amp;#8217;ll be introducing today include Basic Blog, Basic Places, Basic People, Basic Library, and Basic Profiles. Before you run off keep in mind these are &lt;em&gt;basic&lt;/em&gt; apps. You won&amp;#8217;t see anything earth shattering. The idea is to be simple and pluggable so when it comes time to add a blog or user profiles to your project you&amp;#8217;ve got a jumping off point. That said, I&amp;#8217;d like to provide a brief description of each app:
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://code.google.com/p/django-basic-blog/" title="Basic Blog"&gt;Basic Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is a blog, nothing more nothing less. There is a Post model and a Category model. The dependancies include Django Comments and &lt;a href="http://code.google.com/p/django-tagging/" title="Django Tagging"&gt;Django Tagging&lt;/a&gt;. 
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://code.google.com/p/django-basic-places/" title="Basic Places"&gt;Basic Places&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This app stores place information, (gasp!) The models include Place Type, City, Point, and Place. Django Tagging is the only dependancy. 
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://code.google.com/p/django-basic-people/" title="Basic People"&gt;Basic People&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This app stores people information. (you&amp;#8217;re kidding!) This app has nothing to do with Users. The people that go here are individuals that will never have access to your project. It is used heavily with the library app. The models include Person Type and Person.
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://code.google.com/p/django-basic-library/" title="Basic Library"&gt;Basic Library&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This actually contains three apps: Music, Movies, and Books. All three are independent and should be placed independently in your PYTHONPATH. Movies has one model, Movie. Books has two, Book and Publisher. Music has Label, Band, Album, and Song. All three depend on the Basic People app. They all have a Genre model to boot!
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://code.google.com/p/django-basic-profiles/" title="Basic Profiles"&gt;Basic Profiles&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This app extends the Django User app, providing added user information. The models include Profile, Mobile Service, Link, Service, and Service Type.
&lt;/p&gt;
&lt;p&gt;All of these apps need Python 2.4 or higher and Django 0.97 or higher. If you have any feature requests or notice any issues please create a ticket on the corresponding Google Code site using the Issues tab. I&amp;#8217;ve also started a &lt;a href="http://groups.google.com/group/django-basic-apps" title="Django Basic Apps Google Groups"&gt;Django Basic Apps&lt;/a&gt; discussion over at Google Groups. Now, let&amp;#8217;s build some shit.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/dec/2/django-basic-apps/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Sun, 02 Dec 2007 21:24:40 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/dec/2/django-basic-apps/</guid></item><item><title>
  Django Sprint


</title><link>http://playgroundblues.com/posts/2007/dec/1/django-sprint/</link><description>


  &lt;p&gt;
&lt;/p&gt;
&lt;p&gt;Armed with high levels of legally addictive stimulants, silver laptops, and brilliant minds, Django will get even closer to 1.0 &lt;a href="http://www.djangoproject.com/weblog/2007/nov/07/sprint/" title="Worldwide Django Sprint"&gt;today&lt;/a&gt;. If you have any interest in being apart of today&amp;#8217;s event, scurry over to the Django site and scan for tickets that catch your eye and expertise. Join us in IRC (irc.freenode.net) in the #django-sprint room or if you&amp;#8217;re lucky enough to live near Lawrence, Kansas come join us! 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/dec/1/django-sprint/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Sat, 01 Dec 2007 11:15:44 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/dec/1/django-sprint/</guid></item><item><title>
  Juggling Django settings modules


</title><link>http://playgroundblues.com/posts/2007/nov/6/juggling-django-settings-modules/</link><description>


  &lt;p&gt;If you find yourself juggling multiple Django projects and constantly changing the DJANGO_SETTINGS_MODULE variable, try this simple shortcut. 
&lt;/p&gt;
&lt;p&gt;Upon diving into a particular project I define an alias in my .bash_profile that gets me to the project directory in as few keystrokes as possible. For example, to get to my playgroundblues directory I simply type &amp;#8216;pb&amp;#8217; and I&amp;#8217;m in the root of playgroundblues.com. Here is the line of code in my .bash_profile:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alias pb=&amp;quot;cd /Working/www/playgroundblues.com/&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pretty straight forward, however, since I&amp;#8217;m going to that project I might as well set the DJANGO_SETTINGS_MODULE at the same time so I&amp;#8217;ve altered the line above to:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alias pb=&amp;quot;cd /Working/www/playgroundblues.com/; export DJANGO_SETTINGS_MODULE=playgroundblues.settings&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now I&amp;#8217;m in the proper directory with the proper settings file is in focus. Bliss.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/nov/6/juggling-django-settings-modules/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Tue, 06 Nov 2007 14:23:23 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/nov/6/juggling-django-settings-modules/</guid></item><item><title>
  Care to scrum?


</title><link>http://playgroundblues.com/posts/2007/oct/17/care-scrum/</link><description>


  &lt;p&gt;We need more scrums and less meetings. A &lt;a href="http://en.wikipedia.org/wiki/Stand-up_meeting" title="Stand-up meeting"&gt;scrum&lt;/a&gt; is a 5-10 minute stand-up meeting. About 80% of the meetings I&amp;#8217;ve ever attended have included at least five people. Any meeting over three becomes a presentation while one bloviates and others wander. 
&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been a while since my last scrum. It included seven people, complete participation, no dominance, one referee, and was contained within a 10 minute package. Rather than walking away in a typical post-meeting cloud of confusion, I left the scrum feeling clear and informed. It was the best mode of collaborative communication I&amp;#8217;ve been a part of. Again, I say more scrums, less meetings.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/oct/17/care-scrum/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Wed, 17 Oct 2007 10:59:30 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/oct/17/care-scrum/</guid></item><item><title>
  Trials of the I-70 commute


</title><link>http://playgroundblues.com/posts/2007/oct/15/trials-i-70-commute/</link><description>


  &lt;p&gt;A while ago I began working back in the big city while remaining in modest Lawrence. This required a 40 min. x 2 drive into the sun five days a week. It wasn&amp;#8217;t so bad at first, but the race through traffic and mass of incandescent gas started taking its toll. 
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/425974197/sizes/o/"&gt;&lt;img src="http://farm1.static.flickr.com/171/425974197_3c62310db1_m.jpg" title="Sunset" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;I decided to evaluate what was wearing me out. The sun, for one, was melting my retinas and giving me headaches. This stress could easily be eliminated with the right shades, polarized to be exact. They immediately reduced eye strain and lowered my stress level. I was still experiencing anxiety that led to being drained at work and home. This had to be stemming from my colleagues on the road. 
&lt;/p&gt;
&lt;p&gt;Driving I-70 during rush hour is like threading a needle. You&amp;#8217;re constantly struggling to out-pace traffic so you can relax and cruise the rest of the way home. Only problem is your cruising doesn&amp;#8217;t happen until the last 10-15 miles. I averaged 80 to 85 mph and decided one day just go the speed limit, 70 mph. 
&lt;/p&gt;
&lt;p&gt;The results were immediate. I didn&amp;#8217;t have to pass anyone! That alone leveled my stress. Then I realized I wasn&amp;#8217;t getting into any traffic jams because they were all hurdling past me. I could hold a steady cruising speed without having to touch my brake. This also upped my miles per gallon giving me an extra trip on a full tank. 
&lt;/p&gt;
&lt;p&gt;The irony was seeing everyone who passed me at the toll booth or the first stoplight, so I knew I wasn&amp;#8217;t losing any time. 
&lt;/p&gt;
&lt;p&gt;After spreading the word about this revelation, a coworker was telling me about some research comparing fluid dynamics and &lt;a href="http://en.wikipedia.org/wiki/Traffic_wave" title="Traffic waves"&gt;traffic waves&lt;/a&gt;. The Wikipedia page describes it best:
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;A deeper understanding of traffic waves is a goal of the physical study of traffic flow. When looking at traffic waves, the traffic itself can often be looked at in a manner of fluid dynamics. It has been said that by knowing how traffic waves are created, drivers can sometimes reduce their effects by increasing vehicle headways and reducing the use of brakes, ultimately alleviating traffic congestion for everyone in the area.
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;So to my dear fellow I-70 commuters, you don&amp;#8217;t have to thank me; but just remember who&amp;#8217;s making your life easier. See you at the toll booth!
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/oct/15/trials-i-70-commute/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Mon, 15 Oct 2007 11:39:24 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/oct/15/trials-i-70-commute/</guid></item><item><title>
  Subliminal Culture


</title><link>http://playgroundblues.com/posts/2007/sep/21/subliminal-culture/</link><description>


  &lt;p&gt;Lately I&amp;#8217;ve been reading more of &lt;a href="http://www.manovich.com" title="Lev Manovich"&gt;Lev Manovich&amp;#8217;s&lt;/a&gt; Language of New Media. Manovich discusses the methods in which we access new media. He mentions some research done by Paul Virilio on the collapsing effect technology has on the distances between people and content. Before, if a person wanted to see the works of Da Vinci they&amp;#8217;d have to travel to a book store or an art museum. With the advent of new media it&amp;#8217;s as simple as pulling up a browser. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/1417693311/sizes/o/"&gt;&lt;img src="http://farm2.static.flickr.com/1097/1417693311_44605a7a5a_m.jpg" title="Ginevra de&amp;#39; Benci" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;The consequences of this immediacy are somewhat evident. The moment of seeing a work like &lt;a href="http://en.wikipedia.org/wiki/Ginevra_de'_Benci" title="Ginevra de' Benci"&gt;Ginevra de Benci&lt;/a&gt; on a screen is most likely followed up with going to Digg or checking email but seeing this 15th century master work at the &lt;a href="http://en.wikipedia.org/wiki/National_Gallery_of_Art" title="National Gallery of Art"&gt;National Gallery&lt;/a&gt; is followed with indescribable emotions. The immediacy of content to some degree robs us of these experiences, but we&amp;#8217;re still absorbing content on a subliminal level.
&lt;/p&gt;
&lt;p&gt;These fleeting moments of content absorption can heighten the experience of standing in front of the real thing. By skimming da Vinci&amp;#8217;s Wikipedia entry I&amp;#8217;ll have seen Ginevra and maybe even read a few lines about her so upon seeing the piece in person I may have a slight familiarity which leads to a better appreciation of the work thus heightening the experience. In advertising we call this subliminal advertising and judging by &lt;a href="http://youtube.com/watch?v=ZyQjr1YL0zg" title="Subliminal Advertising experiment"&gt;this little experiment&lt;/a&gt;, it proves to be very effective.
&lt;/p&gt;
&lt;p&gt;Virilio seems to think the immediacy of the web will stunt peoples physical interactions with content thus stunting reflection and critical thinking. I see his point but I think it has the potential to heighten and increase our experiences.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/sep/21/subliminal-culture/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Fri, 21 Sep 2007 11:33:17 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/sep/21/subliminal-culture/</guid></item><item><title>
  Manually Compressing PNGs


</title><link>http://playgroundblues.com/posts/2007/sep/18/manually-compressing-pngs/</link><description>


  &lt;p&gt;With the advent of some very clean hacks to make PNGs work in IE I&amp;#8217;ve found myself working them into my designs more. Using them has allowed me to achieve some effects that were next to impossible with JPEGs and GIFs. The biggest hurdle in using PNGs is their file size. The export tools in Photoshop tie your hands behind your back, not allowing you to tweak anything that may lead to a more compact file. Until Photoshop adds some functionality I think I may have a handy solution. 
&lt;/p&gt;
&lt;p&gt;To understand the solution we need to understand the composition of a PNG. The most popular use case for PNG is it&amp;#8217;s levels of transparency (or alpha channel), 256 to be exact. Along with this it has a 24bit color palate. In photoshop there are two settings in Save for Web, 8bit PNG and 24bit PNG. The 24bit is most desirable because it enables the alpha channel. The PNG format has many many other features but I&amp;#8217;m only going to focus on these few to move this post along.
&lt;/p&gt;
&lt;p&gt;So we can deduce from the above that we have an image with two qualities, 24bit color and 256 alpha channel. Both are being compressed somewhat independently. The only problem is, Photoshop doesn&amp;#8217;t let us change the compression on the 24bit part or on the alpha channel part. If we focus on compressing the 24bit part we can potentially shave off a lot of the fat. 
&lt;/p&gt;
&lt;p&gt;For this example I&amp;#8217;m going to use a box that has a lot of texture and a drop shadow. To compress the inside part that doesn&amp;#8217;t have a drop shadow I&amp;#8217;m simply going to select it, copy it, create a new document and paste it in. Then I&amp;#8217;m going to use Save for Web to export it as a JPEG and use the photoshop compression tools to make it an acceptable file size. Then I&amp;#8217;m going to open my compressed JPEG that I just saved and copy it into my original document. After lining things up with the compressed JPEG on top I&amp;#8217;m now ready to Save for Web and use the PNG 24bit compression. The results are pretty dramatic. What normally would be a 68k image is now a 48k. In some cases I&amp;#8217;ve cut files size in half!
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://playgroundblues.com/media/source/png_compress_tutorial.jpg" alt="visual" /&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d love to hear other techniques. 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/sep/18/manually-compressing-pngs/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Tue, 18 Sep 2007 12:27:41 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/sep/18/manually-compressing-pngs/</guid></item><item><title>
  iPhone dead; $30 rental?


</title><link>http://playgroundblues.com/posts/2007/aug/15/iphone-dead-30-rental/</link><description>


  &lt;p&gt;This morning I woke up on my own. Normally I hear little crickets chirping around 7am which is my &lt;a href="http://www.apple.com/iphone" title="Apple iPhone"&gt;iPhone&lt;/a&gt; letting me know it&amp;#8217;s time to face the coming day. This morning, no crickets. At first I thought maybe the battery was flat, but that&amp;#8217;s not possible. I charged it the day before and didn&amp;#8217;t put it through any rigorous usage. So &lt;a href="http://docs.info.apple.com/article.html?artnum=305743" title="Resetting iPhone"&gt;iPhone CPR&lt;/a&gt; commences. 
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/1127556671/sizes/o/"&gt;&lt;img src="http://farm2.static.flickr.com/1410/1127556671_4faa5f3568_m.jpg" title="iPhone Dead" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;First I try a hard restart, holding down the home and on/off button for a few seconds. No dice. Then I plug it in, nothing, another hard restart, nothing. Let it sit for a while plugged in, restart, nothing. She&amp;#8217;s flat-lined and any amount of resuscitation is not getting her little heart pumping again. By this point it&amp;#8217;s time for work.
&lt;/p&gt;
&lt;p&gt;I roll into work around 9am with a cold iPhone in my pocket. She still feels good but her soul is lost. 10am rolls around, I can&amp;#8217;t wait. I head to Apple Store on the Plaza hoping they can shock her back into existence. The Genius looks it over, does exactly what I did earlier that morning. Realizes he can&amp;#8217;t do much so offers to send it back to Apple for repair. This sucks, two days sans phone is not acceptable. I&amp;#8217;ve never had to send a phone in for repairs, I&amp;#8217;ve never had a phone just break. I &lt;em&gt;need&lt;/em&gt; a phone at all times. I can&amp;#8217;t say for sure if this is Apple&amp;#8217;s fault but I know for a fact that I have not done anything out of the ordinary to cause my iPhone to die. So I&amp;#8217;m forced to pay $30 to rent a phone while mine is being repaired. This is lame.
&lt;/p&gt;
&lt;p&gt;Apple shouldn&amp;#8217;t be charging it&amp;#8217;s loyal $30 to rent an iPhone while theirs is being repaired, especially if the error is on Apple. This doesn&amp;#8217;t seem like good customer service to me. I would gladly put down a deposit for the rental but I should get that deposit back. 
&lt;/p&gt;
&lt;p&gt;While my phone travels in her temporary sarcophagus to the bowels of Cupertino I&amp;#8217;m left with the sting of loosing $30 for an error that is undoubtedly Apples. &lt;strong&gt;grumble&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;I would like to thank the guys at the &lt;a href="http://www.apple.com/retail/countryclubplaza/" title="Apple Store, Country Club Plaza"&gt;Apple Store&lt;/a&gt;, they were very cordial and accommodating.
&lt;/p&gt;
&lt;h3&gt;Update: August 28, 2007&lt;/h3&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/1254161063/sizes/o/"&gt;&lt;img src="http://farm2.static.flickr.com/1416/1254161063_f8ddfe63b9_m.jpg" title="iPhone Aurora Borealis" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;I recieved my &amp;#8220;fixed&amp;#8221; phone in the mail via Apple. Only problem was the little guy refused to recognize my SIM card. I tried all sorts of things, even other SIM cards, nothing. Apple was kind enough to replace the phone. What a relief. After about two weeks of usage things were back to normal until this evening while browsing the web I was greeted with a colorful half streaked screen. I don&amp;#8217;t know about anyone else but the Aurora Borealis belongs in the sky, not on the lower half of my iPhone screen. My luck just gets better by the iPhone.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/aug/15/iphone-dead-30-rental/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Wed, 15 Aug 2007 11:07:41 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/aug/15/iphone-dead-30-rental/</guid></item><item><title>
  Blueprints are not final


</title><link>http://playgroundblues.com/posts/2007/aug/10/blueprints-are-not-final/</link><description>


  &lt;p&gt;So apparently a little framework called &lt;a href="http://bjorkoy.com/blueprint/" title="Blueprint, a CSS Framework"&gt;Blueprint&lt;/a&gt; has reared it&amp;#8217;s head, born from a few stylesheets that look very familiar. I&amp;#8217;m somewhat conflicted with its release because I don&amp;#8217;t think it should be used. Don&amp;#8217;t get me wrong, it&amp;#8217;s great, but don&amp;#8217;t use it.
&lt;/p&gt;
&lt;p&gt;About five or so months ago I was working on the &lt;a href="http://www.ljworld.com" title="Lawrence Journal-World"&gt;Journal-World&lt;/a&gt; redesign. News sites tend to be very column heavy and I was getting tired of writing the same code over and over to accommodate for my design iterations. One day &lt;a href="http://www.jeffcroft.com" title="Jeff Croft"&gt;Jeff&lt;/a&gt; and I discussed some ways to maximized code reuse and speed up this process of going from Photoshop to markup. Later that night I sketched out a method for easily defining grid structures and columns. My attempt was pretty crude and over the next week or so it become a lot more solid with the help of Jeff and &lt;a href="http://mintchaos.com/" title="Christian Metts"&gt;Christian&lt;/a&gt;. After adding styles for type and common lists we had formed a pretty powerful time saving solution. I could quickly prototype mockups in hours. The only problem was it wasn&amp;#8217;t semantic. Things like span-4, unit, and block polluted the HTML and CSS.
&lt;/p&gt;
&lt;p&gt;At first I was okay with this because my focus was getting the redesign on the right track, however, looking back it was the wrong decision. Un-semantic code goes against everything the Standards movement has fought for. 
&lt;/p&gt;
&lt;p&gt;Do I shed a tear? No. I&amp;#8217;m not an elitist in this area anymore and I don&amp;#8217;t go sniffing for validation errors because I value usability, style and harmony more. But, the blatant un-semantic-ness of this framework still disgusts me. 
&lt;/p&gt;
&lt;p&gt;So I was quite surprised and sickened to find out Olav launched this almost identical framework, Blueprint. Don&amp;#8217;t get me wrong, it&amp;#8217;s great for prototyping but don&amp;#8217;t settle for it. Good semantic names are worth every penny. Also, frameworks don&amp;#8217;t belong in markup languages. They just don&amp;#8217;t. 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/aug/10/blueprints-are-not-final/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Fri, 10 Aug 2007 11:22:15 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/aug/10/blueprints-are-not-final/</guid></item><item><title>
  First impressions


</title><link>http://playgroundblues.com/posts/2007/jul/1/first-impressions/</link><description>


  &lt;p&gt;How does a machine have soul? We could try and answer by throwing around terms like usefulness, elegance and grace but all our attempts would sound prosaic next to the device I recently became acquainted with. Run and hide Crackberry, the iPhone is here. 
&lt;/p&gt;
&lt;p&gt;For people to be drooling over a 4.8 ounce device is not unfathomable especially coming from Apple. This is different. During my first hours with the iPhone I literally felt nervous. I felt like I didn&amp;#8217;t deserve this, it seemed unreal. 
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/710146769/sizes/o/"&gt;&lt;img src="http://farm2.static.flickr.com/1290/710146769_348f18222e_m.jpg" title="Mr. Wilson on iPhone" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;11:00am Saturday: Headed to the coffee house. Do I need my laptop or my notebook, or magazine? Was I really walking down the street listening to my phone? Wait&amp;#8230; Whoa&amp;#8230; phone call. &lt;em&gt;Pinch&lt;/em&gt; Hello&amp;#8230; &lt;em&gt;conversation&lt;/em&gt; goodbye. Music!!!
&lt;/p&gt;
&lt;p&gt;Some of my friends think I&amp;#8217;m crazy but for a UI designer this is as close to nirvana as I&amp;#8217;ve ever experienced. 
&lt;/p&gt;
&lt;p&gt;9:00pm Saturday: Driving to the liquor store. Wait, are they open? iPhone eight ball returns: &lt;a href="http://www2.ljworld.com/marketplace/businesses/mass-beverage/" title="Mass Beverage"&gt;decidedly so&lt;/a&gt;. Again&amp;#8230; I&amp;#8217;m not worthy. 
&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s like those little knowledge cracks in your life are slowly getting sealed. Anything you wanted or needed to know is now within a few gestures. Why remember? Leave it up to the cloud, let your iPhone be your Receiver. 
&lt;/p&gt;
&lt;p&gt;This device represents a new bar for &lt;a href="http://en.wikipedia.org/wiki/Human-computer_interaction" title="Human-computer interaction"&gt;HCI&lt;/a&gt;. It also poses many exciting questions and possibilities. My only hope is that Apple will offer an SDK in the coming months so the collective can contribute. I have confidence the will. Need we be reminded where cover-flow came from? We definitely can&amp;#8217;t rely on the browser sandbox. It doesn&amp;#8217;t offer the same grace and fluidity applications garner.
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/jul/1/first-impressions/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Sun, 01 Jul 2007 16:43:10 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/jul/1/first-impressions/</guid></item><item><title>
  The waves of creativity


</title><link>http://playgroundblues.com/posts/2007/may/17/waves-creativity/</link><description>


  &lt;p&gt;There are a lot of environmental factors that go into fostering a creative environment. As creative persons mature, we become more in-tune with what works best for us when it&amp;#8217;s time to dream up new ideas and solutions. Some of us trek to coffeehouses while others listen to Bach, Satie or Mogwai. Whatever we do we&amp;#8217;re all essentially trying to achieve a certain state of mind. 
&lt;/p&gt;
&lt;p&gt;Before I go any further here is a quick explanation of the human brain by neuronal scientist, &lt;a href="/people/richard-m-restak/" title="Richard M. Restak"&gt;Richard Restak&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;My very basic understanding is that synapses are essentially electrochemical connections that vibrate at varying frequencies. These frequencies can be &lt;a href="http://en.wikipedia.org/wiki/Brainwaves" title="Brainwaves"&gt;measured&lt;/a&gt; and grouped into four different categories: Beta, Alpha, Theta and Delta. 
&lt;/p&gt;
&lt;p&gt;By now you&amp;#8217;re probably wondering what the hell does this have to do with creativity. Well let me quickly explain these four &amp;#8220;states of mind.&amp;#8221; Beta is the frequency we find ourselves in all too often. It&amp;#8217;s associated with being tense, alert, or afraid. Alpha is a state of relaxation without the loss of awareness. Theta is a day dream state and Delta is a state of unconsciousness, a sleep state. 
&lt;/p&gt;
&lt;p&gt;When we seek out our ideal creative environments we are essentially trying to lower our brainwaves from Beta to Alpha. This takes time and cannot be done instantaneously. We can immediately go from Delta to Beta but not vise versa. We have to be someplace familiar where we feel safe and secure. A place were we can let our guard down. 
&lt;/p&gt;
&lt;p&gt;Certain types of people exist in a constant state of Beta, some job types require it. When you intermingle Beta&amp;#8217;s with Alpha&amp;#8217;s and Theta&amp;#8217;s you undoubtedly create a source of tension. This is because the Beta&amp;#8217;s set the tone for the room and raise everyone to their frequency. This is why you rarely see sales and account management mixed with designers and illustrators. 
&lt;/p&gt;
&lt;p&gt;Environment is worth more than any salary. I think most designers would agree when I say I&amp;#8217;d much rather be making peanuts at a Googleplex than six figures at Joe&amp;#8217;s Banner Ad Emporium. 
&lt;/p&gt;
&lt;p&gt;More info can be found here:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.doctorhugo.org/brainwaves/brainwaves.html" title="What are Brainwaves?"&gt;What are Brainwaves?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0609604457" title="Mozart's Brain and the Fighter Pilot"&gt;Mozart&amp;#8217;s Brain and the Fighter Pilot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://brain.web-us.com/brainwavesfunction.htm" title="Brainwave functions"&gt;Brainwave functions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: I&amp;#8217;m no scientist. I just think this stuff is interesting and worth spreading. Correct me in the comments if necessary.&lt;/em&gt;
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/may/17/waves-creativity/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Thu, 17 May 2007 00:47:45 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/may/17/waves-creativity/</guid></item><item><title>
  Transmedia newspapers


</title><link>http://playgroundblues.com/posts/2007/may/6/transmedia-newspapers/</link><description>


  &lt;p&gt;I just finished reading chapter three of &lt;a href="/library/books/convergence-culture/" title="Convergence Culture"&gt;Convergence Culture&lt;/a&gt; where &lt;a href="/people/henry-jenkins/" title="Henry Jenkins"&gt;Jenkins&lt;/a&gt; discusses transmedia storytelling. He focuses on the Matrix franchise and how it basically rewrote the rules for Hollywoods future. It got me thinking on my walk home from the coffeehouse, why aren&amp;#8217;t newspapers doing this?
&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re all familiar with the Matrix and have varying depths of involvement with it. Most of us have seen the first film, some the second and third but have any of us played the video game, or seen the Animatrix, or been to &lt;a href="http://www.matrixonline.com" title="Matrix Online"&gt;Matrix Online&lt;/a&gt;? It all represents facets of transmedia storytelling, the very essence of convergence. Danny Bilson explains the transmedia relationship between the Matrix film and its game:
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;The news is delivered in a parallel fashion which isn&amp;#8217;t going to last, in fact, it&amp;#8217;s what&amp;#8217;s killing the old product. I can get the same Washington Post online as I can from the printed version and it&amp;#8217;s obvious which one I choose. A transmedia approach needs to replace the parallel delivery model. Give people up-to-the-minute details online, then print in-depth coverage. Show me how it relates to current culture with lessons and anecdotes, make it enjoyable and interesting and if the package is pretty I&amp;#8217;ll proudly display it on my shelves. 
&lt;/p&gt;
&lt;p&gt;Why don&amp;#8217;t newspapers live up to their medium? Print isn&amp;#8217;t bad, it&amp;#8217;s fantastic with huge staying power but you&amp;#8217;ve gotta produce something I&amp;#8217;m gonna want to keep around. I buy books because I want to savor them and I like the way they look on my shelves. Stop being so throwaway. The print medium isn&amp;#8217;t dead but delivering up-to-the-minute news with ink is on life support. The industry really needs to rethink what gets inked and how their readers will savor it. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not suggesting in-depth storytelling should be relegated to print but it kinda makes sense as a starting point. I flat out won&amp;#8217;t stare at a light-bulb and read pages of a story even if it is interesting. There are things you can do in print that you simply cannot do online and of you don&amp;#8217;t believe me get your hands on a Cranbrook Academy of Art academic catalog.
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/487675148/sizes/o/"&gt;&lt;img src="http://farm1.static.flickr.com/219/487675148_1b971e7710_m.jpg" title="Power of Green" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;A perfect example of news transmedia storytelling is the New York Times Magazine. It&amp;#8217;s the only time I buy a newspaper and all I really want is the magazine. It&amp;#8217;s kind of like a fortune cookie, I don&amp;#8217;t really enjoy the cookie but I savor the fortune. The publication provides select stories that are well thought out and insightful which usually draw from the previous weeks worth of news bites. It features great illustrations and photographs. I could get it online through their Times Select but I&amp;#8217;d rather not. 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/may/6/transmedia-newspapers/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Sun, 06 May 2007 23:37:47 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/may/6/transmedia-newspapers/</guid></item><item><title>
  LJWorld redesign


</title><link>http://playgroundblues.com/posts/2007/may/2/ljworld-redesign/</link><description>


  &lt;p&gt;So for the past five months or so we&amp;#8217;ve been working on a redesign for the &lt;a href="http://ljworld.com" title="Lawrence Journal-World"&gt;Lawrence Journal-World&lt;/a&gt;. For those of you that don&amp;#8217;t know, it&amp;#8217;s a daily newspaper that circulates the town of Lawrence, Kansas. It&amp;#8217;s quite small compared to surrounding markets which makes it very agile and free from shareholders and their evil agendas.
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/481899040/sizes/o/"&gt;&lt;img src="http://farm1.static.flickr.com/232/481899040_733365067a_m.jpg" title="LJ Redesign" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;I had a feeling this project would be special and challenging but I had no idea of the scale. Turns out, around the same time I was tasked with designing &lt;a href="http://ljworld.com/marketplace" title="Lawrence Marketplace"&gt;Marketplace&lt;/a&gt;, a directory of 4000+ local businesses. I must also mention, news doesn&amp;#8217;t stop for redesigns. It&amp;#8217;s definitely a juggling act when your trying to complete a site thats constantly having to push out news features and various timely events like &lt;a href="http://www2.ljworld.com/elections/2007/apr/03/races/lawrence_city_commission/"&gt;local elections&lt;/a&gt;. There were, shall I say, growing pains. 
&lt;/p&gt;
&lt;p&gt;Details aside, the design is &lt;a href="http://www2.ljworld.com/news/politics/kansas_legislature/" title="Kansas Legislature"&gt;simple&lt;/a&gt;. In fact the design is designed to disappear. Content is what really matters so I decided to take an approach that would make the overall design feel supportive rather than overbearing. This isn&amp;#8217;t easy for anyone and requires extreme discipline. Discipline I never thought I had. 
&lt;/p&gt;
&lt;p&gt;
  &lt;div class="jellyroll_photo"&gt;
    &lt;a href="http://www.flickr.com/photos/sketch22/481899036/sizes/o/"&gt;&lt;img src="http://farm1.static.flickr.com/220/481899036_8b3faacd14_m.jpg" title="Kansas Legislautre page" alt="Flickr photo"&gt;&lt;/a&gt;
  &lt;/div&gt;

&lt;script type="text/javascript" src="javascript/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  var photo_gallery = new SWFObject("flash/photo_gallery.swf", "photo_gallery_swf", "240", "220", "9", "#FFFFFF");
  photo_gallery.addParam('allowFullScreen', 'true');
  photo_gallery.addVariable('gallery_xml', '/photos/xml/?photos=')
	photo_gallery.write("photo_gallery");
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;The site will continue to take shape over time. We&amp;#8217;re hoping that redesigns are a thing of the past and constant iterations are a thing of the future. We&amp;#8217;ll see how long that lasts ;-)
&lt;/p&gt;
&lt;p&gt;This project wouldn&amp;#8217;t have been possible without the involvement of &lt;a href="http://www.b-list.org/"&gt;James Bennett&lt;/a&gt;, Dan Cox, &lt;a href="http://www.jeffcroft.com/"&gt;Jeff Croft&lt;/a&gt;, &lt;a href="http://postneo.com/"&gt;Matt Croydon&lt;/a&gt;, &lt;a href="http://www.jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt;, Joel Mathis, &lt;a href="http://www.mintchaos.com/"&gt;Christian Metts&lt;/a&gt;, David Ryan, Tom Tobin, all the web producers and all the editors and reporters that allow us to do what we do. 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/may/2/ljworld-redesign/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Wed, 02 May 2007 17:24:03 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/may/2/ljworld-redesign/</guid></item><item><title>
  InspectDB to the rescue


</title><link>http://playgroundblues.com/posts/2007/apr/19/inspectdb-rescue/</link><description>


  &lt;p&gt;In a past life I used to build admin tools using &lt;a href="http://www.rubyonrails.com" title="Ruby on Rails"&gt;Ruby on Rails&lt;/a&gt;. I thoroughly enjoyed spending weekends improving my little tools and libraries but I eventually realized I was spending more time on back-end stuff than front-end. Enter Django. For the past nine months I&amp;#8217;ve touched nothing but Django so you can imagine how easy it was for me to hop on the Rails bicycle when Dreamhost decided to upgrade Rails. 
&lt;/p&gt;
&lt;p&gt;You see, I failed to Freeze my Rails releases so they would be impervious to backwards incompatible changes. This presented a problem and I needed a solution like Don Imus needs a job. 
&lt;/p&gt;
&lt;p&gt;I decided it wasn&amp;#8217;t worth investigating why my code broke between Rails version 1.2 to 1.2.3. My solution was to just rewrite the damn things in Django. While ranting at work about my situation my good friend &lt;a href="http://www.b-list.org" title="James Bennett"&gt;James&lt;/a&gt; pointed out a nice little tool called &lt;a href="http://www.djangoproject.com/documentation/django-admin/#inspectdb" title="Django Inspect DB"&gt;inspectdb&lt;/a&gt; part of django-admin.py. All I had to do was create a new Django project, point it to my old Rails database and inspectdb spits out all the necessary model code so Django can start using that database. 
&lt;/p&gt;
&lt;p&gt;I simplified my overly complex Rails admin tool (my fault again) and migrated the new data by setting up a template to print out SQL inserts to match the new simplified database schema. I literally did this in less than two hours on a tool that previously took over two days to build. Not to mention I got better authentication, caching, and peace of mind. 
&lt;/p&gt;
&lt;p&gt;I must point out this is not a failure of Rails, merely a lack of time and commitment on my part. It would, however, be nice if Rails would be more mindful of backwards compatibility :)
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/apr/19/inspectdb-rescue/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Thu, 19 Apr 2007 23:11:30 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/apr/19/inspectdb-rescue/</guid></item><item><title>
  Bringing back the personal


</title><link>http://playgroundblues.com/posts/2007/apr/11/bringing-back-personal/</link><description>


  &lt;p&gt;I&amp;#8217;ve heard wisperings about the death of blogs lately. More and more we see our favorite writters fading into the ether. This begs the question, what next? What do we do with the barren ghost towns that once thrived on eager readers making sure their cache was cleared before stalking their favorites.
&lt;/p&gt;
&lt;p&gt;Personal sites should be cornucopias which chronicle our lives. They should be open sketchbooks crammed with a maze of twists and turns. We should be able to post without shame or regret things that later on demonstrate our progress. I want to browse sites like &lt;a href="http://www.chrisglass.com/" title="Chris Glass"&gt;Chris Glass&lt;/a&gt; which feels like a time capsule where I can rummage around and get a sense of someone&amp;#8217;s life. It&amp;#8217;s incredibly motivating to see his travel logs, journal entries, photos and favorites. All neatly packaged with thought and purpose. You can tell this site not only serves his audience, but seems to play an important role for him.
&lt;/p&gt;
&lt;p&gt;I think it&amp;#8217;s obvious that 2007 is a turning point for blogging but it&amp;#8217;s also a chance to question what we should strive for in a personal site. Social networking seems to have decentralized our lives and allowed us to stray farther away from our personal sites, but thanks to API&amp;#8217;s we&amp;#8217;re beginning to gain back some centralization. We really shouldn&amp;#8217;t shackle ourselves to the output of an API, nor should we restrict ourselves to &amp;#8220;dynamic content&amp;#8221; that comes from a CMS. Most of us are highly skilled in HTML/CSS and we shouldn&amp;#8217;t fear one off pages and designs. I remember the days of updating my blog via HTML, when I had something to show I didn&amp;#8217;t ask how it was going to live in a CMS, I just threw it up. 
&lt;/p&gt;
&lt;p&gt;With this in mind I don&amp;#8217;t exactly know where Playground Blues is headed. There is a lot of data that I&amp;#8217;m collecting that I haven&amp;#8217;t figured out how to share or even if it makes sense to share. I am, however, eager to explore the Art of maintaining a personal site and in the coming weeks I&amp;#8217;d like to discuss this more along with some of my concerns regarding digital preservation. Stay tuned. 
&lt;/p&gt;

  &lt;p&gt;&lt;a href="/posts/2007/apr/11/bringing-back-personal/"&gt;Comment&lt;/a&gt;&lt;/p&gt;


</description><pubDate>Wed, 11 Apr 2007 00:35:00 -0600</pubDate><guid>http://playgroundblues.com/posts/2007/apr/11/bringing-back-personal/</guid></item></channel></rss>
