<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14462287</id><updated>2012-01-30T12:43:08.517-05:00</updated><category term='django'/><category term='python'/><category term='dnssec'/><category term='macosx'/><category term='python usps'/><title type='text'>Speno's Pythonic Avocado</title><subtitle type='html'>One python programmer and his avocados.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://speno.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14462287.post-4609118306899139778</id><published>2010-01-28T08:18:00.002-05:00</published><updated>2010-01-28T08:20:04.674-05:00</updated><title type='text'>Excellent new (semi) Python podcast</title><content type='html'>&lt;a href="http://5by5.tv/devshow"&gt;The Dev Show&lt;/a&gt; is my new favorite Python podcast.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-4609118306899139778?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/4609118306899139778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=4609118306899139778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4609118306899139778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4609118306899139778'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2010/01/excellent-new-semi-python-podcast.html' title='Excellent new (semi) Python podcast'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-7909771386792554399</id><published>2009-12-24T14:43:00.005-05:00</published><updated>2009-12-24T15:28:04.919-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='macosx'/><title type='text'>Mac OS X Services - Changes between Tiger, Leopard and Snow Leopard</title><content type='html'>When a file or folder is selected in the Finder and a Mac OS X Service is invoked, either through the Services menu or its keyboard shortcut, the input fed to the service depends on what version of Mac OS X is running.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In Tiger, (10.4), no input is fed to the service.&lt;/li&gt;&lt;li&gt;In Leopard (10.5), the absolute path to the file is the input. E.g. "/Users/steve/tablet.rtf"&lt;/li&gt;&lt;li&gt;In Snow Leopard (10.6), if the service is configured properly to work on files and folders, then the input will be file URL like "file://Users/steve/tablet.rtf".&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In Leopard, any service that accepted selected text would automatically work with selected files or folders in the Finder. However, Snow Leopard changed that. It is still possible for a service to accept both selected text and files plus folders, but if you create a Service using Automator, you are forced to choose one or the other. So, pick one and save your Service. For this example, I'm assuming you picked 'Files and Folders'.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next, edit the ~/Library/Services/Foo.workflow/Contents/Info.plist and change this:&lt;/div&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;  &amp;lt;key&amp;gt;NSSendFileTypes&amp;lt;/key&amp;gt;&lt;br /&gt;     &amp;lt;array&amp;gt;&lt;br /&gt;         &amp;lt;string&amp;gt;public.item&amp;lt;/string&amp;gt;&lt;br /&gt;     &amp;lt;/array&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to this:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;  &amp;lt;key&amp;gt;NSSendFileTypes&amp;lt;/key&amp;gt;&lt;br /&gt;     &amp;lt;array&amp;gt;&lt;br /&gt;         &amp;lt;string&amp;gt;public.item&amp;lt;/string&amp;gt;&lt;br /&gt;     &amp;lt;/array&amp;gt;&lt;br /&gt;  &amp;lt;key&amp;gt;NSSendTypes&amp;lt;/key&amp;gt;&lt;br /&gt;     &amp;lt;array&amp;gt;&lt;br /&gt;         &amp;lt;string&amp;gt;NSStringPboardType&amp;lt;/string&amp;gt;&lt;br /&gt;     &amp;lt;/array&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then, in the Python program that is your service, you may want something like this to detect that your input is a file path:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;  if input.starswith('file://') or input.startswith('/'):&lt;br /&gt;      # I think I got a file path as input&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For more details, see &lt;a href="http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/SysServices/Articles/properties.html"&gt;Services Properties&lt;/a&gt; in the Mac Dev Center. Happy holidays!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-7909771386792554399?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/7909771386792554399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=7909771386792554399' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7909771386792554399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7909771386792554399'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2009/12/mac-os-x-services-changes-between-tiger.html' title='Mac OS X Services - Changes between Tiger, Leopard and Snow Leopard'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-6447055124183265446</id><published>2009-09-24T23:02:00.007-04:00</published><updated>2009-09-25T08:58:21.706-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dnssec'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Calculating the keytag of a DNSKEY in Python</title><content type='html'>In DNSEC, sometimes you want to know the "keytag" of a DNSKEY record. Here's a Python implementation that uses &lt;a href="http://dnspython.org/"&gt;dnspython&lt;/a&gt;:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;import struct&lt;br /&gt;&lt;br /&gt;def keytag(dnskey):&lt;br /&gt;    """&lt;br /&gt;    Given a dns.rdtypes.ANY.DNSKEY dnskey, compute and return its keytag.&lt;br /&gt;&lt;br /&gt;    For details, see RFC 2535, section 4.1.6&lt;br /&gt;    """&lt;br /&gt;    if dnskey.algorithm == 1:&lt;br /&gt;        a = ord(dnskey.key[-3]) &lt;&lt; 8&lt;br /&gt;        b = ord(dnskey.key[-2])&lt;br /&gt;        return a + b&lt;br /&gt;    else:&lt;br /&gt;        header = struct.pack("!HBB", dnskey.flags, dnskey.protocol, dnskey.algorithm)&lt;br /&gt;        key = header + dnskey.key&lt;br /&gt;        ac = 0&lt;br /&gt;        for i, value in enumerate(ord(x) for x in key):&lt;br /&gt;            if i % 2:&lt;br /&gt;                ac += value&lt;br /&gt;            else:&lt;br /&gt;                ac += (value &lt;&lt; 8)&lt;br /&gt;        ac += (ac &gt;&gt; 16) &amp; 0xffff&lt;br /&gt;        return ac &amp; 0xffff&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-6447055124183265446?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/6447055124183265446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=6447055124183265446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/6447055124183265446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/6447055124183265446'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2009/09/calculating-keytag-of-dnskey-in-python.html' title='Calculating the keytag of a DNSKEY in Python'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-1828196409979687781</id><published>2009-09-15T13:58:00.006-04:00</published><updated>2009-09-15T14:08:24.218-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Using Django's Syncdb outside of Django</title><content type='html'>I'm working on another project that uses Django's ORM that isn't (yet) a web applicaiton. There's no settings.py file as the application has its own configuration system build on ConfigObj and optparase. But, before you can use the app, you need to create the tables that Django's ORM needs for your Models. If you app lives in a python package named 'fooapp', then put your Django models in fooapp.models and try this code:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;from django.conf import settings&lt;br /&gt;from django.core.management.commands import syncdb&lt;br /&gt;&lt;br /&gt;opts, args = build_configuration()&lt;br /&gt;my_app = 'fooapp'&lt;br /&gt;settings.configure(&lt;br /&gt;    DATABASE_ENGINE=opts['db_engine'],&lt;br /&gt;    DATABASE_NAME=opts['db_name'],&lt;br /&gt;    DATABASE_USER=opts['db_user'],&lt;br /&gt;    DATABASE_PASSWORD=opts['db_pass'],&lt;br /&gt;    DATABASE_HOST=opts['db_host'],&lt;br /&gt;    DATABASE_PORT=opts['db_port'],&lt;br /&gt;    INSTALLED_APPS=(my_app,)&lt;br /&gt;)&lt;br /&gt;cmd = syncdb.Command()&lt;br /&gt;cmd.handle_noargs()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And do let me know if that works. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-1828196409979687781?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/1828196409979687781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=1828196409979687781' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1828196409979687781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1828196409979687781'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2009/09/using-djangos-syncdb-outside-of-django.html' title='Using Django&apos;s Syncdb outside of Django'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-7656433568652125281</id><published>2009-07-26T11:05:00.002-04:00</published><updated>2009-07-26T11:11:21.804-04:00</updated><title type='text'>Running Django with wsgiref that also serves Admin media</title><content type='html'>&lt;div&gt;I wanted to run a Django app using Python's built-in wsgiref module. It also serves Django admin media. Consider this a stepping stone to running your Django app using CherryPy.&lt;/div&gt;&lt;pre class="code"&gt;&lt;div&gt;&lt;div&gt;from wsgiref.simple_server import make_server&lt;/div&gt;&lt;div&gt;from django.core.handlers.wsgi import WSGIHandler&lt;/div&gt;&lt;div&gt;from django.core.servers.basehttp import AdminMediaHandler&lt;/div&gt;&lt;div&gt;httpd = make_server('', 8000, AdminMediaHandler(WSGIHandler()))&lt;/div&gt;&lt;div&gt;httpd.serve_forever()&lt;/div&gt;&lt;div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-7656433568652125281?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/7656433568652125281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=7656433568652125281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7656433568652125281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7656433568652125281'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2009/07/running-django-with-wsgiref-that-also.html' title='Running Django with wsgiref that also serves Admin media'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-1490522233935937286</id><published>2009-03-19T18:07:00.003-04:00</published><updated>2009-03-21T10:09:08.577-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python usps'/><title type='text'>Rhymes with Pony</title><content type='html'>Yesterday I pushed out &lt;a href="http://github.com/JohnSpeno/owney/tree/master"&gt;Owney&lt;/a&gt; which does USPS shipment tracking in Python. It uses a bit of Django as well. It's got rough edges, so please watch your fingers! I intend to polish it as time permits. I do want to make it a re-usable Django app, but I need some advice on how to make that work.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The original Owney was a dog with &lt;a href="http://www.postalmuseum.si.edu/exhibits/2c1f_owney.html"&gt;a very interesting life&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-1490522233935937286?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/1490522233935937286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=1490522233935937286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1490522233935937286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1490522233935937286'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2009/03/rhymes-with-pony.html' title='Rhymes with Pony'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-1451892310225776717</id><published>2009-01-17T11:49:00.004-05:00</published><updated>2009-02-20T22:01:21.470-05:00</updated><title type='text'>Snakes in the bassinet (Baby's first open source project)</title><content type='html'>I pushed out my first open source project this week. It's a Python interface to &lt;a href="http://www.userscape.com/helpdesk/index.php?pg=kb.chapter&amp;amp;id=28"&gt;HelpSpot's web services API&lt;/a&gt;. &lt;a href="http://www.userscape.com/products/helpspot/"&gt;HelpSpot&lt;/a&gt; is a help desk application that I use, like and happily recommend.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can find my project &lt;a href="http://github.com/JohnSpeno/python-helpspot/"&gt;python-helpspot&lt;/a&gt; on GitHub. I have another open source thing in the works too. That one is going to be a doggy and it'll have a touch of the django.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-1451892310225776717?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/1451892310225776717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=1451892310225776717' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1451892310225776717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1451892310225776717'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2009/01/snakes-in-bassinet-babys-first-open.html' title='Snakes in the bassinet (Baby&apos;s first open source project)'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-9174418611217193051</id><published>2009-01-08T12:51:00.003-05:00</published><updated>2009-01-08T13:12:13.083-05:00</updated><title type='text'>Missteps in Django - Part 3</title><content type='html'>This one will make it obvious that the missteps are my own mistakes, not problems inherit in Django. I'm not terribly embarrassed to look this dumb. Most days, I'm proud of my density. On with the show!&lt;br /&gt;&lt;br /&gt;I guess this is another template issue. Oh well. I wanted to set the CSS class on an HTML tag based on some dynamic data. In this case, the data was the status field on my Shipment model:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;class Shipment(models.Model):&lt;br /&gt;    description = models.TextField()&lt;br /&gt;    created = models.DateTimeField(auto_now_add=True);&lt;br /&gt;    status = models.CharField(max_length=64, default="new",&lt;br /&gt;                                                    choices=STATUS_CHOICES)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'm omitting STATUS_CHOICES because its not important to my point. I wanted each displayed shipment to have a different background color. My initial idea was to try something like this:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;class={% ifequal thing.status "new" %}"new"{% elifequal thing.status "exception" %}"exception"{% endelifequal %}...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course, Django doesn't have an &lt;em&gt;elif&lt;/em&gt; construct in its templates. Doesn't matter because my idea was stupid and eventually I figured that I could do this:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;class="status_{{ shipment.status }}"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and be done with it. I hope I had a good laugh at myself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-9174418611217193051?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/9174418611217193051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=9174418611217193051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/9174418611217193051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/9174418611217193051'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2009/01/missteps-in-django-part-3.html' title='Missteps in Django - Part 3'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-1734924681254590372</id><published>2008-12-22T12:34:00.009-05:00</published><updated>2008-12-23T20:05:06.092-05:00</updated><title type='text'>Missteps in Django - Part 2</title><content type='html'>My next misstep was related to using the regroup tag that I mentioned in the &lt;a href="http://speno.blogspot.com/2008/12/missteps-in-django-part-1.html"&gt;previous post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First, let's take a look at the example model I'm working with.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;class Shipment(models.Model):&lt;br /&gt; description = models.TextField()&lt;br /&gt; created = models.DateTimeField(auto_now_add=True);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I wanted to display these Shipments grouped by they day they had been created and I wanted that day formated like "2008-12-22". Since the 'created' field of the Shipment model is a datetime.datetime instance which, when viewed as a string, looks like "2008-12-23 19:16:06.700114". That was a bit too verbose and besides, I wanted shipments grouped by day, not by microsecond!&lt;br /&gt;&lt;br /&gt;My solution was to a add a property (of course!) to my model and see if I could use that in the  regroup tag. Here's what that looked like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;class Shipment(models.Model):&lt;br /&gt;    description = models.TextField()&lt;br /&gt;    created = models.DateTimeField(auto_now_add=True);&lt;br /&gt;&lt;br /&gt;    def _get_ship_date(self):&lt;br /&gt;        return self.created.date()&lt;br /&gt;&lt;br /&gt;    ship_date = property(_get_ship_date)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then in my regroup tag, I could do this:&lt;pre class="code"&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;{% regroup shipments by ship_date as shipments_by_date %}&lt;br /&gt;{% for ship_date in shipments_by_date %}&lt;br /&gt;    &amp;lt;li&amp;gt;Shipments for {{ ship_date.grouper }} &amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;ol&amp;gt;&lt;br /&gt;    {% for shipment in ship_date.list %}&lt;br /&gt;        &amp;lt;li&amp;gt; {{ shipment.description }} &amp;lt;/li&amp;gt;&lt;br /&gt;    {% endfor %}&lt;br /&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;{% endfor %}&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hey, that worked, but this was another of my newbie missteps because there was an aspect to the regroup tag that I had overlooked (this series should be called RTFM maybe?). You can apply a filter to the attribute you are regrouping on like so:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;{% regroup ship_list by created|date:"Y-n-d" as shipments_by_date %}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And you're done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-1734924681254590372?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/1734924681254590372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=1734924681254590372' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1734924681254590372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1734924681254590372'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/12/missteps-in-django-part-2.html' title='Missteps in Django - Part 2'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-5046980420819451991</id><published>2008-12-17T08:37:00.010-05:00</published><updated>2008-12-17T09:29:40.110-05:00</updated><title type='text'>Missteps in Django - Part 1</title><content type='html'>Welcome back fellow Avocadoists! I finally got something up and running in Django and I'm going to tell you about some problems I had learning and using Django in the process. I'm working on my own as the programmer and the designer so I'm sure that colors my view of things.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My first issue was with in Django's templates. Namely, there seems to be no way to look things up dynamically in a dictionary based on the value of another template tag. I'm not even sure that makes sense so here's an example of what I was trying to do:&lt;/div&gt;&lt;pre class="code"&gt;# the python part in your view method&lt;br /&gt;things_by_day = {&lt;br /&gt;  '2008-11-28' : [thing1, thing2],&lt;br /&gt;  '2008-11-29' : [thing3, thing4, thing 5],&lt;br /&gt;  '2008-11-30' : [thing6],&lt;br /&gt;}&lt;br /&gt;days = d.keys()&lt;br /&gt;days.sort()&lt;br /&gt;&lt;br /&gt;# The Django template part&lt;br /&gt;{% for day in days %}&lt;br /&gt;  Here are the things for {{ day }}&lt;br /&gt;  {% for thing in things_by_day.day %}&lt;br /&gt; do the thing with the list of things&lt;br /&gt;  {% endfor %}&lt;br /&gt;{% endfor %}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So the part in the template where it says "for thing in things_by_day.day" is the part that doesn't work the way my brain expected it to. I expected the value of "things_by_date.day" to be the Python equivalent of "things_by_day[day]" but instead Django's template language translates this as "things_by_day['day']". It treats the string "day" as the key. Fail.&lt;br /&gt;&lt;br /&gt;I figured out there was a way to do almost what I wanted using Django's regroup tag, but "No sir! I don't like it!"&lt;br /&gt;&lt;br /&gt;Here's what the template part looks like using regroup. Note that in the following template "things" is a queryset on a model with a field named "created" instead of a simple dict or list.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;{% regroup things by created as things_by_date %}&lt;br /&gt;{% for thing_date in things_by_date %}&lt;br /&gt;  Here are the things for {{ thing_date.grouper }}&lt;br /&gt;  {% for thing in thing_date.list %}&lt;br /&gt;      do the thing with the list of things&lt;br /&gt;  {% endfor %}&lt;br /&gt;{% endfor %}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I find this syntax noxious and I can't remember what name to use where. In the process of writing this, I got it wrong in nearly every possible way. It's probably still wrong (I'm sure you'll let me know). What's with the magic names like "grouper" and "list"? I really just want to let Python be Python and use a dictionary in a normal way. I understand the limitations of Django's template system and why they were made and for the most part I support those decisions. Then the ice weasels come.&lt;br /&gt;&lt;br /&gt;I'm sure someone has made a new template tag to do dict lookups the way I was trying to do. It may be &lt;a href="http://www.djangosnippets.org/snippets/713/"&gt;this one&lt;/a&gt;. Please feel free to let me know in the comments. I'm still quite new to Django and eager to learn more. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-5046980420819451991?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/5046980420819451991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=5046980420819451991' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/5046980420819451991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/5046980420819451991'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/12/missteps-in-django-part-1.html' title='Missteps in Django - Part 1'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-3206630905771621774</id><published>2008-10-09T08:37:00.008-04:00</published><updated>2008-10-09T11:35:31.878-04:00</updated><title type='text'>Cholecalciferol</title><content type='html'>There's something I know you need and probably aren't getting enough of. It's Vitamin D, specifically Vitamin D3 also known as &lt;a href="http://en.wikipedia.org/wiki/Cholecalciferol"&gt;cholecalciferol&lt;/a&gt;. Personally, I take at least 5,000IU of it a day unless I've spent some quality time in the sun. I also give it to my kids in appropriate doses.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To learn about why you might want to get more Vitamin D3 in your life, I recommend starting with &lt;a href="http://www.vitamindcouncil.org/"&gt;The Vitamin D Council's site&lt;/a&gt;. Their &lt;a href="http://www.vitamindcouncil.org/newsletter/2008-october.shtml"&gt;October 2008 newsletter&lt;/a&gt; inspired me to post this.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing I like about Vitamin D3 is that it's cheap, especially in the summer time when it's free (your skin makes it for you when it is exposed to sunlight)! When it isn't free, I buy it from &lt;a href="http://www.iherb.com/"&gt;iHerb.com&lt;/a&gt; whom I've used for many years with no complaints. If anyone is interested, feel free to use coupon code PEN753 for $5 off your order for first time customers. &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Disclaimer&lt;/span&gt;: If you use that coupon, I get a referral fee.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In case you were curious (and I was), the cholecalciferol in commercial supplements is probably derived from &lt;a href="http://en.wikipedia.org/wiki/Lanolin"&gt;lanolin&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here is a link to the specific brand of Vitamin D3 that I use:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.iherb.com/ProductDetails.aspx?c=1&amp;amp;pid=7763"&gt;Healthy Origins, Vitamin D3, 2,400 IU, 360 Softgels&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While I'm mentioning it, here's the other supplement I take 400 - 500 mg of nightly:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.iherb.com/ProductDetails.aspx?c=1&amp;amp;pid=691"&gt;Now Foods, Magnesium Citrate, 200 mg, 250 Tablets&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Those magnesium people need to get their act together and form a council so I'd have something to link to. In lieu of that, here's &lt;a href="http://www.proteinpower.com/drmike/uncategorized/magnesium-and-inflammation/"&gt;something by Dr. Michael Eades on his favorite supplement&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-3206630905771621774?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/3206630905771621774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=3206630905771621774' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/3206630905771621774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/3206630905771621774'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/10/cholecalciferol.html' title='Cholecalciferol'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-3307922634892695581</id><published>2008-06-28T22:21:00.003-04:00</published><updated>2008-06-28T23:23:49.917-04:00</updated><title type='text'>Sweet Somethings!</title><content type='html'>A friend of mine, Mike,  just announced the opening of  his online store: &lt;a href="http://www.kaiscandy.com/"&gt;Kai's Candy Company&lt;/a&gt;. I love the look of their site. Their &lt;a href="http://www.kaiscandy.com/"&gt;Handmade Japanese candies&lt;/a&gt; are unique here in the States. They are currently offering &lt;a href="http://www.kaiscandy.com/obama-mccain-candies"&gt;Obama and McCain &lt;/a&gt;candies for the 2008 political season. I really need to find out what that super secret surprise candy is too!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mike and I worked together at Penn. When he came for his interview, he thought we were looking for a perl programmer because that was what he was told by the recruiting agency. We were actually looking for someone with python experience of which he had little to none of at the time. I'm so glad that didn't get in the way of him getting the job because it was my pleasure to work with him. I hope his new venture is a sweet success!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-3307922634892695581?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/3307922634892695581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=3307922634892695581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/3307922634892695581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/3307922634892695581'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/06/sweet-somethings.html' title='Sweet Somethings!'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-1514337577556233765</id><published>2008-06-24T19:19:00.001-04:00</published><updated>2008-06-24T19:44:52.088-04:00</updated><title type='text'>Netflix Disappointment</title><content type='html'>&lt;a href="http://blog.netflix.com/2008/06/profiles-feature-going-away.html"&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;Netflix recently announced that it was removing a feature from its service.&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt; It happens to be a feature that my family relies on. They say the decision is final and there's no indication that they plan to replace it. That said, we dropped two dvds from out account today and we'll drop the rest when they go through with it if not sooner. At least they made that part easy!&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;More  reactions from users:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hackingnetflix.com/2008/06/netflix-elimina.html"&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;Netflix Eliminating Account Profiles&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.netflix.com/forum/topic/show?id=1993323%3ATopic%3A194695"&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;Profiles Going away!?&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://getsatisfaction.com/netflix/topics/netflix_to_break_homes_by_eliminating_profiles"&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;Netflix to break homes by eliminating profiles&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://digg.com/movies/Netflix_eliminating_Profiles"&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;Netflix eliminating profiles&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;&lt;a href="http://tech.slashdot.org/article.pl?sid=08/06/19/0337233"&gt;Netflix to Eliminate Profiles Feature&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;&lt;a href="http://pogue.blogs.nytimes.com/2008/06/23/monday-2/"&gt;David Pogue's Where are the Netflix Profiles?&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  line-height: 19px; font-family:Arial;font-size:13px;"&gt;&lt;div class="entry-content" style="position: static; clear: both; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;&lt;div class="entry-body" style="clear: both; "&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-1514337577556233765?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/1514337577556233765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=1514337577556233765' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1514337577556233765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1514337577556233765'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/06/netflix-disappointment.html' title='Netflix Disappointment'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-7291082479549540550</id><published>2008-06-11T08:01:00.002-04:00</published><updated>2008-06-11T08:39:09.322-04:00</updated><title type='text'>This American $152,000</title><content type='html'>I listen to the &lt;a href="http://www.thisamericanlife.org/Radio_Podcast.aspx"&gt;This American Life podcast&lt;/a&gt; each week and the program has recently started asking for donations to cover their bandwidth costs of $152,000 a year. It seems like a waste of money when things like bittorrent and Amazon S3 exist in the world. I guess they opted for good and fast from their list of three options.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-7291082479549540550?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/7291082479549540550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=7291082479549540550' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7291082479549540550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7291082479549540550'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/06/this-american-152000.html' title='This American $152,000'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-5374114826683764359</id><published>2008-05-26T08:10:00.001-04:00</published><updated>2008-05-26T08:12:35.665-04:00</updated><title type='text'>The Python of Record</title><content type='html'>&lt;a href="http://www.nytimes.com/2008/05/26/business/media/26link.html?partner=rssnyt&amp;emc=rss"&gt;Python makes the New York Times&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-5374114826683764359?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/5374114826683764359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=5374114826683764359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/5374114826683764359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/5374114826683764359'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/05/python-of-record.html' title='The Python of Record'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-7499941692167828667</id><published>2008-05-20T13:06:00.002-04:00</published><updated>2008-05-20T13:27:46.863-04:00</updated><title type='text'>I'm all up in ur top</title><content type='html'>By way of &lt;a href="http://hivelogic.com/articles/2008/05/alltop"&gt;Dan Benjamin&lt;/a&gt;, I see this thing called &lt;a href="http://alltop.com"&gt;Alltop&lt;/a&gt;. Next, I see their &lt;a href="http://python.alltop.com/"&gt;python area&lt;/a&gt;. Finally, I see that this blog, &lt;a href="http://speno.blogspot.com"&gt;Speno's Pythonic Avocado&lt;/a&gt;, is listed among the top sources of python news. Clearly, this Alltop thing is not to be trusted.&lt;br /&gt;&lt;br /&gt;Further proof is that the excellent, &lt;a href="http://junkfoodscience.blogspot.com/"&gt;JUNKFOOD SCIENCE&lt;/a&gt;,is completely missing from their Health section.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*plonk*&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-7499941692167828667?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/7499941692167828667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=7499941692167828667' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7499941692167828667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7499941692167828667'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/05/im-all-up-in-ur-top.html' title='I&apos;m all up in ur top'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-6301175942121754987</id><published>2008-04-30T18:37:00.012-04:00</published><updated>2008-05-01T00:37:34.371-04:00</updated><title type='text'>the machine that goes PING!</title><content type='html'>Meet ~bin/sonar.&lt;br /&gt;&lt;pre class="code"&gt;#!/bin/sh&lt;br /&gt;# usage: sonar &amp;lt;host or ip address&amp;gt;&lt;br /&gt;while :&lt;br /&gt;do&lt;br /&gt;  ping -c 1 &amp;#36;1 &amp;amp;&amp;amp; say "PING!"&lt;br /&gt;  sleep 30&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;This is a super fancy network monitoring tool. The original version of this was from another friend named Mark (not he of greenbar fame) and it played a submarine style sonar "ping" sound when a ping was successful. When you're waiting for your server to come back up, and you have time for a nap until it does, a tool like this is just what you need.&lt;br /&gt;&lt;br /&gt;This version relies on the Mac OS X /usr/bin/say command.&lt;br /&gt;&lt;br /&gt;Eat your heart out &lt;a href="http://www.usenix.org/events/lisa2000/gilfix/gilfix_html/index.html"&gt;peep&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT:&lt;/b&gt; Yeah, as originally posted the ping command was missing an argument. I blame myself and blogger's difficult to use posting. Thanks, Aaron.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-6301175942121754987?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/6301175942121754987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=6301175942121754987' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/6301175942121754987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/6301175942121754987'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/04/machine-that-goes-ping.html' title='the machine that goes PING!'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-2950892144628237611</id><published>2008-04-21T16:02:00.018-04:00</published><updated>2008-04-21T17:01:48.846-04:00</updated><title type='text'>Drop Anything</title><content type='html'>Sometimes you need drag and drop support for your scripts. Luckily, there's this Mac OS X tool which turns your scripts into applications onto which you can drop files and present their paths as arguments to your script. It's called DropScript and you can find it on &lt;a href="http://www.wsanchez.net/software/"&gt;Willfredo Sanchez's software page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I used it to feed input to a remote python program and it works perfectly. Of course you need to give it a cute icon so that people will want to drop files on it.  Here's one I like:&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://bp3.blogger.com/_C9l89wZf8q0/SAz4EbYk_kI/AAAAAAAAABU/L9BtprXNe9A/s400/drop.jpg" border="0" alt="DomocunCreature Icon" /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://www.fasticon.com/"&gt;Icon by: Fasticon.com&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-2950892144628237611?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/2950892144628237611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=2950892144628237611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/2950892144628237611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/2950892144628237611'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/04/drop-anything.html' title='Drop Anything'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_C9l89wZf8q0/SAz4EbYk_kI/AAAAAAAAABU/L9BtprXNe9A/s72-c/drop.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-480849078083503494</id><published>2008-04-18T08:03:00.006-04:00</published><updated>2008-04-18T08:46:54.269-04:00</updated><title type='text'>This is getting awk-ward</title><content type='html'>Ideas from readers DrewP and Justin have greenbar approaching the size of the original awk version. Thank you both.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;#!/usr/bin/python -u&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;   pat = sys.argv[1]&lt;br /&gt;except IndexError:&lt;br /&gt;   pat = None&lt;br /&gt;&lt;br /&gt;green = True&lt;br /&gt;for line in iter(sys.stdin.readline, ""):&lt;br /&gt;    if (pat and pat in line) or (not pat and green):&lt;br /&gt;        print "\x1b[7m%s\x1b[0m" % line.rstrip()&lt;br /&gt;    else:&lt;br /&gt;        print line,&lt;br /&gt;    green = not green&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-480849078083503494?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/480849078083503494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=480849078083503494' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/480849078083503494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/480849078083503494'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/04/this-is-getting-awk-ward.html' title='This is getting awk-ward'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-6891639915705253438</id><published>2008-04-11T07:05:00.011-04:00</published><updated>2008-04-11T07:53:38.729-04:00</updated><title type='text'>Please to dance round for the one called the Greenbar</title><content type='html'>&lt;div&gt;Inspired by what I can only guess is my unsightly python version of greenbar, drewp has created a version with 100 percent more fun to look at. Thanks!&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Drewp's version (see &lt;a href="http://drewp.quickwitretort.com/2008/04/10/0"&gt;here&lt;/a&gt;) is what I always hoped greenbar would grow up to look like when it was written by someone who was not me. I wish the enumerate thing would work - I tried that originally too, but no, it's not to be. It works fine if the input is a regular file, but not when you want to read the stdout of another process. There's internal buffering in python that chunks up the input making the most common use of greenbar, watching a growing log file, hopeless.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Combining the two versions results in a super hybrid that works and is easy on your eyes. Tada!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="code"&gt;#!/usr/bin/python -u&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;pat = sys.argv[1]&lt;br /&gt;except IndexError:&lt;br /&gt;pat = None&lt;br /&gt;&lt;br /&gt;lineno = 0&lt;br /&gt;while 1:&lt;br /&gt; line = sys.stdin.readline()&lt;br /&gt; if not line:&lt;br /&gt;     break&lt;br /&gt; if (pat and pat in line) or (not pat and lineno % 2 == 0):&lt;br /&gt;   print "\x1b[7m%s\x1b[0m" % line.rstrip()&lt;br /&gt; else:&lt;br /&gt;   print line,&lt;br /&gt; lineno = lineno + 1&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;P.s. The original awk version was shorter still. If I find a copy, I'll bury it so that python looks better.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-6891639915705253438?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/6891639915705253438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=6891639915705253438' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/6891639915705253438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/6891639915705253438'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/04/please-to-dance-round-for-one-called.html' title='Please to dance round for the one called the Greenbar'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-4774942235076694366</id><published>2008-04-08T23:02:00.008-04:00</published><updated>2008-04-09T00:18:01.368-04:00</updated><title type='text'>spice up your tail minus effs with greenbar</title><content type='html'>I've been missing this tool for a while now. The original "greenbar" was in written in awk, probably by my friend Mark S. It took input and inverted the text of every other line (like greenbar printer paper). It made watching log files scroll up your terminal much easier to parse.&lt;br /&gt;&lt;br /&gt;Here's my python version which has one new feature. It can be given a string argument in which case it will only highlight lines in its input that contain that string.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;#!/usr/bin/python -u&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;REG = "\x1b[0m"&lt;br /&gt;INV = "\x1b[7m"&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;   pat = sys.argv[1]&lt;br /&gt;except IndexError:&lt;br /&gt;   pat = None&lt;br /&gt;&lt;br /&gt;i = 0&lt;br /&gt;while 1:&lt;br /&gt;     line = sys.stdin.readline()&lt;br /&gt;   if not line:&lt;br /&gt;       break&lt;br /&gt;   if pat:&lt;br /&gt;       if pat in line:&lt;br /&gt;           print INV, line,&lt;br /&gt;       else:&lt;br /&gt;           print REG, line,&lt;br /&gt;   else:&lt;br /&gt;       if i % 2 == 0:&lt;br /&gt;           print INV, line,&lt;br /&gt;       else:&lt;br /&gt;           print REG, line,&lt;br /&gt;   i = i + 1&lt;br /&gt;if i:&lt;br /&gt;   print REG&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It's important to use unbuffered I/O, thus the "-u" flag to python is used along with sys.stdin.readline().&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-4774942235076694366?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/4774942235076694366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=4774942235076694366' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4774942235076694366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4774942235076694366'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2008/04/spice-up-your-tail-minus-effs-with.html' title='spice up your tail minus effs with greenbar'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-4878216243322401861</id><published>2007-12-08T09:08:00.001-05:00</published><updated>2007-12-08T09:09:45.758-05:00</updated><title type='text'>Since you didn't mention it</title><content type='html'>Amazon said the Django book has shipped and should be here on Dec 11th.&lt;br /&gt;&lt;br /&gt;p.s. Hello Jen's dad!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-4878216243322401861?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/4878216243322401861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=4878216243322401861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4878216243322401861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4878216243322401861'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/12/since-you-didnt-mention-it.html' title='Since you didn&apos;t mention it'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-7749653206460389539</id><published>2007-11-15T18:49:00.000-05:00</published><updated>2007-11-15T18:58:19.597-05:00</updated><title type='text'>That Which Is Not Dead</title><content type='html'>Email.&lt;br /&gt;&lt;br /&gt;Usenet is still dead however. Sad really, given how much of my life I spent in the care and feeding of news servers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-7749653206460389539?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/7749653206460389539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=7749653206460389539' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7749653206460389539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7749653206460389539'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/11/that-which-is-not-dead.html' title='That Which Is Not Dead'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-4097950951182981025</id><published>2007-09-18T08:07:00.000-04:00</published><updated>2007-09-18T08:14:36.114-04:00</updated><title type='text'>Django Bookie - Confusion and Delay?</title><content type='html'>As a follow-up to my last post I present Amazon's new delivery status on the &lt;a href="http://www.djangobook.com/"&gt;Django book&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_C9l89wZf8q0/Ru-_77Dc3aI/AAAAAAAAAAM/eJuiQvHzUSY/s1600-h/book.png"&gt;&lt;img style="display:block; margin:5px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_C9l89wZf8q0/Ru-_77Dc3aI/AAAAAAAAAAM/eJuiQvHzUSY/s400/book.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5111515138274155938" /&gt;&lt;/a&gt;&lt;br /&gt;Ta ta for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-4097950951182981025?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/4097950951182981025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=4097950951182981025' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4097950951182981025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/4097950951182981025'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/09/django-bookie-confusion-and-delay.html' title='Django Bookie - Confusion and Delay?'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_C9l89wZf8q0/Ru-_77Dc3aI/AAAAAAAAAAM/eJuiQvHzUSY/s72-c/book.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-3475673432611052092</id><published>2007-09-17T13:18:00.000-04:00</published><updated>2007-09-17T13:25:17.578-04:00</updated><title type='text'>Django Bookie</title><content type='html'>My delivery widget, the fantastic &lt;a href="http://mikepiontek.com/software/mac/delivery-status.html"&gt;Delivery Status&lt;/a&gt;, tells me that Amazon will have the &lt;a href="http://www.amazon.com/gp/product/1590597257/"&gt;Django book&lt;/a&gt; in my hands in two days. Color me skeptical. No, I mean more than usual, smart guy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-3475673432611052092?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/3475673432611052092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=3475673432611052092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/3475673432611052092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/3475673432611052092'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/09/django-bookie.html' title='Django Bookie'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-8848146886223462687</id><published>2007-07-09T19:35:00.000-04:00</published><updated>2007-07-09T19:47:14.894-04:00</updated><title type='text'>pythonic powncer</title><content type='html'>Oh hai!&lt;br /&gt;&lt;br /&gt;I'm in ur pownce, given away ur invites. You wants?&lt;br /&gt;&lt;br /&gt;kthxbai.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-8848146886223462687?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/8848146886223462687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=8848146886223462687' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/8848146886223462687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/8848146886223462687'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/07/pythonic-powncer.html' title='pythonic powncer'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-7974813106423897068</id><published>2007-06-22T14:04:00.000-04:00</published><updated>2007-06-22T14:19:56.458-04:00</updated><title type='text'>TheSecret ThisService</title><content type='html'>I love &lt;a href="http://wafflesoftware.net/thisservice/"&gt;ThisService&lt;/a&gt; because it lets me "script" MacOS X using the command line. It allows you to take any script and turn it into a MacOS X service. Scripts that take standard input make the most interesting services in my opinion. In any application, you select the text you want as input to your script, press the keystroke you've assigned for your service, and your script is invoked with the selected text as its input. Combine that with a python script using the webbrowser module like I have and prepare to triple your productivity(*).&lt;br /&gt;&lt;br /&gt;(*) May also result in nuclear meltdowns.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-7974813106423897068?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/7974813106423897068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=7974813106423897068' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7974813106423897068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/7974813106423897068'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/06/thesecret-thisservice.html' title='TheSecret ThisService'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-1097616902458791181</id><published>2007-05-18T13:18:00.001-04:00</published><updated>2007-05-18T13:33:07.620-04:00</updated><title type='text'>Pshop Image Limited</title><content type='html'>I have this one task at "work" that I did using Photoshop. It's simple and requires the same few steps to be performed each time I do it. I may do it a few times a week at most, but each time I did I wished I wasn't doing it by hand. I thought "I know! I'll learn Photoshop scripting. It's just javascript..."&lt;br /&gt;&lt;br /&gt;But I put it off since I was already busy not learning Django...&lt;br /&gt;&lt;br /&gt;Then the other day I realized I could just do it in Python using the Python Imaging Library. A few minutes later and it was done.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/local/bin/python&lt;br /&gt;&lt;br /&gt;from PIL import Image&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;src = sys.argv[1]&lt;br /&gt;dst = 'output.jpg' &lt;br /&gt;orig = Image.open(src)&lt;br /&gt;thumb = orig.resize((450,321))&lt;br /&gt;new = Image.new('RGB', (1500,1500))&lt;br /&gt;for j in range(5):&lt;br /&gt;    for i in range(5):&lt;br /&gt;        new.paste(thumb, (j*450,i*321))&lt;br /&gt;new.save(dst)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Thanks to my friend, the &lt;a href="http://www.pythonchallenge.com/"&gt;Python Challenge&lt;/a&gt;, for making me spend so much time with dear old &lt;a href="http://www.pythonware.com/products/pil/"&gt;PIL&lt;/a&gt; back in the day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-1097616902458791181?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/1097616902458791181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=1097616902458791181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1097616902458791181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/1097616902458791181'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/05/pshop-image-limited.html' title='Pshop Image Limited'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-117672715989889664</id><published>2007-04-16T08:27:00.000-04:00</published><updated>2007-04-16T08:39:19.910-04:00</updated><title type='text'>Ruby has the lead</title><content type='html'>In baby names that is.&lt;br /&gt;&lt;br /&gt;I'm reading the newsletter from our favorite &lt;a href="http://www.thebirthcenter.org/"&gt;birth center&lt;/a&gt; and they always list the names of the babies born there in the past few months. This time I noticed three babies named Ruby (two born on the same day!) but none are named Python. No Guidos either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-117672715989889664?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/117672715989889664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=117672715989889664' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117672715989889664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117672715989889664'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/04/ruby-has-lead.html' title='Ruby has the lead'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-117526438093073019</id><published>2007-03-30T11:05:00.000-04:00</published><updated>2007-03-30T11:29:34.510-04:00</updated><title type='text'>Django Boogie - part 1</title><content type='html'>I found a &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; based application that I'm interested in checking out, but I'm a complete Django newbie. Let's change that. Please?&lt;br /&gt;&lt;br /&gt;Today I started learning how to use Django from the free online beta version of the forthcoming &lt;a href="http://www.djangobook.com/"&gt;Django Book&lt;/a&gt;. After I installed Python 2.4.4 (because it had working readline support) on my Mac, I set up Django from SVN. I worked my way through the first three chapters which went very smoothly.  I've learned enough for the day to feel very satisfied, and I may come back for more later.&lt;br /&gt;&lt;br /&gt;One thing that Django does very well is its debug mode error pages. I saw more of those then I probably should have. ;-)&lt;br /&gt;&lt;br /&gt;Ttfn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-117526438093073019?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/117526438093073019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=117526438093073019' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117526438093073019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117526438093073019'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/03/django-boogie-part-1.html' title='Django Boogie - part 1'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-117517016451486099</id><published>2007-03-29T09:04:00.000-04:00</published><updated>2007-03-29T12:07:41.063-04:00</updated><title type='text'>bits of tids</title><content type='html'>It's been over a year since I left my university job to work in the family business. Best year ever!&lt;br /&gt;&lt;br /&gt;The Subway (rest in peace) based web application I started there lives on and continues to be improved. If anyone wants the Subway framework's source, drop me a line. I may say yes. *wink*&lt;br /&gt;&lt;br /&gt;Some python nuggets from this year:&lt;br /&gt;&lt;br /&gt;The 0.12 snapshot of &lt;a href="http://elinks.or.cz/"&gt;elinks&lt;/a&gt;, a full featured text based web browser, has a new python scripting back end. The code was contributed by my friend the poultrygeist.&lt;br /&gt;&lt;br /&gt;Also from the poultrygeist comes this python oddity:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; raise ()&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;stdin&gt;", line 1, in ?&lt;br /&gt;TypeError: exceptions must be classes, instances, or strings (deprecated), not tuple&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;O RLY?!&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; raise (IndexError, "ha")&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;stdin&gt;", line 1, in ?&lt;br /&gt;IndexError&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;&gt;&gt;&gt; raise ((KeyError, SyntaxError), IndexError)&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;stdin&gt;", line 1, in ?&lt;br /&gt;KeyError&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sure looks like exceptions can be tuples, even nested tuples. Odd.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-117517016451486099?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/117517016451486099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=117517016451486099' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117517016451486099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117517016451486099'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/03/bits-of-tids.html' title='bits of tids'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-117508939925339402</id><published>2007-03-28T10:35:00.000-04:00</published><updated>2007-03-28T10:51:23.340-04:00</updated><title type='text'>Plone: Adding Roles to Groups</title><content type='html'>I'm a complete Plone/Zope newbie. Let's keep it that way. Please?&lt;br /&gt;&lt;br /&gt;If only I had seen this first:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://plone.org/documentation/faq/adding-role"&gt;Plone FAQ: How do I add a Role?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a slightly more detailed how-to:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;At top level of your site's Zope Management Interface (ZMI), create the new Role in Security tab.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Also in the same level of the ZMI, edit /acl_users/portal_role_manager by adding the new role (and make sure the name matches from step 1!)&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;In Plone's site setup : Users and Groups Administration : Groups, you'll now be able to assign the new Role to a group.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;That's it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-117508939925339402?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/117508939925339402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=117508939925339402' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117508939925339402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/117508939925339402'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2007/03/plone-adding-roles-to-groups.html' title='Plone: Adding Roles to Groups'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-114873762417945015</id><published>2006-05-27T09:44:00.000-04:00</published><updated>2006-05-27T09:47:38.583-04:00</updated><title type='text'>Delicious album art</title><content type='html'>I can't vouch for the music, but the &lt;a href="http://www.pearljam.com/releases/release.php?release=PearlJam&amp;type=None"&gt;cover art&lt;/a&gt; really speaks to me. The back is even better!&lt;br /&gt;&lt;br /&gt;P.s. Yes, I'm alive. Hello everyone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-114873762417945015?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/114873762417945015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=114873762417945015' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/114873762417945015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/114873762417945015'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2006/05/delicious-album-art.html' title='Delicious album art'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-113016022700336838</id><published>2005-10-24T09:22:00.000-04:00</published><updated>2005-10-24T09:23:47.010-04:00</updated><title type='text'>Subterranean Explorations, part trois: The Change Things More</title><content type='html'>Greetings fellow Subway-ologists! If you recall our last two installments, please un-recall them because everything is different now. Better, if you will. Ahem, yes. Quite.&lt;br /&gt;&lt;br /&gt;In part two, we learned about lovable little widgets. Oh! Who could forget those cute little snippets of Cheetah templates ready and able to jump to attention at a moment's notice?&lt;br /&gt;&lt;br /&gt;Well, forget them, they're dead and hopefully buried. Get over it. Views can include other views so there wasn't really a need for them anyway. Pesky things.&lt;br /&gt;&lt;br /&gt;And in part the first, I revealed the wonders of the docstring view. Pure simplicity and brilliance, but sadly lacking the power of the file based species who could extend other views.&lt;br /&gt;&lt;br /&gt;Well, forget that, docstring views can now do that too. Excelsior!&lt;br /&gt;&lt;br /&gt;And speaking of all things views, compiled views are now tidily tucked away so as to be unseen. They live in an app/views/.compiled directory and I'm quite happy about it. No more view droppings scattered about the pallor, no sirree.&lt;br /&gt;&lt;br /&gt;Subway is nearing another milestone release, and the rumors have it that a "lesscode" 1.0 might not be too far behind. Got to beat the competition and all.&lt;br /&gt;&lt;br /&gt;Until next time. Soon?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-113016022700336838?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/113016022700336838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=113016022700336838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/113016022700336838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/113016022700336838'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/10/subterranean-explorations-part-trois.html' title='Subterranean Explorations, part trois: The Change Things More'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112966149889359971</id><published>2005-10-18T14:25:00.000-04:00</published><updated>2005-10-18T15:13:47.380-04:00</updated><title type='text'>A part time Python job with YT</title><content type='html'>I'm switching to half time work in November (and there was MUCH rejoycing!) so we need someone to pick up all my slack. We need someone with these kinds of skills:&lt;br /&gt;&lt;br /&gt; * Python, python, python, python, spam and python&lt;br /&gt; * Web Applications (We use CGI and Subway currently, but TurobGears is close enough &amp;lt;wink&amp;gt;)&lt;br /&gt; * Databases (MySQL, and the MySQLdb python module)&lt;br /&gt; * Asynchronous programming (Twisted and/or Threads)&lt;br /&gt; * SNMP&lt;br /&gt;&lt;br /&gt;The job is in Philadelphia at the University of Pennsylvania, and we prefer someone who can be at the office as much as possible. This is a part time and temporary position.&lt;br /&gt;&lt;br /&gt;Still reading? Excellent!&lt;br /&gt;&lt;br /&gt;If you, or someone you know is interested, get that resume to spamfilter@macspeno.com. And feel free to ask any questions about the job either here or via mail.&lt;br /&gt;&lt;br /&gt;Take care.&lt;br /&gt;&lt;br /&gt;P.S. yes, that's my real email address.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112966149889359971?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112966149889359971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112966149889359971' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112966149889359971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112966149889359971'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/10/part-time-python-job-with-yt.html' title='A part time Python job with YT'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112862361522524793</id><published>2005-10-06T14:28:00.000-04:00</published><updated>2005-10-06T14:33:35.240-04:00</updated><title type='text'>Speno on Rails!</title><content type='html'>&lt;a href="http://speno.vhost.virtua.ch/"&gt;No relation.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; I wonder if they'd ever let me drive one of those things...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112862361522524793?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112862361522524793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112862361522524793' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112862361522524793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112862361522524793'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/10/speno-on-rails.html' title='Speno on Rails!'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112792916995311311</id><published>2005-09-28T13:37:00.000-04:00</published><updated>2005-09-28T20:10:11.296-04:00</updated><title type='text'>Django powered Avocados!</title><content type='html'>&lt;a href="http://www2.ljworld.com/news/2005/sep/28/time_ripe_avocado_aficionados_pick_deal/"&gt;Here.&lt;/a&gt;  Make sure you view the luscious close up version of the picture.  *drool*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112792916995311311?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112792916995311311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112792916995311311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112792916995311311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112792916995311311'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/09/django-powered-avocados.html' title='Django powered Avocados!'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112717338881641878</id><published>2005-09-19T19:38:00.000-04:00</published><updated>2005-09-19T20:20:07.826-04:00</updated><title type='text'>The CherryPy Orchard</title><content type='html'>CherryPy Release Candidate 1 is now available &lt;a href="http://www.cherrypy.org/wiki/CherryPyDownload"&gt;here&lt;/a&gt;. Yay!&lt;br /&gt;&lt;br /&gt;Earlier today I was watching &lt;a href="http://www.blueskyonmars.com/"&gt;Kevin Dangoor's&lt;/a&gt; very well done screencast on &lt;a href="http://www.turbogears.org"&gt;TurboGears&lt;/a&gt; and I noticed something that gave me a happy. You see, TurboGears is built on top of CherryPy, and during the presentation I saw one of the &lt;a href="http://www.cherrypy.org/changeset/494"&gt;minor changes I had made to CherryPy&lt;/a&gt; flash on the screen. Even though it's such a tiny thing, I got really chuffed about it.&lt;br /&gt;&lt;br /&gt;That's when I realized how wonderful it has been to be a part of a team of talented open source developers like &lt;a href="http://www.cherrypy.org/wiki/CherryPyTeam"&gt;those that help put together CherryPy&lt;/a&gt;. I've been using open source for a long time but I've never really enjoyed it as much as I do right now. It's very, very sweet.&lt;br /&gt;&lt;br /&gt;Take care.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112717338881641878?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112717338881641878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112717338881641878' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112717338881641878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112717338881641878'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/09/cherrypy-orchard.html' title='The CherryPy Orchard'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112692292013411515</id><published>2005-09-16T21:49:00.000-04:00</published><updated>2005-09-18T09:25:20.046-04:00</updated><title type='text'>Subterranean exploration, part 2 or What's a Widget?</title><content type='html'>Now that I have the attention of all you &lt;a href="http://imdb.com/title/tt0090685/"&gt;Thornton Melon&lt;/a&gt; fans, it's time to once again illuminate our electric torches and brandish our pickaxes in search of the latest chunky cured pork products from the &lt;a href="subway.python-hosting.com"&gt;Subway&lt;/a&gt; project. Today we're going to talk about &lt;span style='font-weight: bolder'&gt;widgets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Calm down! Calm down. It's okay. There's no danger here. Unlike the terrifying toe eating widgets of the Gobi dessert, Subway's variety are friendly. They're small, cuddly and unicorn-like in their ability to slowly drain impure thoughts from your brains.&lt;br /&gt;&lt;br /&gt;Subway's widgets are small bits of view code available in the widget namespace. This means that your views can include those widgets whenever they are needed. The widgets themselves live in your application's widget directory and are, just like Subway's views, &lt;a href="http://www.cheetahtemplate.org/"&gt;Cheetah&lt;/a&gt; templates. Here's an example widget that I'm fond of:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#if 'notice' in $flash&lt;br /&gt;    &amp;lt;div class="notice"&amp;gt;&lt;br /&gt;        $escape($flash.notice)&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;#end if&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That's Subway's notice.html widget which is used for &lt;a href="http://blog.ianbicking.org/web-application-patterns-status-notification.html"&gt;web status notification&lt;/a&gt;. Whenever you need it, just drop it into your view using &lt;pre&gt;$widget.notice&lt;/pre&gt; and you're all set. If you need to you can also pass arguments to your widgets using normal Python syntax.&lt;br /&gt;&lt;br /&gt;My friend, if you like widgets, and I mean really like widgets, then go read &lt;a href="http://subway.python-hosting.com/wiki/HowToWidgets"&gt;Subway's How-to page on them&lt;/a&gt; right now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112692292013411515?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112692292013411515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112692292013411515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112692292013411515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112692292013411515'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/09/subterranean-exploration-part-2-or.html' title='Subterranean exploration, part 2 or What&apos;s a Widget?'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112436730922526258</id><published>2005-08-18T08:04:00.000-04:00</published><updated>2005-08-18T08:34:09.000-04:00</updated><title type='text'>More python from my coworkers (pykpass)</title><content type='html'>Well, the world already knows about my friend &lt;a href="http://www.huque.com/"&gt;Shumon's&lt;/a&gt; first public Python project, &lt;a href="http://www.huque.com/python/pykpass/"&gt;pykpass&lt;/a&gt;, because I saw it on the &lt;a href="http://www.pythonware.com/daily/"&gt;Daily Python-URL&lt;/a&gt; this morning and it's in the &lt;a href="http://cheeseshop.python.org/"&gt;Cheeseshop&lt;/a&gt; too. Nice work, Shuggie!&lt;br /&gt;&lt;br /&gt;This was Shumon's first attempt at wrapping a C library in Python, and I got to help him with a few tiny bits. In the process, I learned way more about the Python C API than I previously knew. I'm very glad I got a chance to answer those few questions. I'd appreciate it if some more experienced pythonistas could have a look at the work and offer their feedback. Thanks!&lt;br /&gt;&lt;br /&gt;We have in our toolbox another useful Python module that wraps parts of the &lt;a href="http://asg.web.cmu.edu/cyrus/download/"&gt;Cyrus SASL library&lt;/a&gt; using &lt;a href="http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/"&gt;Pyrex&lt;/a&gt; that wants to be open source (it's publically available if you know where to &lt;a href="http://www.google.com/"&gt;look&lt;/a&gt;). Sadly, nothing ever came of that "effort".  I think the way to getting it done is now clear though...&lt;br /&gt;&lt;br /&gt;Take care.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112436730922526258?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112436730922526258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112436730922526258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112436730922526258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112436730922526258'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/08/more-python-from-my-coworkers-pykpass.html' title='More python from my coworkers (pykpass)'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112258255531114998</id><published>2005-07-28T16:29:00.000-04:00</published><updated>2005-07-28T16:29:15.336-04:00</updated><title type='text'>Native SNMPv3 in Python</title><content type='html'>I bemoaned about the lack of SNMPv3 support in Python &lt;a href="http://www.pycs.net/users/0000231/weblog/2004/12/04.html"&gt;here&lt;/a&gt;. Well bemoan no more pythonistas because &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_id=7836556&amp;amp;forum_id=9806" id="7836556&amp;amp;forum_id=9806"&gt;now we have it&lt;/a&gt;. You'll recall that &lt;a href="http://www.python.org/psf/grants/snmp.txt"&gt;Ilya Etingof&lt;/a&gt; received one of the three grants awarded by the &lt;a href="http://www.python.org/psf/"&gt;PSF&lt;/a&gt; to do this work. So thanks to Ilya and thank you Python Software Foundation! Sadly, I haven't yet gotten around to actually trying it yet...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112258255531114998?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112258255531114998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112258255531114998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112258255531114998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112258255531114998'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/native-snmpv3-in-python.html' title='Native SNMPv3 in Python'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112251712460752238</id><published>2005-07-27T22:18:00.000-04:00</published><updated>2005-07-27T22:18:44.636-04:00</updated><title type='text'>The Guac NOC : Mission Control for Avocados</title><content type='html'>This is the coolest thing to happen to avocados ever. The Haas Avocado Board has launched &lt;a href="http://www.avohq.com" title="Global Avocado Marketing Intranet"&gt;avoHQ.com&lt;/a&gt; as part of its global avocado marketing campaign. Where else can you get near real time trend data for avocado market penetration? Make sure you watch their movie.&lt;br /&gt;&lt;br /&gt;See also &lt;a href="http://www.signonsandiego.com/news/state/20050727-9999-7m27hass.html"&gt;Marketing Web site tracks worldwide flow of avocados&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112251712460752238?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112251712460752238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112251712460752238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112251712460752238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112251712460752238'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/guac-noc-mission-control-for-avocados.html' title='The Guac NOC : Mission Control for Avocados'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112199423752205762</id><published>2005-07-21T21:03:00.000-04:00</published><updated>2005-07-26T13:18:30.603-04:00</updated><title type='text'>Subterranean exploration, part 1</title><content type='html'>Join me as I journey into the underground so that I may mine a shiny red gem from the depths of the &lt;a href="http://subway.python-hosting.com/"&gt;Subway project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Looking around, something sparkly has caught my eye. What could it be? Why it's  ( *rolls dice* ) &lt;strong&gt;docstring view templates using the @subway.method_view decorator&lt;/strong&gt;!&lt;br /&gt;&lt;br /&gt;This jewel of a feature allows us to use the docstrings from the methods in our controllers as our view templates. Here's a simple example which shows this treasure off a bit:&lt;br /&gt;&lt;br /&gt;&lt;pre class="python"&gt;    &lt;br /&gt;    @subway.method_view&lt;br /&gt;    def echo(word="subway", count=3):&lt;br /&gt;        """&lt;br /&gt;        &amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;br /&gt;        #for $echo in $echoes&lt;br /&gt;            &amp;lt;p&amp;gt;$echo&amp;lt;/p&amp;gt;&lt;br /&gt;        #end for&lt;br /&gt;        &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;        """&lt;br /&gt;        echoes = [word] * int(count)&lt;br /&gt;        return echo.view()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Doesn't this seem like a quick and easy way to get a view written? Yes, I think that's the case. However, be warned that it doesn't support all the features that a real view provides. For example, the #extends feature from &lt;a href="http://www.cheetahtemplate.org/"&gt;Cheetah&lt;/a&gt; isn't supported, while it is supported by a regular view.&lt;br /&gt;&lt;br /&gt;Tune in next time for...something else!&lt;br /&gt;&lt;br /&gt;&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/cherrypy" rel="tag"&gt;cherrypy&lt;/a&gt;, &lt;a href="http://technorati.com/tag/python" rel="tag"&gt;python&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112199423752205762?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112199423752205762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112199423752205762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112199423752205762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112199423752205762'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/subterranean-exploration-part-1.html' title='Subterranean exploration, part 1'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112168866377320494</id><published>2005-07-18T08:10:00.000-04:00</published><updated>2005-07-18T08:11:03.800-04:00</updated><title type='text'>django gets a shot of WSGI</title><content type='html'>Noticed in my svn up this morning that &lt;a href="http://www.djangoproject.com/"&gt;django&lt;/a&gt; now as a &lt;a href="http://code.djangoproject.com/file/django/trunk/django/core/handlers/wsgi.py"&gt;WSGI handler&lt;/a&gt;. That means you won't have to run it with mod_python, nor apache for that matter. That'll make it much easier for people to start using it, and cut out half the converstation on #django, I think.&lt;br /&gt;&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/django" rel="tag"&gt;django&lt;/a&gt;, &lt;a href="http://technorati.com/tag/python" rel="tag"&gt;python&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112168866377320494?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112168866377320494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112168866377320494' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112168866377320494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112168866377320494'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/django-gets-shot-of-wsgi.html' title='django gets a shot of WSGI'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112148085638378563</id><published>2005-07-15T22:27:00.000-04:00</published><updated>2005-07-15T22:27:36.406-04:00</updated><title type='text'>Guacamole on a Stick?</title><content type='html'>&lt;a href="http://www.latimes.com/news/local/la-me-ocfair14jul14,1,3367635.story?coll=la-headlines-california"&gt;Cheese stuffed, batter dipped, deep fried avocados&lt;/a&gt;! I'll take two please.&lt;br /&gt;&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/food" rel="tag"&gt;food&lt;/a&gt;, &lt;a href="http://technorati.com/tag/avocado" rel="tag"&gt;avocado&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112148085638378563?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112148085638378563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112148085638378563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112148085638378563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112148085638378563'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/guacamole-on-stick.html' title='Guacamole on a Stick?'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112142644517561576</id><published>2005-07-15T07:20:00.000-04:00</published><updated>2005-07-15T07:59:12.426-04:00</updated><title type='text'>django: The Web framework for perfectionists with deadlines.</title><content type='html'>Hello, &lt;a href="http://www.djangoproject.com/"&gt;django&lt;/a&gt;. Nice to meet you!&lt;br /&gt;&lt;br /&gt;&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/django" rel="tag"&gt;django&lt;/a&gt;, &lt;a href="http://technorati.com/tag/python" rel="tag"&gt;python&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112142644517561576?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112142644517561576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112142644517561576' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112142644517561576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112142644517561576'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/django-web-framework-for.html' title='django: The Web framework for perfectionists with deadlines.'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112138703886180862</id><published>2005-07-14T15:37:00.000-04:00</published><updated>2005-07-14T20:25:25.166-04:00</updated><title type='text'>CherryPy, Subway, and Django news</title><content type='html'>Just spreading the word that the fun, easy to use, Python web framework, &lt;a href="http://www.cherrypy.org"&gt;CherryPy&lt;/a&gt;, has released its &lt;a href="http://www.cherrypy.org/wiki/CherryPyDownload"&gt;2.1 beta&lt;/a&gt;. It has come a long way since 2.0! Way to go team!&lt;br /&gt;&lt;br /&gt;Given that is uses the above mentioned &lt;a href="http://www.cherrypy.org"&gt;CherryPy&lt;/a&gt; as its controller, it is worth noting that the &lt;a href="http://subway.python-hosting.com/"&gt;Subway&lt;/a&gt; project has released its first milestone &lt;a href="http://subway.python-hosting.com/wiki/Milestone1"&gt;here&lt;/a&gt;. You'll also find a simple example application called &lt;a href="http://subway.python-hosting.com/wiki/NoteBoard"&gt;noteboard&lt;/a&gt; there that is an effective demonstration of some of Subway's nicest features. Yum!&lt;br /&gt;&lt;br /&gt;Though promised to be out sometime this week, there's no sign of &lt;a href="http://django.sourceforge.net/"&gt;Django&lt;/a&gt; yet, but &lt;a href="http://www.holovaty.com/"&gt;Adrian&lt;/a&gt; is presenting it to &lt;a href="http://chipy.org/#next-meeting"&gt;ChiPy&lt;/a&gt; tonight, so here's hoping we'll see something by tomorrow.&lt;br /&gt;&lt;br /&gt;Take care.&lt;br /&gt;&lt;br /&gt;&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/cherrypy" rel="tag"&gt;cherrypy&lt;/a&gt;, &lt;a href="http://technorati.com/tag/python" rel="tag"&gt;python&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112138703886180862?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112138703886180862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112138703886180862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112138703886180862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112138703886180862'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/cherrypy-21-beta-available.html' title='CherryPy, Subway, and Django news'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14462287.post-112240224831909784</id><published>2005-07-13T16:31:00.000-04:00</published><updated>2005-07-26T14:24:08.346-04:00</updated><title type='text'>Welcome back, Avocado eaters!</title><content type='html'>Hello! And welcome back!  It's been nearly four months since I closed the Avocado down. Since that time I've been t playing with small bits of python related web technologies like &lt;a href="http://www.cherrypy.org/"&gt;CherryPy&lt;/a&gt; and &lt;a href="http://subway.python-hosting.com/"&gt;Subway&lt;/a&gt;. I'm gonna write about those things.&lt;br /&gt;&lt;br /&gt;Since &lt;a href="http://www.pycs.net/users/0000231/weblog/2004/12/04.html"&gt;I last mentioned it&lt;/a&gt;, my friend's book, &lt;a href="http://perl.plover.com/hop/"&gt;Higher Order Perl&lt;/a&gt;, was released and I even got a chance to read it. There's a ton of great stuff in there, but if you're a perl programmer, you'll find ways to make perl much more functional. If you're a python programmer, you'll probably walk away appreciating python even more than you did before. I know I did.&lt;br /&gt;&lt;br /&gt;One last tidbit. A co-worker of mine wrote a python implementation of the perl module File:Tail. There are a few of them out there, but I suggested he put it on the cookbook anyway. It's &lt;a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/436477"&gt;filetail.py&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Take care.&lt;br /&gt;&lt;br /&gt;p.s. I'm editing this so it lands on the python planet.&lt;br /&gt;&lt;br /&gt;&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/perl" rel="tag"&gt;perl&lt;/a&gt;, &lt;a href="http://technorati.com/tag/puppy" rel="tag"&gt;puppy&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14462287-112240224831909784?l=speno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speno.blogspot.com/feeds/112240224831909784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14462287&amp;postID=112240224831909784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112240224831909784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14462287/posts/default/112240224831909784'/><link rel='alternate' type='text/html' href='http://speno.blogspot.com/2005/07/welcome-back-avocado-eaters_13.html' title='Welcome back, Avocado eaters!'/><author><name>John Speno</name><uri>http://www.blogger.com/profile/00172220305879664627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-exfzd4l3A14/TbbelXLvbFI/AAAAAAAAAJ4/st_-VjdAkRk/s220/spenojumpface.jpg'/></author><thr:total>0</thr:total></entry></feed>
