<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://www.davidgrant.ca">
<channel>
 <title>David Grant</title>
 <link>http://www.davidgrant.ca</link>
 <description>Welcome to my new Drupal site. I will be slowly moving old content over here as I figure out where to put it. I will also be writing news/blog articles when I feel like it.</description>
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/DavidGrant" /><feedburner:info uri="davidgrant" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>Hi, I'm glad you found my feed, please subscribe and stay up-to-date on everything I write about.</feedburner:browserFriendly><item>
 <title>The Worst (or Best) Rod Black Quotes from the 2010 Olympics in Vancouver</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/ZTwpewOdJ34/rod_blacks_bestworst_lines_2010_olympics_vancouver</link>
 <description>&lt;p&gt;Watching the short-track speed skating and figure skating at the Winter Olympics in Vancouver I was reminded of the sheer awesomeness that is Rod Black. Some love him, others want to strangle him (or maybe just hit the mute button). Throughout the Olympics I jotted down some of the most puke-worthy and groan-worthy things Rod Black said. Then I went to CTV's website and uncovered a few more gems. I'll leave the delivery up to you. Make sure to use lots of long pauses and think of Rod and his glorious mustache (which he unfortunately shaved off). Rod Black, if you see this, I hope you have a sense of humour!&lt;/p&gt;

&lt;table style="text-align: left; width: 500px;" border="1"
cellpadding="2" cellspacing="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 372px; font-weight: bold;"&gt;Rod
Black 2010 Olympics Quote&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 108px; font-weight: bold;"&gt;Puke-ometer&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 372px;"&gt;"Celebrate
Ilderton. Celebrate Moirs. Celebrate Virtues. Celebrate Canada."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 108px;"&gt;&lt;img
style="width: 105px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat3.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 372px;"&gt;"Flawless. If
there was a slip in their program, it was nary a slip."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 108px;"&gt;&lt;img
style="width: 70px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat2.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"They just happen to be the best
ice dancers on the planet."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 372px;"&gt;"The Americans
were perfect. The Canadians were perfect."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 108px;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 372px;"&gt;"We CAN believe!"&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 108px;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"Ohhhhhhhh Canada. Dream ride,
golden quest. They've skated together since they've been kids. They are
4 minutes away from the ultimate goal."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 105px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat3.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"Is it enough!? Magic!!! 11,000
in here think so."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke" src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;Marilyn: "It was an exquisite
performance. Exquisite." Rod Black: "It melted this ice. It brought the
crowd to its feet, and the house down."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 70px; height: 35px;" alt="Puke" src="sites/www.davidgrant.ca/files/images/splat2.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"The theme has been 'believe.' Do
you believe? &amp;lt;Virtue and Moir score announced&amp;gt; Yes!!!"&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 70px; height: 35px;" alt="Puke" src="sites/www.davidgrant.ca/files/images/splat2.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;[Virtue and Moir] Friends, Virtue-aly forever. Born to skate together."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 105px; height: 35px;" alt="Puke" src="sites/www.davidgrant.ca/files/images/splat3.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"We've got a couple of
Americans, a couple of Koreans, and a couple of Hamelins"&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 70px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat2.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"4 skaters. 5 laps. 3 medals. 2
Canadians. 1 Gold."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 105px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat3.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"The brothers Hamelin."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"You CAN believe Charles
Hamelin, you CAN!"&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 105px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat3.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"It is — Charles Hamelin. It is —
Francois Louis Tremblay. It is — Canada. Gold and Bronze, here TO-night!"&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 105px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat3.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"Pure. Canadian. Gold!"&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 70px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat2.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"China, to the fore!"&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;"The golden boy, Charles
Hamelin."&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;Absolute Gold here tonight!&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 70px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat2.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;And the brothers Hamelin are
going to be on a podium together — &lt;span style="font-style: italic;"&gt;their
dream&lt;/span&gt; — here in Vancouver.&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 35px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top;"&gt;The Canadian men had been shut
out. Couldn't crack the podium. They were saving the best — for last.&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;img
style="width: 70px; height: 35px;" alt="Puke"
src="sites/www.davidgrant.ca/files/images/splat2.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Idea for puke-ometer shamelessly stolen from the &lt;a href="http://www3.sympatico.ca/brooksdr/hallofshame.htm"&gt;Christie Blatchford Hall of Shame&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/ZTwpewOdJ34" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/rod_blacks_bestworst_lines_2010_olympics_vancouver#comments</comments>
 <category domain="http://www.davidgrant.ca/tags/funny">funny</category>
 <category domain="http://www.davidgrant.ca/tags/olympics">olympics</category>
 <pubDate>Wed, 03 Mar 2010 04:11:34 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">379 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/rod_blacks_bestworst_lines_2010_olympics_vancouver</feedburner:origLink></item>
<item>
 <title>NoMachine NX is awesome</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/Wm4DTHizIT8/nomachine_nx_awesome</link>
 <description>&lt;p&gt;Short-version:&lt;br /&gt;
&lt;strong&gt;Use NX. VNC sucks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I love Remote Desktop for connecting to Windows machines remotely. I worked from home many times while at Kodak and if it weren't for Remote Desktop, it would have been impossible to enjoy a full-screen connection to my work desktop while at home. I didn't think there was anything for Linux besides VNC until now (I had used remote X a long time ago though, to connect to the Solaris machines at UBC). Then I discovered &lt;a href="http://nomachine.com/"&gt;NoMachine NX&lt;/a&gt; (NoMachine is the company's name and NX is the product name). I downloaded the Free Edition for Linux and then grabbed the Windows Client (which apparently is also free?). It's ridiculously fast, as fast as Remote Desktop. Google is also working on &lt;a href="http://code.google.com/p/neatx/"&gt;neatx&lt;/a&gt; an open-source NX server implementation and there is the &lt;a href="http://freenx.berlios.de/"&gt;freenx&lt;/a&gt; project, a GPL-licensed implementation of the server and client components. If you are trying to connect to a Linux desktop remotely, don't even think about using any of the VNC derivatives. Use NX.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/Wm4DTHizIT8" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/nomachine_nx_awesome#comments</comments>
 <category domain="http://www.davidgrant.ca/tags/linux">linux</category>
 <category domain="http://www.davidgrant.ca/tags/software">software</category>
 <pubDate>Thu, 11 Feb 2010 06:57:31 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">376 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/nomachine_nx_awesome</feedburner:origLink></item>
<item>
 <title>Dell External Wi-Fi Switch</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/7HfQgzX0Ic4/dell_external_wifi_switch_0</link>
 <description>&lt;p&gt;So the other day the WiFi stopped working on my Dell Inspiron 1720 laptop so after a little bit of troubleshooting and assumed the mini-PCI express wireless card was fried and ordered a new one from Dell's website. The new one didn't work either. Then I suddenly remembered that there was some sort of WiFi switch on the side of the laptop. I felt the switch and moved it moved it in the direction of "On" and it clicked! So it had been turned off! We move our laptop around a lot and somehow the switch had been switched to the off position accidentally.&lt;/p&gt;
&lt;p&gt;I'm still glad I ordered the wireless card though, as it is a Wireless-N card so now if I upgrade my router to a Wireless-N router I might get faster speeds!&lt;br /&gt;
&lt;span class="inline inline-left"&gt;&lt;a href="/dell_external_wifi_switch"&gt;&lt;img src="http://www.davidgrant.ca/sites/www.davidgrant.ca/files/images/travis_wifi_catcher-m.jpg" alt="Dell External WI-FI switch: Mine looks something like this, but not exactly." title="Dell External WI-FI switch: Mine looks something like this, but not exactly."  class="image image-_original " width="373" height="271" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 371px;"&gt;&lt;strong&gt;Dell External WI-FI switch: &lt;/strong&gt;Mine looks something like this, but not exactly.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/7HfQgzX0Ic4" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/dell_external_wifi_switch_0#comments</comments>
 <category domain="http://www.davidgrant.ca/tags/dell">dell</category>
 <pubDate>Fri, 29 Jan 2010 03:25:18 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">374 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/dell_external_wifi_switch_0</feedburner:origLink></item>
<item>
 <title>Windows and 64-bit</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/z5ZVulR0j_0/windows_and_64bit</link>
 <description>&lt;p&gt;Doing development, or more specifically deployment in a Windows 64-bit environment can be a frustrating experience. Let's start with a simple example from MSDN about the &lt;a href="http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx"&gt;File System Redirector&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
The %windir%\System32 directory is reserved for 64-bit applications . . . Whenever a 32-bit application attempts to access %windir%\System32, the access is redirected to a new directory, %windir%\SysWOW64
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That's right, the System32 folder is used by 64-bit applications and the SysWOW64 folder is used for 32-bit applications. It's so obvious.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/z5ZVulR0j_0" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/windows_and_64bit#comments</comments>
 <category domain="http://www.davidgrant.ca/tags/microsoft">microsoft</category>
 <category domain="http://www.davidgrant.ca/tags/windows">windows</category>
 <pubDate>Mon, 18 Jan 2010 20:31:52 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">346 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/windows_and_64bit</feedburner:origLink></item>
<item>
 <title>Concatenate/Combine PDF Files in Linux</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/bNWouVFnPrc/concatenate_combine_pdf_files_linux</link>
 <description>&lt;p&gt;I know there are lots of ways to do this. This is not a HOW-TO, but just sharing a script I made for doing this. It's a decent example of how to write a command-line utility in Python.&lt;/p&gt;
&lt;p&gt;Since I write my cover letters and resumes in LaTeX I always need to concatenate the two together before sending it to an employer. This is very important so that the person on the other end prints out both and it makes their life easier by not having to worry about two files. For the longest time I just had a simple script that looked like this:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family:monospace;"&gt;#!/bin/sh
#Concatenate two PDF files and output to the third argument
echo &amp;quot;**** Converting PDF files to PostScript&amp;quot;
acroread -toPostScript -size letter -pairs $1 /tmp/$1.ps
acroread -toPostScript -size letter -pairs $2 /tmp/$2.ps
&amp;nbsp;
echo &amp;quot;**** Concatenating PostScript files&amp;quot;
a2ps -q --columns=1 -o /tmp/$1.both.ps /tmp/$1.ps /tmp/$2.ps
&amp;nbsp;
echo &amp;quot;**** Converting PostScript file to PDF&amp;quot;
ps2pdf /tmp/$1.both.ps $3
&amp;nbsp;
echo &amp;quot;**** File saved to:&amp;quot; $3
&amp;nbsp;
echo &amp;quot;**** Cleaning up&amp;quot;
rm -f /tmp/$1.ps
rm -f /tmp/$2.ps
rm -f /tmp/$1.both.ps&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;I am just including that code because it shows clearly what is going on. The input PDF files are converted to Postscript files using acroread, the Postscript files are concatenated using a2ps, then the output Postscript file s converted to PDF using ps2pdf.&lt;/p&gt;
&lt;p&gt;I decided to make it in to a full-blown Python script since I don't know bash/sh very well and I wanted it to be able to handle errors and an unlimited number of input files. There was a case in the past where I had to concatenate more than two input files, which involved running this script multiple times. I know there are many other simpler ways of doing this but I wanted to get more practice writing a unix command line utility in python using subprocess and optparse (and making the file importable so it can be used by other scripts, which many people forget to do). The script is a lot more complicated now but it's so much better functionality-wise. Enjoy!&lt;/p&gt;
&lt;div class="field field-type-computed field-field-svn-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://svn.davidgrant.ca/repos/src/scripts/acro_cat.py?rev=1476"&gt;SVN path: http://svn.davidgrant.ca/repos/src/scripts/acro_cat.py?rev=1476&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-text field-field-relative-path-in-reposito"&gt;
      &lt;div class="field-label"&gt;Relative path in repository:&amp;nbsp;&lt;/div&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    /src/scripts/acro_cat.py?rev=1476        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-rev-log"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/log/src/scripts/acro_cat.py?rev=1476?action=follow_copy&amp;mode=follow_copy"&gt;SVN revision log&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-trac-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/browser/src/scripts/acro_cat.py?rev=1476"&gt;View in Trac&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/bNWouVFnPrc" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/concatenate_combine_pdf_files_linux#comments</comments>
 <category domain="http://www.davidgrant.ca/topic/code/scripts">Scripts</category>
 <category domain="http://www.davidgrant.ca/tags/pdf">pdf</category>
 <category domain="http://www.davidgrant.ca/tags/python">python</category>
 <pubDate>Tue, 17 Nov 2009 07:22:42 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">371 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/concatenate_combine_pdf_files_linux</feedburner:origLink></item>
<item>
 <title>Django Golf Handicap Tracker</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/FBJWFbCTVdM/django_golf_handicap_tracker</link>
 <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;a href="http://www.davidgrant.ca/sites/www.davidgrant.ca/files/images/DjangoGolfHandicap_Screengrab.png" onclick="launch_popup(361, 892, 685); return false;" target="_blank"&gt;&lt;img src="http://www.davidgrant.ca/sites/www.davidgrant.ca/files/images/DjangoGolfHandicap_Screengrab.thumbnail.png" alt="Django Handicap Tracker Screenshot" title="Django Handicap Tracker Screenshot"  class="image image-thumbnail " width="100" height="77" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 98px;"&gt;&lt;strong&gt;Django Handicap Tracker Screenshot&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
This is the first &lt;a href="http://www.djangoproject.com"&gt;Django&lt;/a&gt; application I ever built. It was started in the 0.96 days and I have since ported it to 1.0. It mostly works and now supports multiple users using the &lt;a href="http://bitbucket.org/ubernostrum/django-registration/"&gt;django-registration&lt;/a&gt; and &lt;a href="http://docs.djangoproject.com/en/dev/topics/auth/"&gt;django.contrib.auth&lt;/a&gt; module. I haven't done much work on it though. Eventually I will put it online for all to use.&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="field field-type-computed field-field-svn-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://svn.davidgrant.ca/repos/src/python/django_handicap"&gt;SVN path: http://svn.davidgrant.ca/repos/src/python/django_handicap&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-text field-field-relative-path-in-reposito"&gt;
      &lt;div class="field-label"&gt;Relative path in repository:&amp;nbsp;&lt;/div&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    /src/python/django_handicap        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-rev-log"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/log/src/python/django_handicap?action=follow_copy&amp;mode=follow_copy"&gt;SVN revision log&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-trac-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/browser/src/python/django_handicap"&gt;View in Trac&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/FBJWFbCTVdM" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/django_golf_handicap_tracker#comments</comments>
 <category domain="http://www.davidgrant.ca/topic/code">Code</category>
 <category domain="http://www.davidgrant.ca/tags/django">django</category>
 <category domain="http://www.davidgrant.ca/tags/golf">golf</category>
 <category domain="http://www.davidgrant.ca/tags/python">python</category>
 <pubDate>Thu, 12 Nov 2009 05:50:30 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">360 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/django_golf_handicap_tracker</feedburner:origLink></item>
<item>
 <title>My Project Euler Solutions</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/YbYHycdi_n8/my_project_euler_solutions</link>
 <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;img src="http://www.davidgrant.ca/sites/www.davidgrant.ca/files/images/euler.thumbnail.jpg" alt="Euler" title="Euler"  class="image image-thumbnail " width="86" height="100" /&gt;&lt;span class="caption" style="width: 84px;"&gt;&lt;strong&gt;Euler&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
So far I've solved about 24 of the &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt; problems. I'm not sure how long it took me, probably a few months working on them here and there. I would like to continue solving more of these when I get the chance. So far I have only implemented them in &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; (and in one case, &lt;a href="http://www.cython.org/"&gt;Cython&lt;/a&gt;) but I would love to implement them in a language like &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; one day..or who knows maybe I'll try implementing a few of them in &lt;a href="http://golang.org"&gt;Go&lt;/a&gt;&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="field field-type-computed field-field-svn-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://svn.davidgrant.ca/repos/src/python/euler"&gt;SVN path: http://svn.davidgrant.ca/repos/src/python/euler&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-text field-field-relative-path-in-reposito"&gt;
      &lt;div class="field-label"&gt;Relative path in repository:&amp;nbsp;&lt;/div&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    /src/python/euler        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-rev-log"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/log/src/python/euler?action=follow_copy&amp;mode=follow_copy"&gt;SVN revision log&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-trac-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/browser/src/python/euler"&gt;View in Trac&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/YbYHycdi_n8" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/my_project_euler_solutions#comments</comments>
 <category domain="http://www.davidgrant.ca/topic/code">Code</category>
 <category domain="http://www.davidgrant.ca/tags/puzzles">puzzles</category>
 <category domain="http://www.davidgrant.ca/tags/python">python</category>
 <pubDate>Wed, 11 Nov 2009 09:02:06 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">359 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/my_project_euler_solutions</feedburner:origLink></item>
<item>
 <title>Vancouver Sun Parking Tickets Website Screen Scraper</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/gK_BLJV9Cgo/vancouver_sun_parking_tickets_website_screen_scraper</link>
 <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;img src="http://www.davidgrant.ca/sites/www.davidgrant.ca/files/images/parking-ticket.img_assist_custom-150x146.jpg" alt="" title=""  class="image image-img_assist_custom-150x146 " width="150" height="146" /&gt;&lt;/span&gt;&lt;br /&gt;
When the Vancouver Sun came out with their &lt;a href="http://www.vancouversun.com/parking/basic-search.html"&gt;Vancouver parking tickets database&lt;/a&gt; I immediately had some burning questions, like, did the meter maids work on holidays? Do the work less in the evening than during the day? I found it difficult to answer these questions using their interface, so I decided to screen scrape all 1.6 million parking tickets in to my own MySQL database. This was a bit challenging as they made it difficult to screen scrape the data but eventually it could be done simply by first getting an AppKey, a hidden value inside the HTML source and then doing queries using that AppKey as a parameter. It took about a week to get all 1.6 million tickets downloaded. By using Django, it was easy to get them in to a database and view the results. Initially I just put all the data in to one table, then later I decided to normalize the data a bit which was interesting as I decided to do that in pure SQL which I hadn't done before. I did the scraping itself using a combination of BeautifulSoup, lxml, and mechanize.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://github.com/dgrant/vancouver-parking-tickets"&gt;vancouver-parking-tickets project at GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://dl.dropbox.com/u/887695/parkingtickets.sql.gz"&gt;MySQL SQL dump&lt;/a&gt; (42 MB)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here's some data:&lt;br /&gt;
&amp;lt;!--break--&gt;&lt;br /&gt;
Number of tickets by day of the week:&lt;br /&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day of week&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td class=" nowrap"&gt;Monday&lt;/td&gt;
&lt;td  class=" nowrap"&gt;238482&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=" nowrap"&gt;Tuesday&lt;/td&gt;
&lt;td  class=" nowrap"&gt;277797&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=" nowrap"&gt;Wednesday&lt;/td&gt;
&lt;td  class=" nowrap"&gt;294478&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=" nowrap"&gt;Thursday&lt;/td&gt;
&lt;td  class=" nowrap"&gt;274529&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=" nowrap"&gt;Friday&lt;/td&gt;
&lt;td  class=" nowrap"&gt;243830&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=" nowrap"&gt;Saturday&lt;/td&gt;
&lt;td  class=" nowrap"&gt;181235&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=" nowrap"&gt;Sunday&lt;/td&gt;
&lt;td  class=" nowrap"&gt;121036&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;&lt;p&gt;Number of tickets at each address:&lt;br /&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;thead&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1050 Robson St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;17899&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1150 Robson St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;15674&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;850 Hornby St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;10501&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;650 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;10426&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1050 Alberni St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;9729&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1750 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;9121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1050 Hornby St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;9100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;650 Hornby St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;8863&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1050 Mainland St&lt;/td&gt;
&lt;td  class=" nowrap"&gt;8328&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1050 Homer St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;8269&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1150 Hamilton St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;8094&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;850 Howe St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;7941&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;850 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;7848&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;2250 4th Ave W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;7634&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;950 Hornby St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;7462&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1950 4th Ave W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;7403&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;2650 Granville St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;7354&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1650 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;7062&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1350 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6961&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1150 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6903&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1050 Hamilton St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6889&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;950 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6821&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;150 Davie St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6676&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1150 Homer St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6658&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1150 Mainland St&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6562&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;750 Broadway St. W.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6553&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;950 Homer St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6504&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1150 Davie St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6461&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td  class=""&gt;1150 Alberni St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6386&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td  class=""&gt;1050 Davie St.&lt;/td&gt;
&lt;td  class=" nowrap"&gt;6202&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/thead&gt;&lt;/table&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/gK_BLJV9Cgo" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/vancouver_sun_parking_tickets_website_screen_scraper#comments</comments>
 <category domain="http://www.davidgrant.ca/topic/code">Code</category>
 <category domain="http://www.davidgrant.ca/tags/django">django</category>
 <category domain="http://www.davidgrant.ca/tags/python">python</category>
 <category domain="http://www.davidgrant.ca/tags/scraping">scraping</category>
 <pubDate>Wed, 11 Nov 2009 08:54:15 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">358 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/vancouver_sun_parking_tickets_website_screen_scraper</feedburner:origLink></item>
<item>
 <title>Vancouver Park Board Swimming Lessons Screen Scraper</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/H_Bw-VwXNN8/vancouver_park_board_swimming_lessons_screen_scraper</link>
 <description>&lt;p&gt;I was waiting for the January 2010 swimming times to appear on the &lt;a href="http://vancouver.ca/Parks/rec/pools/index.htm"&gt;Vancouver Park Board website&lt;/a&gt; but I got tired of all the clicking and scrolling required to see when the lessons were available. The other problem was that once the lessons appeared for one pool, some of the other pools still hadn't posted their lesson schedule for January 2010. The times that came out for the first pool were not ideal so I wanted to wait and see what came out for the other pool, while making sure that the first pool didn't book up. I wrote a script that would allow me to see what lessons were available at 2 different pools on Sunday and to see how many spots were left in each lesson. Here's some sample output:&lt;/p&gt;
&lt;p&gt;david@centurion:~/svn/scripts$ ./check_swimming_lessons.py&lt;br /&gt;
PT 1/2 Starfish/Duck Sat Set 1 WP - Pool Open Jan 09, 2010 11:00am 10 / 10&lt;br /&gt;
PT 1/2 Starfish/Duck Sat Set 1 WP - Pool Open Jan 09, 2010 12:00pm 10 / 10&lt;br /&gt;
PT 1/2 Starfish/Duck Sun Set 1 WP - Pool Open Jan 10, 2010 12:30pm 10 / 10&lt;br /&gt;
PT 1 Starfish (4-12mo) Sat 1Win1 VA - Vancouver Aquatic Centre Open Jan 09, 2010  9:00am 1 / 12&lt;/p&gt;
&lt;p&gt;As you can see, at the "WP - Pool" pool (actually Lord Byng, the pool I was waiting on) there were just recently 3 lesson times added. At the "VA - Vancouver Aquatic Centre" pool there is only 1 spot left in one time. There are two other times but there are not shown as I have enabled filtering on only lessons that have spots left and which are on Sunday.&lt;/p&gt;
&lt;div class="field field-type-computed field-field-svn-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://svn.davidgrant.ca/repos/src/scripts/check_swimming_lessons.py"&gt;SVN path: http://svn.davidgrant.ca/repos/src/scripts/check_swimming_lessons.py&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-text field-field-relative-path-in-reposito"&gt;
      &lt;div class="field-label"&gt;Relative path in repository:&amp;nbsp;&lt;/div&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    /src/scripts/check_swimming_lessons.py        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-rev-log"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/log/src/scripts/check_swimming_lessons.py?action=follow_copy&amp;mode=follow_copy"&gt;SVN revision log&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;div class="field field-type-computed field-field-trac-url"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="http://trac.davidgrant.ca/browser/src/scripts/check_swimming_lessons.py"&gt;View in Trac&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/H_Bw-VwXNN8" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/vancouver_park_board_swimming_lessons_screen_scraper#comments</comments>
 <category domain="http://www.davidgrant.ca/topic/code/scripts">Scripts</category>
 <category domain="http://www.davidgrant.ca/tags/python">python</category>
 <category domain="http://www.davidgrant.ca/tags/scraping">scraping</category>
 <pubDate>Wed, 11 Nov 2009 08:44:19 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">357 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/vancouver_park_board_swimming_lessons_screen_scraper</feedburner:origLink></item>
<item>
 <title>Django Recipes Application</title>
 <link>http://feedproxy.google.com/~r/DavidGrant/~3/bYijN6pkZZU/django_recipes_application</link>
 <description>&lt;p&gt;&lt;span class="inline inline-right"&gt;&lt;a href="http://www.davidgrant.ca/sites/www.davidgrant.ca/files/images/DjangoRecipes_ScreenShot.png" onclick="launch_popup(362, 1086, 1112); return false;" target="_blank"&gt;&lt;img src="http://www.davidgrant.ca/sites/www.davidgrant.ca/files/images/DjangoRecipes_ScreenShot.thumbnail.png" alt="Django Recipes Screenshot" title="Django Recipes Screenshot"  class="image image-thumbnail " width="98" height="100" /&gt;&lt;/a&gt;&lt;span class="caption" style="width: 96px;"&gt;&lt;strong&gt;Django Recipes Screenshot&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://code.google.com/p/django-recipes"&gt;django-recipes at Google Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My mom was writing a family cookbook using Microsoft Word and I thought this was a bad idea for several reasons. At first I thought about using LaTeX to separate the style from the content a bit, then I thought about using XML, then I settled on a database as being the most generic to store recipe data. I quickly decided on using Django to create this cookbook framework because Python is probably my strongest language and it makes creating custom websites really easy.&lt;/p&gt;
&lt;p&gt;So far it includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most important models, Recipe, Ingredient, Direction, Category, Food.&lt;/li&gt;
&lt;li&gt;Very nice admin interface for creating recipes with inline ingredients and directions.&lt;/li&gt;
&lt;li&gt;Front-end: only a recipe_list and recipe_detail so far, but the recipe_detail has an experimental method of displaying recipes that is based on this LaTeX style: http://www.ctan.org/tex-archive/macros/latex/contrib/cooking/ (apparently based on style in a famous German cookbook by Dr. Oetker (Gromzik, J.; Reich, C.; Sander, C. (ed.): Dr. Oetker Schulkochbuch – Das Original. Ceres, Bielefeld, 1996.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Competitors/related projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KRecipes - KDE-based desktop recipes software.&lt;/li&gt;
&lt;li&gt;Ben Collins-Sussman's effrecipes - Simple, but it works. Not under active development.&lt;/li&gt;
&lt;li&gt;Recipes on Rails - Ruby on Rails recipes site. Not open source as far as I know. Embeds "Source: Recipes on Rails" on all photos and has google ads. Great site though. One thing it has that my site lacks is per-direction photos. This would be easy to do. I already have per-direction ingredients.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are aware of any other similar projects please let me know. I am especially interested in any other web-based and open-source cookbook projects.&lt;/p&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidGrant/~4/bYijN6pkZZU" height="1" width="1"/&gt;</description>
 <comments>http://www.davidgrant.ca/django_recipes_application#comments</comments>
 <category domain="http://www.davidgrant.ca/topic/code">Code</category>
 <category domain="http://www.davidgrant.ca/tags/django">django</category>
 <category domain="http://www.davidgrant.ca/tags/python">python</category>
 <category domain="http://www.davidgrant.ca/tags/recipes">recipes</category>
 <pubDate>Wed, 11 Nov 2009 06:55:53 +0000</pubDate>
 <dc:creator>David Grant</dc:creator>
 <guid isPermaLink="false">356 at http://www.davidgrant.ca</guid>
<feedburner:origLink>http://www.davidgrant.ca/django_recipes_application</feedburner:origLink></item>
</channel>
</rss>
