<?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; Rallyhat</title>
	<atom:link href="http://www.littlehart.net/atthekeyboard/category/rallyhat/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>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>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&#8217;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&#8217;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 &#8212; nickname for a baseball team (i.e. Yankees, Red Sox, Padres).  Don&#8217;t forget to urlencode the spaces with a +</li>
<li>begin_date &#8212; date in YYYY-MM-DD format</li>
<li>end_date &#8212; date in YYYY-MM-DD format</li>
</ul>
<p>
It&#8217;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>
		<item>
		<title>Building Rallyhat: First Steps</title>
		<link>http://www.littlehart.net/atthekeyboard/2008/03/25/building-rallyhat-first-steps/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2008/03/25/building-rallyhat-first-steps/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 01:30:26 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/2008/03/25/building-rallyhat-first-steps/</guid>
		<description><![CDATA[This will be the first in a series of posts chronicling my building out of Rallyhat, a site that people will use to plan sporting road trips, baseball first. In this first installment I wanted talk a bit about the first steps I too to actually get this thing rolling. Now, I could easily build [...]]]></description>
			<content:encoded><![CDATA[<p>This will be the first in a series of posts chronicling my building out of Rallyhat, a site that people will use to plan sporting road trips, baseball first.  In this first installment I wanted talk a bit about the first steps I too to actually get this thing rolling.</p>
<p>
Now, I could easily build this site in CakePHP, so that's not really much of a challenge.  I already have <a href="http://www.ibl.org">one site that runs Cake</a> to keep me on top of things there, and future work-related projects are going to be CakePHP for me as well.  So, something else then?  I already did the Rails thing, and tore that down to build the CakePHP one.  I thought about using <a href="http://merbivore.com/">Merb</a>, and I'm going to attend a talk at <a href="http://openwebvancouver.ca">Open Web Vancouver</a> about Merb so I get a better idea about what it could do for me.  So that left just <a href="http://www.djangoproject.com">one choice</a>.
</p>
<p>
C'mon, you're not really surprised are you?
</p>
<p>
One of the things I really liked about Django is the admin app that you get for free.  I've already been using it to full some of my support tables for the application, but I wanted to talk about a neat little thing you can do here.  In Django, you define the names of the fields in your model in order for the ORM magic to work.  Here's a little sample:</p>
<div class="igBar"><span id="lpython-5"><a href="#" onclick="javascript:showPlainTxt('python-5'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-5">
<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;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models</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> Sport<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; name = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;color:#800000;">30</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; </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> Admin:</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; <span style="color: #ff7700;font-weight:bold;">pass</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
</p>
<p>
The Admin stuff is so that those models show up properly in the admin part of the application.  So, just like in CakePHP where you can use $this->Model->find('list') to get an array for use in your dropdowns for forms.  Django, does this a little differently.
</p>
<p>
Being totally object oriented, if you drop into the Python interpreter and ask it to return a model to you, you'll get something like this, taken from the Django tutorials:</p>
<div class="igBar"><span id="lpython-6"><a href="#" onclick="javascript:showPlainTxt('python-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-6">
<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: black;">&#40;</span>chartjes@jackjack ~/Sites/rallyhat<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;">&gt;python manage.<span style="color: black;">py</span> shell</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;">Python <span style="color: #ff4500;color:#800000;">2</span>.<span style="color: #ff4500;color:#800000;">5</span>.<span style="color: #ff4500;color:#800000;">1</span> <span style="color: black;">&#40;</span>r251:<span style="color: #ff4500;color:#800000;">54863</span>, Jan <span style="color: #ff4500;color:#800000;">17</span> <span style="color: #ff4500;color:#800000;">2008</span>, <span style="color: #ff4500;color:#800000;">19</span>:<span style="color: #ff4500;color:#800000;">35</span>:<span style="color: #ff4500;color:#800000;">17</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;"><span style="color: black;">&#91;</span>GCC <span style="color: #ff4500;color:#800000;">4</span>.<span style="color: #ff4500;color:#800000;">0</span>.<span style="color: #ff4500;color:#800000;">1</span> <span style="color: black;">&#40;</span>Apple Inc. <span style="color: black;">build</span> <span style="color: #ff4500;color:#800000;">5465</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> on darwin</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: #008000;">Type</span> <span style="color: #483d8b;">"help"</span>, <span style="color: #483d8b;">"copyright"</span>, <span style="color: #483d8b;">"credits"</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">"license"</span> <span style="color: #ff7700;font-weight:bold;">for</span> more information.</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: black;">&#40;</span>InteractiveConsole<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;">&gt;&gt;&gt; <span style="color: #ff7700;font-weight:bold;">from</span> rallyhat.<span style="color: black;">www</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Sport</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&gt;&gt;&gt; Sport.<span style="color: black;">objects</span>.<span style="color: black;">all</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;"><span style="color: black;">&#91;</span>&lt;sport : Sport object&gt;<span style="color: black;">&#93;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&gt;&gt;&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>
WTF?  What good is "Sport: Sport object" to us?  I want something more descriptive.  How about the name of the sport?  That's easy.  We can modify the Sport model and tell it that when we return the object, return the "name" field instead.
</p>
<div class="igBar"><span id="lpython-7"><a href="#" onclick="javascript:showPlainTxt('python-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-7">
<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> Sport<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; name = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;color:#800000;">30</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; </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> Admin:</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; <span style="color: #ff7700;font-weight:bold;">pass</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;">name</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
</sport></p>
<p>
So, when I drop into the shell, I get the following:</p>
<div class="igBar"><span id="lpython-8"><a href="#" onclick="javascript:showPlainTxt('python-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-8">
<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: black;">&#40;</span>chartjes@jackjack ~/Sites/rallyhat<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;">&gt;python manage.<span style="color: black;">py</span> shell</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;">Python <span style="color: #ff4500;color:#800000;">2</span>.<span style="color: #ff4500;color:#800000;">5</span>.<span style="color: #ff4500;color:#800000;">1</span> <span style="color: black;">&#40;</span>r251:<span style="color: #ff4500;color:#800000;">54863</span>, Jan <span style="color: #ff4500;color:#800000;">17</span> <span style="color: #ff4500;color:#800000;">2008</span>, <span style="color: #ff4500;color:#800000;">19</span>:<span style="color: #ff4500;color:#800000;">35</span>:<span style="color: #ff4500;color:#800000;">17</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;"><span style="color: black;">&#91;</span>GCC <span style="color: #ff4500;color:#800000;">4</span>.<span style="color: #ff4500;color:#800000;">0</span>.<span style="color: #ff4500;color:#800000;">1</span> <span style="color: black;">&#40;</span>Apple Inc. <span style="color: black;">build</span> <span style="color: #ff4500;color:#800000;">5465</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> on darwin</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: #008000;">Type</span> <span style="color: #483d8b;">"help"</span>, <span style="color: #483d8b;">"copyright"</span>, <span style="color: #483d8b;">"credits"</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">"license"</span> <span style="color: #ff7700;font-weight:bold;">for</span> more information.</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: black;">&#40;</span>InteractiveConsole<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;">&gt;&gt;&gt; <span style="color: #ff7700;font-weight:bold;">from</span> rallyhat.<span style="color: black;">www</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Sport</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&gt;&gt;&gt; Sport.<span style="color: black;">objects</span>.<span style="color: black;">all</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;"><span style="color: black;">&#91;</span>&lt;sport : MLB&gt;<span style="color: black;">&#93;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&gt;&gt;&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
</sport></p>
<p>
Same result, different way to get to it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2008/03/25/building-rallyhat-first-steps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Opinionated Software, The Podcast</title>
		<link>http://www.littlehart.net/atthekeyboard/2007/07/17/opinionated-software-the-podcast/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2007/07/17/opinionated-software-the-podcast/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 13:18:33 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[Real Life]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Vancouver PHP 2007]]></category>
		<category><![CDATA[php|tek]]></category>
		<category><![CDATA[php|works]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/2007/07/17/opinionated-software-the-podcast/</guid>
		<description><![CDATA[A while back I was contacted by Cal Evans over at the Zend Developer Zone to contribute to a new podcast he was starting up called PHP Abstract. Very cool idea, a small 5 to 7 minute podcast by PHP developers where they talk about a topic of interest to them (and hoepfully to you). [...]]]></description>
			<content:encoded><![CDATA[<p>A while back I was contacted by Cal Evans over at the <a href="http://devzone.zend.com">Zend Developer Zone</a> to contribute to a new podcast he was starting up called <a href="http://devzone.zend.com/tag/PHP_Abstract">PHP Abstract</a>.  Very cool idea, a small 5 to 7 minute podcast by PHP developers where they talk about a topic of interest to them (and hoepfully to you).  Well, being one to never miss out on an oppurtinity to promote myself I agreed to contribute what I could.  I settled on a brief talk about <a href="http://devzone.zend.com/article/2349-PHP-Abstract-Podcast-Episode-11-Opinionated-Software">opinionated software</a>.  Also known as "convention over configuration" by the <a href="http://www.rubyonrails.org">Ruby on Rails</a> crowd.</p>
<p>
Go over and have a listen and don't be shy in sharing your feedback via the comments there or here.  Opionated software / convention over configuration / tools with rules is a powerful yet misunderstood programming practice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2007/07/17/opinionated-software-the-podcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Glue vs. Full Stack</title>
		<link>http://www.littlehart.net/atthekeyboard/2007/05/30/glue-vs-full-stack/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2007/05/30/glue-vs-full-stack/#comments</comments>
		<pubDate>Wed, 30 May 2007 17:26:06 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Rallyhat]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/2007/05/30/glue-vs-full-stack/</guid>
		<description><![CDATA[[Note: looks like the move to the new server will take some time as I configure things *just so* so blogging can continue] So I'm sitting around thinking about how I'm going to build out the new rallyhat.com, turning it into a "plan a baseball road trip site" and figuring out what tech to use. [...]]]></description>
			<content:encoded><![CDATA[<p>[Note: looks like the move to the new server will take some time as I configure things *just so* so blogging can continue]</p>
<p>
So I'm sitting around thinking about how I'm going to build out the new rallyhat.com, turning it into a "plan a baseball road trip site" and figuring out what tech to use.  To be honest, I've gotten kind of bored with Ruby on Rails for a few reasons.  One is that I understand the tech behind Rails, and don't agree with a lot of the magic methods that Ruby seems to be encouraging.  I like to sort of understand what's going on rather than being told "just do it this way".  I don't understand Ruby enough to wade into the source for Rails and figure things out.  Secondly is that I haven't touched any Rails code in months, so any momentum I had has leached out.</p>
<p>So, I like to learn new languages because, well, it makes me a better programmer.  I've spent my time this year learning my way around Javascript so I can get a firm grip on just how all this Ajax stuff is supposed to work.  Now I'm glancing over at Python and trying to decide if I want to invest in learning Python so I can try out Django, a web application framework that gets lots of nice things said about it.  Not as flavour-of-web-pi that Rails has become, but a solid, well-documented web application framework.</p>
<p>
So naturally I do some research and found an interesting post about <a href="http://jesusphreak.infogami.com/blog/vrp1">Python web development frameworks</a> that talks about Django vs. Pylons vs. Turbogears.  Very interesting reading and it convinced me that Django is the way I should go if I'm going to become a snake handler on this project.  But I followed some other links and got to a page (can't find it now of course but I remember it) where there was a discussion of glue vs. full stack frameworks.
</p>
<p>
A glue framework provides you with a bunch of components that you can use together, but don't necessarily have to.  Zend Framework is a PHP glue framework, as it comes with all these cool components that you can pick and choose depending on what you need done.  You're not forced to use them, and this appeals to certain programmers who have fallen in love with their own quirky set of libraries and methodologies.  This used to be me.  To shift this over to Python, since I know no Python at this point i would be pointless to go with a glue framework.
</p>
<p>
A full stack framework gives you everything you need to create your web app, and pretty much forces you to use it.  <a href="http://cakephp.org">CakePHP</a> is a full-stack framework.  It has a bunch of conventions, and you must follow them or die.  Okay, maybe you won't die but your application will never work properly if you don't understand the conventions.  Django is a full-stack framework.  So, given my knowledge level of Python I think that would be my safe choice.
</p>
<p>However, I have the Imp of the Perverse mumbling into my ear that I should just build the damn site, screw Python because we're tying to get something done here.  So I'm thinking that I need to put my money where my mouth is, and build in CakePHP.  After all, I have that cool interactive console to test stuff with.
</p>
<p>
So, give me some feedback:  which do you prefer when building an application? Full stack or glue?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2007/05/30/glue-vs-full-stack/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>What&#8217;s Chris Thinking About, February Edition</title>
		<link>http://www.littlehart.net/atthekeyboard/2007/02/21/whats-chris-thinking-about-february-edition/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2007/02/21/whats-chris-thinking-about-february-edition/#comments</comments>
		<pubDate>Wed, 21 Feb 2007 16:11:24 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/2007/02/21/whats-chris-thinking-about-february-edition/</guid>
		<description><![CDATA[My apologies for the lateness (and shortness) of this post. Real life has intruded this week. More news on this later. But here's what's jumping around in my brain: Nate from CakePHP is helping me out with the work on my proposal for an interactive console. Trax (a Cake "competitor") has an interactive shell so [...]]]></description>
			<content:encoded><![CDATA[<p>My apologies for the lateness (and shortness) of this post.  Real life has intruded this week.  More news on this later.  But here's what's jumping around in my brain:</p>
<ul>
<li><a href="http://cake.insertdesignhere.com/">Nate</a> from CakePHP is helping me out with the work on my proposal for an interactive console.  Trax (a Cake "competitor") has an interactive shell so I'm taking a look at how they are doing things to see what I can use from it.  Thank you open source licensing!</li>
<li>There has been great feedback from those who watched the screencast of my talk from Vancouver and I'm going to tweak the talk for May.  Remove some slides, avoid duplication and build up the parts that drew a lot of interest:  deployment and programmer ego.</li>
<li>I'm going to have to dive into the slightly old <a href="http://www.typosphere.org">Typo</a> install and figure out how to stop the huge amounts of trackback spam we've been getting.  Seems that the Typo install I'm running ignores requests to stop accepting trackbacks.  Gotta fix that by hacking at the source</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2007/02/21/whats-chris-thinking-about-february-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rallyhat.com &#8212; moving forward</title>
		<link>http://www.littlehart.net/atthekeyboard/2007/01/20/rallyhatcom-moving-forward/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2007/01/20/rallyhatcom-moving-forward/#comments</comments>
		<pubDate>Sat, 20 Jan 2007 19:24:47 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/2007/01/20/rallyhatcom-moving-forward/</guid>
		<description><![CDATA[I've gotten some work done on Rallyhat lately, mostly on the train ride home but some stuff in the evenings when I need an internet connection for looking up some sites and testing. Here's what I've gotten working: User signup (complete with email and activation code) User authentication The next thing I'm working on is [...]]]></description>
			<content:encoded><![CDATA[<p>
I've gotten some work done on Rallyhat lately, mostly on the train ride home but some stuff in the evenings when I need an internet connection for looking up some sites and testing.  Here's what I've gotten working:</p>
<ul>
<li>User signup (complete with email and activation code)</li>
<li>User authentication</li>
</ul>
<p>
The next thing I'm working on is the Hunt stuff.  I've got to write some code to create hunts, allow people to join up with a hunt and stuff like that.  As part of that I will also have to do work on the image upload and storage part of the site, which has me worried due to potential bandwidth issues, but I might use Amazon's awesome SSS for that and see what the bills are like.  Along the way, I'm writing unit tests to go with my code because when my current host upgrades to Rails 1.2 I want to be able to do the same at my end, and a simple "rake test" command will run all my tests and point out anything that will be broken and needs to be fixed.  I suggest that interested parties go to <a href="http://weblog.rubyonrails.org">the Rails blog</a> to see the latest news about Rails 1.2</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2007/01/20/rallyhatcom-moving-forward/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Application authentication</title>
		<link>http://www.littlehart.net/atthekeyboard/2007/01/16/application-authentication/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2007/01/16/application-authentication/#comments</comments>
		<pubDate>Tue, 16 Jan 2007 15:01:10 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Chris' Brain]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/2007/01/16/application-authentication/</guid>
		<description><![CDATA[On the CakePHP mailing list I see frequent questions about various ACL and authorization plugins that are available for cake. I've never used anything beyond simple authentication and access control and always felt that ACL schemes were either too hard to implement or too restrictive. Honestly, do you really need to have one person who [...]]]></description>
			<content:encoded><![CDATA[<p>On the CakePHP mailing list I see frequent questions about various ACL and authorization plugins that are available for cake.  I've never used anything beyond simple authentication and access control and always felt that ACL schemes were either too hard to implement or too restrictive.  Honestly, do you really need to have one person who can see 5 reports and another see 6?  I never saw the point of that, but perhaps one day I will run into a scenario where that is needed.
</p>
<p>Rallyhat needed some authentication.  Being a Rails app, there were tons of options.  Basically, they revolve around the same principle:  there is a feature called a before_filter that runs before you execute any action in a controller.  Lucky for my fellow CakePHP users, there is a similar feature in CakePHP.  So, you create a function that you call via the before_filter (beforeFilter in CakePHP) that verifies that the person has permission to access the current controller.  Yep, it's really that simple.
</p>
<p>
Of course, there are many varied ways to do the whole login / assign roles to users, too many to list here.  Don't expect any code here either, as I haven't written any.  Like any lazy programmer, I steal from the best. <img src='http://www.littlehart.net/atthekeyboard/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   For Rallyhat I'm using Rick Olson's awesome <a href="http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated">acts_as_authenticated</a> plugin.  Man, it is PERFECT for what I need.  You install the plugin, head over to the stikipad where the documentation is and it gives you just about everything you need.  Signup, login, activation codes, email confirmation, "forgot my password" stuff.  I can't imagine how much time this has saved me.  Oh yeah, on top of it it comes with tests to make sure everything is working.  Make a change, run 'rake test' and fix any errors that pop up.  Rallyhat will require a full commitment to writing tests, so I'm glad to get into the habit of it.
</p>
<p>
So, if you want some simple authentication then if you're using CakePHP, fool around with using a beforeFilter to do things like look for a cookie or look in the session for a variable that says you are logged in.  Authentication doesn't have to be complicated, it just has to work.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2007/01/16/application-authentication/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rallyhat.com &#8212; Now live!</title>
		<link>http://www.littlehart.net/atthekeyboard/2007/01/03/rallyhatcom-now-live/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.littlehart.net/atthekeyboard/2007/01/03/rallyhatcom-now-live/#comments</comments>
		<pubDate>Wed, 03 Jan 2007 04:45:43 +0000</pubDate>
		<dc:creator>Chris Hartjes</dc:creator>
				<category><![CDATA[Rallyhat]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.littlehart.net/atthekeyboard/2007/01/03/rallyhatcom-now-live/</guid>
		<description><![CDATA[My side project is Rallyhat, an idea I've had for some time now. Basically, it's a digital photo scavenger hunt with a nice social networking twist. I have a teaser page up right now where you can submit your email address to be notified of when a beta is ready to be used. It's built [...]]]></description>
			<content:encoded><![CDATA[<p>My side project is <a href='http://rallyhat.com'>Rallyhat</a>, an idea I've had for some time now.  Basically, it's a digital photo scavenger hunt with a nice social networking twist.  I have a teaser page up right now where you can submit your email address to be notified of when a beta is ready to be used.</p>
<p>
It's built using Ruby on Rails.  Why Rails?  Well, aside from all my soul-searching about what to use, there is a simple reason:  I could build it in PHP quite easily, but where's the challenge in that?  All my side projects teach me something and I'm confident I'll come out of this as a kick-ass Rails developer, along with learning some techniques I can apply to my PHP programming.
</p>
<p>
Please visit the site, sign up to be notified of the availability of a beta release and let me know any comments you might have.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.littlehart.net/atthekeyboard/2007/01/03/rallyhatcom-now-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
