<?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>@TheKeyboard &#187; Django</title>
	<atom:link href="http://www.littlehart.net/atthekeyboard/tag/django/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.littlehart.net/atthekeyboard</link>
	<description>Facebook should&#039;ve be written in unicornSchemaLang, because everyone *knows* that PHP is no good for anything, right?</description>
	<lastBuildDate>Thu, 29 Jul 2010 20:05:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Coding Lessons Learned</title>
		<link>http://www.littlehart.net/atthekeyboard/2010/07/21/coding-lessons-learned/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2010/07/21/coding-lessons-learned/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 00:51:39 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[full-stack]]></category>
		<category><![CDATA[lessons learned]]></category>
		<category><![CDATA[lightweight]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=738</guid>
		<description><![CDATA[In discussions with my friend Kevin, I have come to realize that we have arrived at the same conclusions about the use of web application frameworks. Much of these conclusions have driven from 12+ years in building applications using them, with various rates of success. Suffice it to say, only the most l33t programmers out [...]]]></description>
			<content:encoded><![CDATA[<p>In discussions with my friend <a href="http://chiggsy.com">Kevin</a>, I have come to realize that we have arrived at the same conclusions about the use of <a href="http://en.wikipedia.org/wiki/Web_application_framework">web application frameworks</a>.  Much of these conclusions have driven from 12+ years in building applications using them, with various rates of success.  Suffice it to say, only the most l33t programmers out there are using their own frameworks, be it a custom one or contributing to the creation of an open-sourced framework.  Everyone else is like me:  a user of frameworks, and extremely rare contributor back to those frameworks.
</p>
<p>Since Kevin and I are travelling together through the world of <a href="http://python.org">snake handling</a>, we have been looking at the available options for building web applications in that environment.  Our conclusions have been surprising to ourselves, but I think they can be very instructive to others.   These two lessons are applicable to other programming languages as well, so feel free to substitute your favourite language where applicable.
</p>
<h3>Lesson 1: Full-stack gets you in the door, lightweight lets you find your niche</h3>
<p>
If you want to learn Python for the web, the first place you go is <a href="http://djangoproject.com">Django</a>.  It is a full-stack solution for building things in Python.  Awesome documentation, and with some help from Python&#8217;s online documentation, you can build an app in a reasonable time frame without knowing a ton of Python.  Awesome tutorials and code samples FTW!  I have built a Django app and briefly made it public.  It was, like so many other things, a piece of crap missing functionality so I am trying to rectify that in my ever-dwindling spare time.   I did not find any serious obstacles to building this app, except for figuring out how to do some dynamic form-field-generating code.  It took me a while to find the right info (amazing how having the correct keywords in your search helps) but I did.
</p>
<p>
As an old warrior of frameworks (10 and counting across 3 languages) I found that because I already understood the concepts behind MVC (or MVT in the case of Django) I could concentrate on learning Python first, and then the unique features of the framework after that.
</p>
<p>
In many ways, my early experiments with Rails (back in 2004-2005) helped me understand frameworks a lot better.  All frameworks have their own magic methods for doing things, with Rails making heavy use of Ruby&#8217;s ability to create Domain Specific Languages to make Rails the incredibly useful framework that it is today.  But eventually, your skill with the language and the framework gets to the point where you see the limitations of the conventions and magic methods the framework uses.
</p>
<p>Now that I&#8217;ve gotten my hooks into building stuff with Django, I now recognize the same seductive promises that I found in things like CakePHP:  the full-stack takes you away from actually figuring out how to code things, and instead you find yourself just using all the built-in methods.  Don&#8217;t get me wrong, the built-in stuff for Django is awesome.  But if I want to push my skills forward so I can say &#8220;I can build stuff for the web using Python&#8221; instead of &#8220;I can build stuff for the web using Django&#8221; I need to use other tools.  What if I want to run my stuff on Google App Engine?  Sure, there are these hacks available for Django that make it &#8220;usable&#8221; on GAE, but that&#8217;s not what I want.  And what about the use of WSGI instead of relying on mod_python?  Forgive me if this stuff comes across as technobabble.  It was technobabble to me at one time too.
</p>
<p>
So now the next step is (after finishing the current Django app) is to build an application using a much more <a href="http://flask.pocoo.org/">lightweight framework</a>.  Why?  Because it&#8217;s time to actually learn how to do something instead of relying on magic methods.  Because once I learn to write code to duplicate those magic methods, I&#8217;ll be able to use Django *and* Flask.  And that, my friends, is how you make yourself useful.  That and the ability to run the app both as a standalone WSGI app or on Google App Engine seems like a bonus to me.
</p>
<p>
So now that you&#8217;ve gone from full-stack to lightweight, it&#8217;s time to look at the next lesson&#8230;
</p>
<h3>Lesson 2: Don&#8217;t use anything made by One Guy</h3>
<p>
This will undoubtably be a touchy subject for some.  Let me try and explain it.
</p>
<p>
In the quest for the lightweight solution, I ran across <a href="http://web2py.com">web2py.</a>  Nice and lightweight, awesome documentation, but it&#8217;s all driven by ONE GUY.  Experience has taught me that projects driven by ONE GUY end up looking like how the ONE GUY would do it.  Sometimes the ONE GUY is brilliant and it all works out.  That is rare, in my experience.   Open source projects are littered with the wreckage caused by egos and control freaks who were unwilling to accept outside help to solve problems.
</p>
<p>So look for projects where it appears there are solid contributors beyond ONE GUY.  web2py sure has an impressive list of people who contribute, but is Massimo the ONE GUY when it comes to actually making non-trivial code changes?  I sure hope not.
</p>
<h3>There will be no test afterwards</h3>
<p>
While I do not expect other people&#8217;s experiences to be the same as mine, I&#8217;m pretty sure I am not the only person who has learned these lessons.  So the next time you are evaluating using a web application framework (in a new language or an existing one) think back on these lessons.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2010/07/21/coding-lessons-learned/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Expand your programming mind:  filters in Lithium</title>
		<link>http://www.littlehart.net/atthekeyboard/2010/03/16/expand-your-programming-mind-filters-in-lithium/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2010/03/16/expand-your-programming-mind-filters-in-lithium/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 15:27:17 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[aspect-oriented programming]]></category>
		<category><![CDATA[behaviors]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[callbacks]]></category>
		<category><![CDATA[closures]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[filters]]></category>
		<category><![CDATA[li3]]></category>
		<category><![CDATA[namespaces]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=699</guid>
		<description><![CDATA[Out of the ashes of a severe personality clash in an open source PHP web application framework project rose a new framework proclaiming that it simply sucks less than all the others. Lithium, otherwise known as li3, is the latest PHP application framework to come onto the scene. I know what you&#8217;re saying. *Yawn*. As [...]]]></description>
			<content:encoded><![CDATA[<p>Out of the ashes of a severe personality clash in an <a href="http://cakephp.org">open source PHP web application framework project</a> rose a new framework proclaiming that it <a href="http://rad-dev.org/lithium/wiki">simply sucks less than all the others</a>.  Lithium, otherwise known as li3, is the latest PHP application framework to come onto the scene.  I know what you&#8217;re saying.  *Yawn*.
</p>
<p>
As far as I can tell, Lithium is trying it&#8217;s hardest to be fast, lightweight, and use all the features that PHP 5.3 has to offer.  I am unable to use it at work for a variety of reasons (not stable, required PHP 5.3 only, <a href="http://twitter.com/nateabele">Nate</a> is always picking on me via IM) but I am more interested in the ideas that are coming out of it.
</p>
<p>
It is using all the newest hawtness in the PHP world:  namespaces, closures, Phar, late static binding.  I could go on, but probably most of these things mean nothing to you until you actually need them.  In the framework world, namespaces are a big deal, an essential tool to avoiding collisions with 3rd party code you might want to integrate into your project.  Closures are very familiar to those who&#8217;ve done work with Ruby or Javascript.  Phar allows for some unarchiving on the fly of code, even potentially distributing your application as an archive that can be run.  Late static binding is something I&#8217;m trying to comes to grips with, as I have either never come across a need for it or never realized that I did and have implemented a workaround for it not realizing there is a simpler solution.
</p>
<p>
None of these are what I want to talk about.  I want to talk about something that I feel is a very underrated part of Lithium, the ability to define filters.  This is a concept that you find in <a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">Aspect-oriented programming</a>, and one that I imagine most programmers have never considered.  Here&#8217;s why I think it&#8217;s a big deal.
</p>
<p>
Most frameworks are designed around an OOP paradigm.  Yes, some mix them together (I&#8217;m looking at *you* CodeIgniter), but by and large you get the job done by extending on a base model / controller / helper / whatever to create new functionality.  Sometimes this is not avoidable.  But what AOP says is that there is another way, a way that Lithium has adopted as well.
</p>
<p>
Hence the creation of &#8220;filters&#8221;.  As far as I can tell (and I&#8217;m sure I will be jumped upon if I am wrong) the purpose of filters in Lithium is to allow you to add functionality without extending the class itself.  When I saw that I immediately understood why that is so awesome.
</p>
<p>
The idea of callbacks is also very similar:  if X happens, run code Y.  A staple of jQuery, Rails and probably other projects I have forgotten to mention.  The idea is still the same though.  In Garrett Woodworth&#8217;s <a href="http://www.slideshare.net/gwoo/li3-ocphp">presentation about Lithium to the Orange County PHP Users Group</a> he goes  over some solid examples of filters including:</p>
<ul>
<li>automatic use of the <a href="http://mirror.facebook.net/facebook/xhprof/doc.html">XHProf</a> for code profiling</li>
<li>automatic setting of parameters upon saving a pasted bit of code</li>
</ul>
<p>It&#8217;s also been used to <a href="http://misja.posterous.com/playing-with-lithium">automatically change string record ID&#8217;s into a MongoDB ID</a> and <a href="http://latestatic.com/integration-testing-or-how-i-learned-to-stop">graceful failing of an integration test suite when an error occurs</a>.
</p>
<p>
These filters remind me of behaviors in Rails (and in CakePHP as well) and makes me wonder if signals are the same thing in the Django world.  All in all, this looks to me to be a better way to extend functionality than actually overriding existing methods or hacking at something deep inside a class.  Figure out what functionality you want, figure out where it needs to be called, and add your filter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2010/03/16/expand-your-programming-mind-filters-in-lithium/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rallyhat lives!</title>
		<link>http://www.littlehart.net/atthekeyboard/2010/03/12/rallyhat-lives/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2010/03/12/rallyhat-lives/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 22:00:58 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Django Debug Toolbar]]></category>
		<category><![CDATA[django-registration]]></category>
		<category><![CDATA[Eric Florenzano]]></category>
		<category><![CDATA[geopy]]></category>
		<category><![CDATA[Gunicorn]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=694</guid>
		<description><![CDATA[Some of my long-time readers have seen me mention a long-festering (I believe that is the correct term at this point) project that I dubbed Rallyhat. It first started out as a &#8220;figure out when some baseball teams are in town and buy tickets&#8221; and then morphed into &#8220;a tool for helping people plan road [...]]]></description>
			<content:encoded><![CDATA[<p>
Some of my long-time readers have seen me mention a long-festering (I believe that is the correct term at this point) project that I dubbed <a href="http://www.rallyhat.com">Rallyhat</a>.  It first started out as a &#8220;figure out when some baseball teams are in town and buy tickets&#8221; and then morphed into &#8220;a tool for helping people plan road trips by tagging destinations with information&#8221;.
</p>
<p>
What it really became was a tool for me to learn how to write a solid web-app using Python and Django.  I&#8217;m happy to say I finally have a version that I feel comfortable sharing with the rest of you.  So feel free to check it out.  Pound on it, try and break it and I will also read your feedback and comments.  I&#8217;m sure you can figure out my email address&#8230;
</p>
<p>
Also, I&#8217;ve found it has been easy to pick up not only Python and Django itself.  I&#8217;m ready to tackle some other applications using Django, and I have one just in mind.
</p>
<p>
Yes, I am aware at how spartan it looks right now.  I&#8217;m more focussed on functionality than how it looks right now.  I&#8217;ve already gotten some interesting ideas on expanding the app to include adding in images to go with locations, so we&#8217;ll see how that goes.
</p>
<p>
For those who are curious, I built it using the following:</p>
<ul>
<li>Python 2.6</li>
<li>Django 1.2 beta 1</li>
<li><a href="http://couchdb.apache.org/">CouchDB</a> to store the trip plans</li>
<li><a href="http://code.google.com/p/couchdb-python/">couchdb-python</a></li>
<li><a href="http://code.google.com/p/geopy/">GeoPy</a></li>
<li><a href="http://bitbucket.org/ubernostrum/django-registration/">django-registration</a></li>
<li>Google Maps services</li>
<li><a href="http://github.com/robhudson/django-debug-toolbar">Django Debug Toolbar</a></li>
<li>deployed using Nginx + <a href="http://github.com/benoitc/gunicorn">Gunicorn</a>, configured with the help of <a href="http://twitter.com/ericlo">Eric Florenzano&#8217;s</a> awesome Django Advent article about <a href="http://djangoadvent.com/1.2/deploying-django-site-using-fastcgi/">deploying Django using FastCGI</a> because it mentioned how you could use Gunicorn</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2010/03/12/rallyhat-lives/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What Thrashed Around In Chris&#8217; Brain This Past Weekend</title>
		<link>http://www.littlehart.net/atthekeyboard/2009/11/23/what-thrashed-around-in-chris-brain-this-past-weekend/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2009/11/23/what-thrashed-around-in-chris-brain-this-past-weekend/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 02:12:49 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[blog experiment]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=606</guid>
		<description><![CDATA[(The blog experiment continues: 1 post every weekday in November and I think I only skipped one, but made up for it with a Saturday post) Node.js is something I want to use, but I do not know what for For those who don&#8217;t know, Node is a &#8220;toolkit for writing extremely high performance non-blocking [...]]]></description>
			<content:encoded><![CDATA[<p>(The blog experiment continues: 1 post every weekday in November and I think I only skipped one, but made up for it with a Saturday post)</p>
<p>
<i>Node.js is something I want to use, but I do not know what for</i><br />
For those who don&#8217;t know, <a href="http://nodejs.org/">Node</a> is a &#8220;toolkit for writing extremely high performance non-blocking event driven network servers in JavaScript&#8221;.  In other words, it&#8217;s for writing server-side Javascript with an emphasis on providing concurrency.  Damn you Tim Bray, I cannot avoid seeing concurrency everywhere since you started your <a href="http://www.tbray.org/ongoing/When/200x/2009/09/27/Concur-dot-next">Concur.next</a> series on your blog.  It fascinates me, and I don&#8217;t even do any kind of work where I need to worry about concurrency.  Not yet anyway.
</p>
<p>
Simon Wilson (someone I follow from the Django community) has a great article explaining why <a href="http://simonwillison.net/2009/Nov/23/node/">Node.js is genuinely exciting</a> to him, and my old CakePHP landsmann Felix shows <a href="http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb">how to handling streaming file uploads in node.js</a>.  Like so many new technologies, Node.js starts out as a solution looking for a problem but as I become more familiar with concurrency it all becomes a little clearer.
</p>
<p>
<i>While <a href='http://www.vim/org">Vim</a> is awesome, don&#8217;t put up with any crap from it</i><br />
I had been experiencing a problem with Vim.  Well, two problems.  The first big one was weird behaviour involving the <a href="http://www.vim.org/scripts/script.php?script_id=1849">AutoClose</a> plugin.  It would spit out brackets and quotes at the weirdest time, and I found myself doing a lot of unnecessary keystrokes (and toggling in and out of insert mode) to get things done.  So I deleted it.  Enough of that crap.  Same goes with my attempts to use the <a href="http://www.vim.org/scripts/script.php?script_id=69">Project plugin</a>.  I just could not get it to work properly.  DELETED.
</p>
<p>
Vim&#8217;s ability to be ultracustomizable ALSO makes it easy to dump stuff when you no longer what to use it.  Heck, I even see some stuff in my .vimrc that I am not using any more.  Mappings I did to accomplish some specific tasks.  Those were deleted too.
</p>
<p>
<i>Understanding the concept of callbacks opens your mind to all sorts of possibilities</i><br />
While callbacks are related to my use of Javascript (jQuery uses them to great success) I also find myself digging into the <a href="http://docs.djangoproject.com/en/dev/topics/signals/">documentation in Django on signals</a>, which are callbacks by another name:  functionality that is executed when certain events happen.</p>
<p>Django uses them all over the place, and CakePHP uses them as well.  When I look at the CodeIgniter code that powers <a href="http://www.sportso.com">Sportso</a>, I often ruminate about what programming techniques or design patterns could help me reduce the amount of code that has actually been written.  CodeIgniter doesn&#8217;t really support callbacks except in the form of allowing you to define custom functions for validation purposes.  It&#8217;s a start I get.  I wonder what the code would look like if I could define more code that is triggered when specific events happen?  Any time I find myself typing the same block of code over and over again, it is only natural that I seek to reduce how often I need to do it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2009/11/23/what-thrashed-around-in-chris-brain-this-past-weekend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Django As An Admin Area for a PHP Project, Part 1</title>
		<link>http://www.littlehart.net/atthekeyboard/2009/11/18/using-django-as-an-admin-area-for-a-php-project-part-1/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2009/11/18/using-django-as-an-admin-area-for-a-php-project-part-1/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 02:22:58 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[blog experiment]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[django-admin]]></category>
		<category><![CDATA[Postgres]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=599</guid>
		<description><![CDATA[My work project needed an admin area for doing things like changing the key for a league, or changing the email address for someone's account. You know, typical admin stuff. In the past I had been *gasp* editing SQL by hand via pgAdmin (and my favourite trick of creating an SSH tunnel to the server [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://www.sportso.com">work project</a> needed an admin area for doing things like changing the key for a league, or changing the email address for someone's account.  You know, typical admin stuff.  In the past I had been *gasp* editing SQL by hand via <a href="http://www.pgadmin.org/">pgAdmin</a> (and my favourite trick of creating an SSH tunnel to the server the database is on).  Well, I'd had enough of that.  I also wanted to set things up so when my boss wanted changes done, I could tell him "go do it yourself using this neato-keen admin interface I whipped together".
</p>
<p>
So I got to work creating a <a href="http://www.djangoproject.com">Django</a> project, installed the <a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/">django-admin</a> application and got to work.
</p>
<p>
Have I mentioned how I *love* code generation these days?  Can I get "hell yeah!" from the lazy programmers out there?  Django comes with this awesome tool that you access via manage.py called <a href="http://docs.djangoproject.com/en/dev/ref/django-admin/#inspectdb">inspectdb</a>.  What it does is introspect the database you configured for your Django application and generates the output for your models.py file.  However, keep in mind the following:</p>
<ul>
<li>You *will* have to fiddle with the order your classes that represent the models appear in the generated code</li>
<li>You *will* have to go in and alter any field definitions where inspectdb was not able to determine the proper field type and instead guessed.</li>
</ul>
<p>
So, after firing off inspectdb, I then issued a 'python manage.py syncdb' to create all the tables needed for django-admin, created a user for the admin site...and then it got hairy.
</p>
<p>
The documentation for customizing django-admin is good.  And I was able to create just about everything I wanted by actually, you know, READING the documentation.  But I found a problem that I was not able to solve.  I even <a href="http://stackoverflow.com/questions/1758805/problems-with-updating-records-in-django-admin">asked my favourite consultants for help</a> but I could not get it to work the way I *wanted* it to work.  When I told my buddy via IM that it would be easier to whip up this admin in PHP than slog through learning how to do it the Django way, he was not impressed.  He stopped short of saying "you're dead to me now", but I got that vibe.
</p>
<p>
Here's the problem.  I have these two models:</p>
<div class="igBar"><span id="lpython-3"><a href="#" onclick="javascript:showPlainTxt('python-3'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-3">
<div class="python">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">class</span> Permissions<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; league_key = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;color:#800000;">15</span><span style="color: black;">&#41;</span> </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; commissioner_id = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>Accounts, db_column=<span style="color: #483d8b;">'commissioner_id'</span>,</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; to_field=<span style="color: #483d8b;">'id'</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; status = models.<span style="color: black;">IntegerField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; key = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;color:#800000;">50</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; publisher_key = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;color:#800000;">25</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; publisher_display_name = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;color:#800000;">50</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; base_league = models.<span style="color: black;">IntegerField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; share = models.<span style="color: black;">IntegerField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; default_fixture_key = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;color:#800000;">50</span>, blank=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">publisher_key</span> + <span style="color: #483d8b;">' / '</span> + <span style="color: #008000;">self</span>.<span style="color: black;">league_key</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; </div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">class</span> Meta:</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; db_table = u<span style="color: #483d8b;">'permissions'</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; verbose_name = <span style="color: #483d8b;">'Permissions'</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; verbose_name_plural = <span style="color: #483d8b;">'Permissions'</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">class</span> PermissionsAdmin<span style="color: black;">&#40;</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">&#41;</span>:</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; list_display = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'league_key'</span>, <span style="color: #483d8b;">'publisher_key'</span>, <span style="color: #483d8b;">'commissioner_id'</span>, <span style="color: #483d8b;">'status'</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'share'</span>, <span style="color: #483d8b;">'default_fixture_key'</span><span style="color: black;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; list_display_links = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'league_key'</span>,<span style="color: black;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; exclude = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'base_league'</span>,<span style="color: black;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
</p>
<p>
Now, if you look at the definition in there for the base_league field, you will notice that I gave up and called it an IntegerField.  But in reality, it is pointing to another record in the same Permissions table.  We have a concept in Sportso of a "shared league model" where you can base a league on another league and import all sorts of properties and data from it.  I was hoping that I could do something like this:</p>
<div class="igBar"><span id="lpython-4"><a href="#" onclick="javascript:showPlainTxt('python-4'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-4">
<div class="python">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">base_league = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'self'</span>, db_column=<span style="color: #483d8b;">'base_league'</span>, to_field=<span style="color: #483d8b;">'id'</span><span style="color: black;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
</p>
<p>
Whenever I did that, I would actually crash Python on my MacBook.  Not a good sign.  If I tried swapping them, I would get an error complaining about violating permissions_pkey, which is the Postgres sequence that was created for the auto-incremented ID for the table.  I did manage to take a look at the SQL it was trying to execute, and it keeps trying to update the 'id' field (which is the primary key) instead of the 'base_league" field.  So I gave up and will continue building out the other parts of the admin.  I just wish I could figure out WHY this self-referencing foreign key setup was not working.
</p>
<p>
If you know what's going on here, let me know via the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2009/11/18/using-django-as-an-admin-area-for-a-php-project-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chris&#8217; Brain &#8211; Almost October 2009 Edition</title>
		<link>http://www.littlehart.net/atthekeyboard/2009/09/24/chris-brain-almost-october-2009-edition/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2009/09/24/chris-brain-almost-october-2009-edition/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 20:56:37 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=541</guid>
		<description><![CDATA[Can you tell I have nothing earth-shattering to talk about? Here are the two things taken up processing space in my brain I won't use frameworks without built-in testing support any more I'm doing some very hairy refactoring of code at work to support a new concept of ownership of content generated by the application. [...]]]></description>
			<content:encoded><![CDATA[<p>Can you tell I have nothing earth-shattering to talk about?  Here are the two things taken up processing space in my brain</p>
<h3>I won't use frameworks without built-in testing support any more</h3>
<p>
I'm doing some very hairy refactoring of code at work to support a new concept of ownership of content generated by the application.  If I had been honest with myself and started the project with TDD practices, I'd be in much better shape.  While <a href="http://codeigniter.com">the framework that it was built with</a> is all the things it talks about, it is a non-trivial task to add a testing harness to it.  I'm trying to setup <a href="http://jamierumbelow.net/2009/08/11/setting-up-the-perfect-codeigniter-tdd-environment/">this environment</a> but I've run into a problem with being too stupid to figure out the changes to my Apache .htaccess file to make it work (UPDATE:  Thanks to <a href="http://twitter.com/spooons">@spooons</a> for helping me out to get it working).</p>
<p>
So you can take your lightweight frameworks and chuck them out the window if I have to waste more than 15 minutes of my time figuring out how to write tests for it.  TDD is an essential tool when you get to the maintenance phase of a project.
</p>
<h3>Django Applications are doing things right</h3>
<p>
If you use Django, you can find lots of third-party applications that you can literally drop into place into your existing one and start using it.  Can you imagine doing this with your favourite PHP framework?  Being ignorant, I have no idea how easy it would be to create something like <a href="http://uswaretech.com/blog/2009/08/django-socialauth-login-via-twitter-facebook-openid-yahoo-google/">Django-Socialauth</a> for Zend Framework, where you can drop it into your application and it comes with templates and models and controllers for handling all these things.   I was astounded by both the foresight that went into Django that allows people, as long as they follow specific conventions, to create standalone applications that you can use in pretty much any Django application.  As long as you haven't hacked Django itself too much.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2009/09/24/chris-brain-almost-october-2009-edition/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Digging Through The Bookmarks</title>
		<link>http://www.littlehart.net/atthekeyboard/2009/05/08/digging-through-the-bookmarks/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2009/05/08/digging-through-the-bookmarks/#comments</comments>
		<pubDate>Fri, 08 May 2009 21:01:29 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[data models]]></category>
		<category><![CDATA[defects]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[Limonade]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP frameworks]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=469</guid>
		<description><![CDATA[Although I never got into the habit of using online bookmarking services like Delicious (never really understood how/why to use them) I do tend to bookmark a lot of stuff. So as a change of pace I thought I'd go through my programming bookmarks and show you some of the stuff I found interesting enough [...]]]></description>
			<content:encoded><![CDATA[<p>Although I never got into the habit of using online bookmarking services like Delicious (never really understood how/why to use them) I do tend to bookmark a lot of stuff.  So as a change of pace I thought I'd go through my programming bookmarks and show you some of the stuff I found interesting enough to save:
</p>
<h3><a href="http://github.com/sofadesign/limonade/tree/master">Limonade, a PHP microframework</a></h3>
<p>I am Mr. Framework (Rails, ZF, CakePHP, Code Igniter, Django, I've tried a ton of 'em) so I found this project to be very interesting.  I think it's only really missing easy-to-do URL rewriting.  I could *probably* figure it out using whatever the web server for that project uses, but I am spoiled by the easy routing stuff in most frameworks.</p>
<h3><a href="http://marcgrabanski.com/article/jquery-google-maps-tutorial-ajax-php-mysql">jQuery and Google Maps</a></h3>
<p>
Marc Grabanski is a guy I met at the original <a href="http://cakefest.org">CakeFest</a> in Orlando, and he does so much amazing front-end work that I find myself going back to his site over and over again.  This is the second tutorial he has up there on using jQuery with Google Maps.  So well written, and so easy to implement with your own stuff.
</p>
<h3><a href="http://misko.hevery.com/">The Testability Explorer Blog</a></h3>
<p>Misko Hevery has this amazing blog where he talks about great testing practices.  For the love Murphy, please go read his blog and start testing your code.  I mean it!</p>
<h3><a href="http://venturehacks.com/articles/five-whys">The startup immune system</a></h3>
<p>
Great article on some recommended practices for making your company's handling of defects in the software they produce better.
</p>
<h3><a href="http://ivanidris.net/wordpress/index.php/2009/02/03/sharpen-the-vim-saw">Sharpen the Vim Saw</a></h3>
<p>
What?  You don't use <a href="http://www.vim.org">Vim</a>?!?!  That's okay, what Ivan Idris talks about here is finding inefficiencies in the way you use your editor-of-choice and eliminate them.</p>
<h3><a href="http://www.eecs.harvard.edu/~cduan/technical/git/">Understanding Git Conceptually</a></h3>
<p>
Want to know what the big deal about Git is?  Why are all the cool kids using it?  Well, many of *them* don't even know why Git is so awesome.  This site explains HOW Git works so you can understand WHY you should be using it.
</p>
<h3><a href="http://jeffcroft.com/blog/2006/jul/14/django-admin-your-php-app/">Django admin for your PHP app?</a></h3>
<p>
A quick guide to how to sneak Django into your PHP project as the rock-solid start of an admin area.  I have done this with a project at work at the prototype level (no code committed yet) and it just makes so much sense.</p>
<h3><a href="http://blog.johngoulah.com/2009/01/mysql-sandbox/">Quick DB Setups with MySQL Sandbox</a></h3>
<p>
Although I am lucky that I do not need to test my work code against different versions of MySQL, the techniques described here show how to do that exactly that in a way that is so simple I thought to myself "Why did nobody ever tell me you could do this?!?"</p>
<h3><a href="http://www.databaseanswers.org/data_models/index.htm">Library of Free Data Models</a></h3>
<p>
This site is awesome in a very subtle way.  It shows you all sorts of samples of building relationships between things in a data model.  Want an example of how to link agents and leads together for a recruiting company? They have one. Ever wanted to see how a hotel would handle booking reservations?  They got one.
</p>
<p>Okay, last one.  I promise</p>
<h3><a href="http://rope.sourceforge.net/">Rope, a python refactoring library</a></h3>
<p>
I'm starting to get into the world of refactoring tools as I dig into Python.  Rope is a tool to let you go through your Python code and identify things that need to be refactored, like duplicate code blocks that can be combined into one.  I so wish tools like this existed for PHP, as I would use them all the time.  Add in the fact that it can be integrated into Vim, well, I've got a tool that will become an essential part of my Python toolkit going forward.
</p>
<p>
So there you have it.  What hidden gems do you have to share?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2009/05/08/digging-through-the-bookmarks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Reader Feedback: Experiences With Django</title>
		<link>http://www.littlehart.net/atthekeyboard/2008/08/26/reader-feedback-experiences-with-django/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2008/08/26/reader-feedback-experiences-with-django/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 21:18:41 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[reader feedback]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=302</guid>
		<description><![CDATA[Welcome to Day 2 of my answering reader feedback questions here in the month of August. I was asked to share my experiences with Django. I will confess that I am a complete n00b when it comes to Python (wrote a few scripts for work-related stuff) and got an early alpha of my baseball road-trip [...]]]></description>
			<content:encoded><![CDATA[<p>Welcome to Day 2 of my answering reader feedback questions here in the month of August.  I was asked to share my experiences with Django.  I will confess that I am a complete n00b when it comes to Python (wrote a few scripts for work-related stuff) and got an early alpha of my baseball road-trip planning site actually working using Django.  Sure, it was ugly and very rough around the edges but I got it to work.  But I will say this:  if I had the opportunity to start working with Python and Django every day (and for the same pay I'm getting now) I would take it in a heartbeat.  Seriously.
</p>
<p>
So why all the love for Django and Python?  As a guy who's used PHP for a very long time, I'm really blind to the syntax of it.  All the griping about needle vs. haystack and "PHP is ugly" is just wasted on me.  Just so much pissing and moaning by people who should know better and lack the courage to learn the language they way they should.  I heard it described by Evan from Identi.ca as being "the working man's language".  Nothing wrong with that, as PHP is great at Getting Things Done.  But Python...Python is vastly different from PHP.  It's about objects.  It's about consistency.  It's about the most amazing interactive interpreter I've seen since I was a kid fooling around on my VIC-20 typing in programs from Compute! magazine.  Bet you didn't think I'd been using computers for that long.  To shift into bragging mode, I first got paid for programming when I wrote a program for my mother's school (she's a teacher) to create the salary grid for the teachers.  I was 12. I think.
</p>
<p>
Also, there's a dirty little secret about using frameworks that nobody really tells you.  After a while, it makes you lazy.  You forget how to do certain things because, well, the framework does it for you.  The other day there was a tweet from someone asking about the best way to sanitize data before you put it into the database.  My first thought was "sheesh, that's built into the framework" and then I stopped myself and said "you are getting goddamn lazy!".  My response was "try using mysql_real_escape_string(...)" but was also told about using PDO's binding of parameters as another way to do it.  See, those things are all done by the framework meaning lazy old Chris doesn't have to remember how to do it.  Until the time he's confronted with non-framework code that he cannot simply rewrite as part of a framework.  *gulp*.  So, since Python and Django are so different from the other frameworks I've used it forces me to STOP being lazy and actually learn how not only Django itself works but how the insides of it work as well.
</p>
<p>
Now, being an old hand at frameworks means using Django is not that big a stretch.  I spent a lot time googling around for the "Python (or Django) Way" to do things.  Except for a few concepts that are not familiar to a long time PHP guy (generators?) it wasn't that hard to get up and running with Django.  The documentation is awesome, and once you learn to stop writing PHP code in Python and instead embrace doing things the Python way, it becomes a lot easier.
</p>
<p>
In the end it's still datasource-backed models talking to some controller code and passing it onto some template.  I find the Django templates to be very limiting after my initial experiences and my "PHP is the template" background, and I think that as I get deeper into it I really have to find out how to do things the Django way.  What CakePHP calls Model-View-Controller, Django calls Model-View-Template, but it's really the same thing.
</p>
<p>
When I compare Ruby to Python, I don't get the feeling that I will have to resort to dynamic functions and closures to Get Things Done in Django like I see happening in Rails.  Besides, they seem to be two very different communities.  That's probably because the leaders of the Django community are so different in temperament and I don't see the same type of "Django rules, everything else sucks!" mind sets that I saw in the Rails community.  Maybe I'm just looking in the wrong places, but I feel more at ease in the Django community than the Rails community, albeit from the outer fringes of it.
</p>
<p>
So don't be lazy and complacent about the tools that you use.  Go and checkout Django and you might feel the same way about it as I do.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2008/08/26/reader-feedback-experiences-with-django/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>What&#8217;s In Chris&#8217; Brain &#8211; May 2008 Edition</title>
		<link>http://www.littlehart.net/atthekeyboard/2008/05/02/whats-in-chris-brain-may-2008-edition/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2008/05/02/whats-in-chris-brain-may-2008-edition/#comments</comments>
		<pubDate>Fri, 02 May 2008 20:35:43 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CSSEdit]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Komod]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Parallels]]></category>
		<category><![CDATA[PayPal]]></category>
		<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[YASP]]></category>
		<category><![CDATA[ZendCon]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=270</guid>
		<description><![CDATA[Yes, it's the day after May Day (workers of the world, unite!) and yes, I only managed to get one blog post done this week. So, it's time for a round-up of the stuff I've been thinking about this week. For all the bleating I did on the CakePHP mailing list this week about using [...]]]></description>
			<content:encoded><![CDATA[<p>Yes, it's the day after May Day (workers of the world, unite!) and yes, I only managed to get one blog post done this week.  So, it's time for a round-up of the stuff I've been thinking about this week.
</p>
<ul>
<li>For all the bleating I did on the CakePHP mailing list this week about using free and open software, the editor waffling continues and I was back to Komodo today.  I needed the security blanket of an IDE today after spending way too much time with <a href="http://macrabbit.com/cssedit/">CSSEdit</a> trying to get stuff lining up properly for a work project.</li>
<li>Halfway through a code review project as a side gig.  Old code, running on PHP 4.4.8 (those of you following me on Twitter saw me moaning about getting that working with CentOS on Parallels).  Needless to say, the code is a mess but I have to actually talk about WHY it's a mess and what can be done.</li>
<li>Trying to see if I can get a caching plugin for WordPress to work with nginx.  Not that I ever expect to get Dugg, but you never know.  Almost there...</li>
<li>Finally managed to get a Django app running properly inside the Google App Engine SDK.  Work on that got torpedoed this week by two slow-pitch games...that got rained out...after me waiting around for 20 minutes or so.  Next step is to build out my web service for Rallyhat.  Should only be a few hours work (he said, not knowing now what he will know later)</li>
<li>YASP (Yet Another Side Project) is going to get rolling this weekend.  Some cool stuff using Amazon S3, integration with OpenID and PayPal.  This time I actually have a plan to make some money. <img src='http://www.littlehart.net/atthekeyboard/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>I've submitted my "Deployment Isn't A 4 Letter Word" talk for <a href="http://www.zendcon.com">ZendCon</a>.</li>
<li>Been updating the IBL web site to use the latest CakePHP goodies, meaning just refactoring a lot of stuff that was garbage and using newer techniques I discover via the mailing list and Nate Abele's rantings.</li>
<li>Special thanks to <a href="http://traviscline.com/blog/">Travis Cline</a> for sending me a copy of "xUnit Test Patterns" from my Amazon Wish list!  Many thanks to a fellow budding Djangonaut for the gift.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2008/05/02/whats-in-chris-brain-may-2008-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Rallyhat:  Proof-of-concept Deployment</title>
		<link>http://www.littlehart.net/atthekeyboard/2008/04/12/building-rallyhat-proof-of-concept-deployment/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2008/04/12/building-rallyhat-proof-of-concept-deployment/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 01:39:49 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Google App Engine]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/?p=264</guid>
		<description><![CDATA[Well, that went relatively well. As a proof-of-concept for Google App Engine I decided to see what I could whip together today in between domestic duties, looking after the kids and praying that my wife gets better from her massive cold because I'm off to Vancouver tomorrow. So, I pushed the database for Rallyhat up [...]]]></description>
			<content:encoded><![CDATA[<p>Well, that went relatively well.  As a proof-of-concept for Google App Engine I decided to see what I could whip together today in between domestic duties, looking after the kids and praying that my wife gets better from her massive cold because I'm off to Vancouver tomorrow.
</p>
<p>So, I pushed the database for Rallyhat up into the cloud and wrote a super-simple front end just to see if I could do it.  You can take a quick peek at http://chrishartjes.appspot.com.  To get it to spit something out, you need 3 parameters:</p>
<ul>
<li>home_team -- nickname for a baseball team (i.e. Yankees, Red Sox, Padres).  Don't forget to urlencode the spaces with a +</li>
<li>begin_date -- date in YYYY-MM-DD format</li>
<li>end_date -- date in YYYY-MM-DD format</li>
</ul>
<p>
It's a small start, but a start nonetheless.  Next step is to configure my app to use the dev version of Django, not the built in version.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2008/04/12/building-rallyhat-proof-of-concept-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
