<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.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"><id>tag:blogger.com,1999:blog-11802292</id><updated>2009-11-10T06:23:28.117-08:00</updated><title type="text">Catherine: pyOraGeek</title><subtitle type="html">Having waaaaay too much fun with Python and Oracle.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default?start-index=26&amp;max-results=25" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>249</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/Catherine-Pyorageek" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-11802292.post-7453620171955511211</id><published>2009-11-05T07:00:00.001-08:00</published><updated>2009-11-05T07:21:16.979-08:00</updated><title type="text">pernicious python.org proxy problem</title><content type="html">For the past few weeks, I haven't been able to access python.org or any of its pages through a proxy server.  My workplace has one standard proxy server, and I also use a personal machine as a SOCKS proxy for an SSH tunnel - and both of them have been getting name resolution errors for all python.org sites.  I haven't seen it for any other sites, or when using no proxy.&lt;br /&gt;&lt;br /&gt;Does anybody know what's going on?  Is there something about python.org that would make name resolution work differently for it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-7453620171955511211?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/7453620171955511211/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=7453620171955511211" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7453620171955511211" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7453620171955511211" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/11/pernicious-pythonorg-proxy-problem.html" title="pernicious python.org proxy problem" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-8445481670856757570</id><published>2009-11-03T09:19:00.000-08:00</published><updated>2009-11-03T09:37:35.389-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="pycon" /><title type="text">A PyCon program committee volunteer reflects</title><content type="html">The &lt;a href="http://us.pycon.org"&gt;PyCon&lt;/a&gt; program committee has finished its work.  All submissions have been reviewed, debated, argued on, and voted - often through several cycles.  Emails accepting and declining talks have gone out.&lt;br /&gt;&lt;br /&gt;I wanted to blog about my impressions as a program committee volunteer.  Note that this is totally unofficial, and I'm not speaking on behalf of the committee, PyCon, etc.&lt;br /&gt;&lt;h2&gt;It was wonderful&lt;/h2&gt;Just reviewing the talks was a great experience.  Some of the talks were fun just to visualize; watching them will be even better.  I learned lots about what is going on in the Python community.  The program committee is a smart and fun crowd to work with, too.&lt;br /&gt;&lt;h2&gt;It was horrible&lt;/h2&gt;The problem with a programming language that can do pretty much anything is that three days of scheduled talks are nowhere near enough to see everything that's going on.  I wish we could have five days of talks, but there are too many people who wouldn't have the time or money for such a conference.&lt;br /&gt;&lt;br /&gt;With room to accept fewer than half of our submissions, we had to turn away talks that would have been great.  For instance, the one talk I most wanted to see - the proposal I would have walked barefoot to Atlanta for - got declined.  What can you do?  Often "pretty much everybody was pretty excited about this" talks had to be sacrificed for the sake of "virtually everybody was dying to see this" talks.&lt;br /&gt;&lt;h2&gt;But wait, there's more&lt;/h2&gt;Fortunately, scheduled talks are only the tip of the PyCon iceberg.  We have Lightning Talks, Open Spaces, and (new this year) &lt;a href="http://us.pycon.org/2010/conference/posters/"&gt;poster board sessions&lt;/a&gt;!  I hope all declined speakers will consider taking their material to one or more of those formats!&lt;br /&gt;&lt;h2&gt;PyCon is going to be wonderful&lt;/h2&gt;I think we have the best crop of presentations we've ever had.  If you can look through the list of accepted talks and not start making Atlanta travel plans, then you are already dead.&lt;br /&gt;&lt;h2&gt;PyCon is going to be horrible&lt;/h2&gt;... because, with five simultaneous tracks packed with the very best of material, I promise you will face multiple can't-miss talks going on at the same time, all day, every day.  The painful decisions of the program committee are really only a preview of the difficult decisions every attendee will have to make at the conference itself.&lt;br /&gt;&lt;h2&gt;For 2011: increasing your chances&lt;/h2&gt;If you want to make your future PyCon proposal more appealing to the committee (making our decisions even harder - thanks a lot), here are some of the things I saw that helped talks make the cut.&lt;ul&gt;&lt;li&gt;The basics: a clear talk description, orderly-looking outline, plausible-looking timings.  If reviewers ask questions, answer them.  Give every impression that you're prepared to put serious effort into your talk.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Broad appeal.  It's OK to present on specialty topics, of course, but if you can point out ways that even people outside the specialty will also want to see it, it will help.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unusual topic.  Every year, there are some hot topics that everybody in the community seems to be talking about... and submitting talks on.  Since we're not going to accept a dozen talks on any topic, no matter how hot, these talks need to prevail over a lot of competitors.  On the other hand, if you've got a topic that makes the committee say, "HUH?  Wow, I'd never heard of anything like that!", it really helps you stand out.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;We always get more intermediate-level submissions than for beginner or advanced, so the competition was fiercest there.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;What will attendees get from your talk that they couldn't get simply from reading the docs?  Make sure we can tell.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Evidence of preparation and skill.  Some speakers had established reputations as skillful, engaging presenters; some provided links to their slide decks from earlier versions of their talks given at local groups or regional conferences; a few linked to actual recordings of earlier versions of their talks.  Give your talk at a nearby usergroup, then convince one of your group members to volunteer for the program committee.  :)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Scratch the itch.  When committee members say, "Ah, yes, I've been puzzled by that and dying for a proper explanation!" - or, "I personally understand it, but I see misunderstanding of it throughout the community and wish somebody would help clear  it up", that is a big plus.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Keep the Py in PyCon.  If the topic is one of general IT interest - database technology or rich web client programming, for instance - then make sure to emphasize the Python angle of your talk.  How do you work the problem from Python specifically?  What do Python users need to know about the problem that they won't learn from materials aimed at the IT community overall?&lt;/li&gt;&lt;/ul&gt;Anyway, my personal thanks to everyone who submitted, and I really hope to see you all at PyCon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-8445481670856757570?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/8445481670856757570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=8445481670856757570" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/8445481670856757570" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/8445481670856757570" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/11/pycon-program-committee-volunteer.html" title="A PyCon program committee volunteer reflects" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-5433430923462444737</id><published>2009-10-07T06:22:00.000-07:00</published><updated>2009-10-07T06:55:08.061-07:00</updated><title type="text">Stop!  Drop that field!</title><content type="html">For &lt;a href="http://www.pyohio.org/"&gt;PyOhio&lt;/a&gt; registration, we used a nice service called &lt;a href="http://www.eventbrite.com/"&gt;eventbrite&lt;/a&gt;.  It worked great, but I have one big problem with it: it collected way too much data from registrants.  It got us the data we needed, but it also asked for home addresses, gender, job title, company... all data we had no legitimate need for or plans to use, probably just because the fields are in the eventbrite form template.  Entering it was pointless nuisance for our attendees, and maybe some were actually put off by the length or intrusiveness of the registration form.  (Dave Stanek, if you're reading this, let's see if we can change that for next year.)&lt;br /&gt;&lt;br /&gt;We are &lt;span style="font-style:italic;"&gt;so&lt;/span&gt; not the only offenders in this department.  It's everywhere, it's endemic.  At website after website, we're asked to provide information of no apparent relevance to the sites' purposes.  It's so easy to throw field after field into a data collection form; templates are provided with every conceivable field already in place; and - well, why not?  Isn't more data better?&lt;br /&gt;&lt;br /&gt;No.  No, it's not.  Excess data takes time, clutters databases, obscures important data, increases risks of data leakage.  In interpersonal interactions, we always have the option of asking "Why do you need to know that?", or just giving people that funny look that tells them they're going out of bounds.  On paper forms, we can leave fields blank.  Automated forms with field validation cut those safeguards off and open the door to compulsive collection syndrome.  The one defense people do have against intrusive electronic forms - lying - ruins data quality, and false data is much worse than no data at all.&lt;br /&gt;&lt;br /&gt;We need a ethos of restraint in data collection, of always asking, "Why am I collecting this field?"  Data collection needs to be seen as something that is not pure good, but something that has a cost to weigh against the benefit.  &lt;span style="font-style:italic;"&gt;Not&lt;/span&gt; collecting data is often the responsible choice, and we need to teach each other that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-5433430923462444737?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/5433430923462444737/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=5433430923462444737" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/5433430923462444737" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/5433430923462444737" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/10/stop-drop-that-field.html" title="Stop!  Drop that field!" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-7359139683091666347</id><published>2009-10-05T11:43:00.001-07:00</published><updated>2009-10-05T11:49:31.279-07:00</updated><title type="text">PyCon talk review</title><content type="html">We've got a record number of volunteers working on PyCon's Program Committee - the group that reviews talk proposals and decides which ones go on the schedule.  And it's a good thing, because we've also got a record number of proposals - 179!  (For comparison, PyCon 2008 got 118.)&lt;br /&gt;&lt;br /&gt;Right now, we're in the fun part - going through the proposed talks and yelling, "Oooh!  Ooooh!  I want that one!"  Just looking through the proposed talks is a great Python education all by itself - you find out about useful packages and techniques you'd never known were out there.  &lt;br /&gt;&lt;br /&gt;The tough part comes later - when we have to winnow the list down.  Without exception, there are talks I want to see that won't make the cut.  Accepting all the good talks would be great, but we'd need a week of PyCon, and three days for the core conference are all we figure most attendees can spare.  (My proposal for a round-the-clock talk schedule met only chuckles.  Then again, with late-night Open Spaces, we already come dangerously close to a round-the-clock schedule...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-7359139683091666347?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/7359139683091666347/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=7359139683091666347" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7359139683091666347" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7359139683091666347" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/10/pycon-talk-review.html" title="PyCon talk review" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-4576206123806792726</id><published>2009-09-29T08:44:00.001-07:00</published><updated>2009-10-02T10:37:55.524-07:00</updated><title type="text">Ohio LinuxFest</title><content type="html">Wooo, Ohio LinuxFest!&lt;br /&gt;&lt;br /&gt;My reStructuredText slides are at &lt;a href="http://catherinedevlin.pythoneers.com/"&gt;catherinedevlin.pythoneers.com&lt;/a&gt;, down at the bottom of the page.  Thanks to everybody who attended and gave great feedback!&lt;br /&gt;&lt;br /&gt;I arrived Friday morning this time and spent a good chunk of the day at the Hackathon, working with Mark Borgerding on his idea for a new educational game for Childsplay.  We made some good progress, especially since we were both 100% newbies to pygame!  I enjoyed myself and learned a thing or two.  Hopefully we'll be able to finish the game up remotely over the next several weeks.  &lt;br /&gt;&lt;br /&gt;Next came an impromptu lightning talk session (I looooove lightning talks) where I gave an extremely badly-organized (but well-received) glimpse at sqlpython.  &lt;br /&gt;&lt;br /&gt;I helped Todd Trichler from Oracle Technology Network with his demonstration of Oracle's free offerings.  We had a good group, and the next morning Todd gave away his ENORMOUS box of Oracle software in about an hour.&lt;br /&gt;&lt;br /&gt;The hallway track was, as usual, excellent.  William McVey and Eric Floehr used the PyOhio table to stir up interest in CincyPy and Central Ohio Pythonistas, and Monday's inaugural COPy meeting had 27 attendees!  Score!  I enjoyed talking with people so much that I found myself on the verge of going hoarse just 90 minutes before my talk.  Eek!&lt;br /&gt;&lt;br /&gt;I had a great time.  Congratulations and thank you to the OLF organizers and sponsors.  Once a year, you make Ohio feel like anything but a technology backwater!&lt;br /&gt;&lt;br /&gt;Sunday was the Diversity in Open Source workshop, which deserves its own post.  To be continued...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-4576206123806792726?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/4576206123806792726/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=4576206123806792726" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/4576206123806792726" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/4576206123806792726" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/09/ohio-linuxfest.html" title="Ohio LinuxFest" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-6140429737074408223</id><published>2009-09-24T06:47:00.001-07:00</published><updated>2009-09-24T06:56:16.549-07:00</updated><title type="text">Python at Ohio LinuxFest</title><content type="html">The &lt;a href="http://ohiolinux.org/"&gt;Ohio LinuxFest&lt;/a&gt; fun starts tomorrow!  Here are the Python-related activities there that I know of.&lt;br /&gt;&lt;br /&gt;Of the Friday hackathon projects, I believe that &lt;a href="http://sourceforge.net/projects/schoolsplay/"&gt;schoolsplay&lt;/a&gt; and &lt;a href="http://sourceforge.net/projects/sendoff/"&gt;sendoff&lt;/a&gt; are Python-based.&lt;br /&gt;&lt;a href="http://www.ohiolinux.org/hackathon.html"&gt;http://www.ohiolinux.org/hackathon.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Zenoss Community day on Friday (Zenoss is a Python product):&lt;br /&gt;&lt;a href="http://www.ohiolinux.org/zenoss.html"&gt;http://www.ohiolinux.org/zenoss.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Python for Linux System Administration - Vern Ceder&lt;br /&gt;10 AM Saturday&lt;br /&gt;&lt;a href="http://www.ohiolinux.org/talks.html#PYTHON"&gt;http://www.ohiolinux.org/talks.html#PYTHON&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;reStructuredText - Plain Text gets Superpowers - me&lt;br /&gt;5 PM Saturday&lt;br /&gt;&lt;a href="http://www.ohiolinux.org/talks.html#TEXT"&gt;http://www.ohiolinux.org/talks.html#TEXT&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pyohio.org"&gt;PyOhio&lt;/a&gt; booth - all day Saturday (though not always staffed).  All Python groups should take advantage of it shamelessly - bring your literature! - and anybody who wants to hang around there and have Python-related conversations with people, that's fantastic.&lt;br /&gt;&lt;br /&gt;And, of course, don't forget &lt;a href="http://catherinedevlin.blogspot.com/2009/08/oracle-at-ohio-linuxfest.html"&gt;Oracle's event at OLF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-6140429737074408223?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/6140429737074408223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=6140429737074408223" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6140429737074408223" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6140429737074408223" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/09/python-at-ohio-linuxfest.html" title="Python at Ohio LinuxFest" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-1301155174063836618</id><published>2009-09-17T10:46:00.001-07:00</published><updated>2009-09-17T11:01:19.326-07:00</updated><title type="text">easy_install no longer easy on Vista</title><content type="html">Since my Windows machine was upgraded from XP to Vista, managing Python packages has become absolutely horrible.  Here's what I've puzzled out so far, with much wailing and gnashing of teeth:&lt;br /&gt;&lt;br /&gt;1. No matter what rights your primary account has, you need to run easy_install from a &lt;span style="font-style:italic;"&gt;Run as Administrator&lt;/span&gt; window - otherwise, easy_install runs in a separate window which pops up, flashes some feedback at you for a microsecond or so, then disappears, leaving you with absolutely no record of whether the install works and why.  There doesn't seem to be any way to log the results to a file.&lt;br /&gt;&lt;br /&gt;2. After installing any module that is deployed as an .egg into &lt;span style="font-style:italic;"&gt;site-packages&lt;/span&gt;, you need to go and edit its permissions manually to give your account read privileges on the egg.  (Giving your account privileges on the whole site-packages directory does not help.)  Until you do, &lt;span style="font-style:italic;"&gt;import newmodule&lt;/span&gt; will fail with &lt;span style="font-style:italic;"&gt;ImportError: no module named newmodule&lt;/span&gt; on your account - but will succeed when run from a Run as Administrator window.&lt;br /&gt;&lt;br /&gt;This is bad news.  I fought my way through because I'm a dedicated Pythonista; how many Vista-using Py-curious are going to give up on Python because module installation now requires such hacks?&lt;br /&gt;&lt;br /&gt;(Don't forget - Ohio LinuxFest registration ends tomorrow at noon!  Move, move, move!  You'll hurt my feelings if you don't go.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-1301155174063836618?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/1301155174063836618/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=1301155174063836618" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1301155174063836618" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1301155174063836618" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/09/easyinstall-no-longer-easy-on-vista.html" title="easy_install no longer easy on Vista" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-3542451930785650633</id><published>2009-08-28T11:57:00.001-07:00</published><updated>2009-08-28T17:08:09.539-07:00</updated><title type="text">Enthought's reStructuredText editor</title><content type="html">Enthought has produced a wonderful tool for getting into reStructuredText: a side-by-side WYSIWYG rST editor.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HR7nVcfhs_s/SpgowhBw8vI/AAAAAAAAAEY/1AzCTiiHvI8/s1600-h/rsted.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 169px;" src="http://1.bp.blogspot.com/_HR7nVcfhs_s/SpgowhBw8vI/AAAAAAAAAEY/1AzCTiiHvI8/s400/rsted.png" border="0" alt="Screenshot of editor session" id="BLOGGER_PHOTO_ID_5375090969231291122" /&gt;&lt;/a&gt;&lt;br /&gt;Getting it installed, however, just about killed me.  Here are the steps I finally puzzled out for Ubuntu 9.04.  Miss any steps - or even change the order - and you'll get error messages that don't help even slightly.&lt;blockquote&gt;&lt;code&gt;sudo apt-get update&lt;br /&gt;sudo apt-get install python-setuptools python-vtk&lt;br /&gt;sudo easy_install -U numpy&lt;br /&gt;sudo easy_install -U docutils sphinx TraitsBackendQt[nonets] AppTools[nonets]&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;[EDIT] If you're not on 9.04, or you just want to be on the safe side, it doesn't hurt to &lt;code&gt;sudo apt-get install python-dev python-qt4&lt;/code&gt; at the beginning of the whole process.&lt;br /&gt;&lt;br /&gt;The other odd thing is that this lovely editor apparently has no name, and certainly no handy start script or presence in any menu.  Mine got installed at &lt;code&gt;/usr/local/lib/python2.6/dist-packages/AppTools-3.3.0-py2.6.egg/enthought/rst/app.py&lt;/code&gt;; your best bet to find yours is probably &lt;code&gt;sudo updatedb; locate -r rst/app.py$&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then, set up a bash script to make it usable.  I'm calling it "rsted".  &lt;code&gt;sudo nano /usr/local/bin/rsted&lt;/code&gt; and fill it with:&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;python /usr/local/lib/python2.6/dist-packages/AppTools-3.3.0-py2.6.egg/enthought/rst/app.py $*&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;    &lt;br /&gt;... &lt;code&gt;sudo chmod +x /usr/local/bin/rsted&lt;/code&gt;, and live happily ever after.&lt;br /&gt;  &lt;br /&gt;(The $* in /usr/local/bin/rsted doesn't actually do anything - the editor doesn't seem to accept arguments like a filename - but I'm being hopeful for the future.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-3542451930785650633?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/3542451930785650633/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=3542451930785650633" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/3542451930785650633" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/3542451930785650633" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/enthoughts-restructuredtext-editor.html" title="Enthought's reStructuredText editor" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_HR7nVcfhs_s/SpgowhBw8vI/AAAAAAAAAEY/1AzCTiiHvI8/s72-c/rsted.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-1203966398207791005</id><published>2009-08-14T09:30:00.000-07:00</published><updated>2009-08-14T09:32:16.358-07:00</updated><title type="text">PyCon 2010: Call for Proposals</title><content type="html">In the opinion of most attendees I talked to, PyCon 2009 was the best one yet.  If you need an excuse to come to PyCon 2010... well, what better excuse could there be than, "I'm speaking"?&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Call for proposals — PyCon 2010 — &lt;a href="http://us.pycon.org/2010/"&gt;http://us.pycon.org/2010/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Due date: October 1st, 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Want to showcase your skills as a Python Hacker? Want to have hundreds of people see your talk on the subject of your choice? Have some hot button issue you think the community needs to address, or have some package, code or project you simply love talking about? Want to launch your master plan to take over the world with python?&lt;br /&gt;&lt;br /&gt;PyCon is your platform for getting the word out and teaching something new to hundreds of people, face to face.&lt;br /&gt;&lt;br /&gt;Previous PyCon conferences have had a broad range of presentations, from reports on academic and commercial projects, tutorials on a broad range of subjects and case studies. All conference speakers are volunteers and come from a myriad of backgrounds. Some are new speakers, some are old speakers. Everyone is welcome so bring your passion and your code! We’re looking to you to help us top the previous years of success PyCon has had.&lt;br /&gt;&lt;br /&gt;PyCon 2010 is looking for proposals to fill the formal presentation tracks.  The PyCon conference days will be February 19-22, 2010 in Atlanta, Georgia, preceded by the tutorial days (February 17-18), and followed by four days of development sprints (February 22-25).&lt;br /&gt;&lt;br /&gt;Online proposal submission is open now! Proposals will be accepted through October 1st, with acceptance notifications coming out on November 15th. For the detailed call for proposals, please see:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://us.pycon.org/2010/conference/proposals/"&gt;http://us.pycon.org/2010/conference/proposals/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For videos of talks from previous years – check out:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pycon.blip.tv"&gt;http://pycon.blip.tv&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We look forward to seeing you in Atlanta!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-1203966398207791005?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/1203966398207791005/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=1203966398207791005" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1203966398207791005" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1203966398207791005" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/pycon-2010-call-for-proposals.html" title="PyCon 2010: Call for Proposals" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-1969804732010891995</id><published>2009-08-11T12:27:00.000-07:00</published><updated>2009-08-11T12:40:46.506-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="sqlpython" /><title type="text">BLOBs in sqlpython</title><content type="html">Obviously, you can't query BLOBs in a command-line SQL tool.&lt;br /&gt;&lt;br /&gt;Unless, of course, that tool is &lt;a href="http://pypi.python.org/pypi/sqlpython"&gt;sqlpython&lt;/a&gt;.  Bwa ha ha ha.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HR7nVcfhs_s/SoHI_gavjdI/AAAAAAAAAEQ/g2JRfj8zqNA/s1600-h/Screenshot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://1.bp.blogspot.com/_HR7nVcfhs_s/SoHI_gavjdI/AAAAAAAAAEQ/g2JRfj8zqNA/s400/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368793224161758674" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-1969804732010891995?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/1969804732010891995/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=1969804732010891995" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1969804732010891995" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1969804732010891995" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/blobs-in-sqlpython.html" title="BLOBs in sqlpython" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_HR7nVcfhs_s/SoHI_gavjdI/AAAAAAAAAEQ/g2JRfj8zqNA/s72-c/Screenshot.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-8792871705199232499</id><published>2009-08-11T10:10:00.000-07:00</published><updated>2009-08-11T10:45:58.640-07:00</updated><title type="text">reStructuredText talk at OLF</title><content type="html">It's official - I'm on the schedule!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ohiolinux.org/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 151px; height: 98px;" src="http://www.ohiolinux.org/files/images/151x49.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div id="hcalendar-reStructuredText:-Plain-Text-Gets-Superpowers" class="vevent"&gt;&lt;br /&gt;&lt;a href="http://www.ohiolinux.org/talks.html#TEXT" class="url summary"&gt;reStructuredText: Plain Text Gets Superpowers&lt;/a&gt;&lt;br /&gt;&lt;abbr title="2009-09-26T17:00-04:0000" class="dtstart"&gt;September 26, 2009, 5&lt;/abbr&gt; - &lt;abbr title="2009-09-26T18:00-04:00" class="dtend"&gt;6pm&lt;/abbr&gt;&lt;br /&gt;at &lt;a href="http://www.ohiolinux.org/"&gt;Ohio LinuxFest&lt;/a&gt;&lt;br /&gt;&lt;div id="hcard-Greater-Columbus-Convention-Center" class="vcard location"&gt;&lt;br /&gt;  &lt;a class="url fn n" href="http://www.columbusconventions.com/"&gt;Greater Columbus Convention Center&lt;/a&gt;  &lt;div class="adr"&gt;    &lt;div class="street-address"&gt;400 North High Street&lt;/div&gt;    &lt;span class="locality"&gt;Columbus&lt;/span&gt;, &lt;span class="region"&gt;OH&lt;/span&gt; &lt;span class="postal-code"&gt;43215&lt;/span&gt; &lt;span class="country-name"&gt;USA&lt;/span&gt;  &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="description"&gt;Introduction to reStructuredText, a simple single-source format that can generate documents in HTML, PDF, .odt, and many other formats.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;I also see tasty-looking talks on "Python for Linux System Administration", a "Sysadmins' Rosetta Stone" talk that should help me port my Ubuntu skills to Red Hat, and gobs more - plus the Diversity in Open Source workshop.  This will be a great year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-8792871705199232499?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/8792871705199232499/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=8792871705199232499" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/8792871705199232499" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/8792871705199232499" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/restructuredtext-talk-at-olf.html" title="reStructuredText talk at OLF" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-3411929164831267033</id><published>2009-08-11T07:31:00.000-07:00</published><updated>2009-08-11T07:52:24.557-07:00</updated><title type="text">Spend Like a Pirate Day</title><content type="html">Why do we Americans continue to carry around drab $1 bills, struggling to cram mushy, wrinkled paper into vending machine readers, when we could carry gleaming, clinking, golden doubloons?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.usmint.gov/images/mint_programs/firstSpouse/AbigailAdamsObv.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://www.usmint.gov/images/mint_programs/firstSpouse/AbigailAdamsObv.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Admire the gleam and the weight.  This is the proper sensory experience for money!&lt;br /&gt;&lt;br /&gt;I just found out &lt;a href="http://www.usmint.gov/mint_programs/$1coin/?action=directShip"&gt;you can buy boxes of 250 coins directly from the mint&lt;/a&gt;.  Granted, there's $5 shipping, so you're paying $255 to get $250, but your credit card kickback should cover that.  Then you can eschew that lame ATM for months!  Let's face it, you only use cash for little purchases these days anyway.  Make every cash transaction enjoyable!&lt;br /&gt;&lt;br /&gt;When you receive your coins, feel free to run your hands through them several times, purring, "Arrrrrr!  Thar's treasure for ye, me mateys!"  Do &lt;span style="font-weight:bold;"&gt;NOT&lt;/span&gt;, however, bury them in a sturdy wooden chest and draw a map with a dotted line and an X.  I know it's tempting!  I want to do it, too!  But the point is to get more of these beauties into circulation.&lt;br /&gt;&lt;br /&gt;Arrrrrr!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-3411929164831267033?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/3411929164831267033/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=3411929164831267033" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/3411929164831267033" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/3411929164831267033" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/spend-like-pirate-day.html" title="Spend Like a Pirate Day" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-6003702903652314483</id><published>2009-08-10T14:03:00.001-07:00</published><updated>2009-08-10T14:23:09.934-07:00</updated><title type="text">workaround: easy_install windows vanish</title><content type="html">My employer-mandated Vista machine has gone almost unused for months because of an infuriating quirk in Vista's command-prompt operation.  I've come as close to completely forgetting how to use Windows as I've ever been.  Giles Thomas (of &lt;a href="http://www.resolversystems.com/"&gt;Resolver Systems&lt;/a&gt;) saved me.&lt;br /&gt;&lt;br /&gt;The problem: Vista runs programs like easy_install in a new cmd window, separate from the one they were invoked in.  The instant the program terminates, the new window is closed, and any messages it returned - like error messages - are lost.  No, redirecting the messages with &gt; and 2&gt; does not work.  &lt;span style="font-style:italic;"&gt;"Why would you want to see error messages, anyway?  They're so geeky and depressing!"  *gum snap*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thus, I was unable to install cx_Oracle, and had to turn to my trusty Ubuntu machine for absolutely every pyOraGeekish task.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gilesthomas.com/?p=51"&gt;Giles blogged a lifesaver workaround&lt;/a&gt;.  If you can run the cmd window as Administrator in the first place, you are entrusted with the awesome power and responsibility of being allowed to view your own error messages.&lt;br /&gt;&lt;br /&gt;So, now I can blow the dust off my Vista machine.  Wow, controlling the font size of a cmd window is absolutely as primitive as it was in Windows 3.1.  Giles, got a workaround for this, too?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-6003702903652314483?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/6003702903652314483/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=6003702903652314483" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6003702903652314483" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6003702903652314483" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/workaround-easyinstall-windows-vanish.html" title="workaround: easy_install windows vanish" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-7554462012284871977</id><published>2009-08-04T15:06:00.000-07:00</published><updated>2009-08-04T15:13:31.365-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title type="text">Oracle at Ohio LinuxFest</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ohiolinux.org/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 143px;" src="http://www.ohiolinux.org/files/images/iamgoing.png" border="0" alt="I'm going to Ohio LinuxFest 2009" /&gt;&lt;/a&gt;&lt;br /&gt;It's not official yet - so you can't find it at the &lt;a href="http://ohiolinux.org/"&gt;Ohio LinuxFest website&lt;/a&gt; - but it looks like Oracle will be a sponsor and exhibitor this year.  They're planning to do an Oracle-on-Linux installfest.  If you'd like to get your first taste of Oracle on Linux, sign up for LinuxFest (it's free) and prepare to have a blast.&lt;br /&gt;&lt;br /&gt;If you're already pretty good at Oracle-on-Linux and would like to help others get started, &lt;a href="mailto:sam18xgy4fz@liquidid.net"&gt;send me email&lt;/a&gt;!  I hope to gather a small group of volunteers to help out at the installfest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-7554462012284871977?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/7554462012284871977/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=7554462012284871977" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7554462012284871977" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7554462012284871977" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/oracle-at-ohio-linuxfest.html" title="Oracle at Ohio LinuxFest" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-3711736633417106400</id><published>2009-08-04T07:41:00.000-07:00</published><updated>2009-08-04T07:55:46.709-07:00</updated><title type="text">bug reports from the public</title><content type="html">From &lt;a href="http://en.wikipedia.org/wiki/Smith_&amp;_Dale#Early_life_and_work"&gt;"Dr. Kronkheit and His Only Living Patient"&lt;/a&gt;:&lt;blockquote&gt;SMITH: Doctor, it hurts when I do this.&lt;br /&gt;DALE: Don't do that.&lt;/blockquote&gt;Dear &lt;a href="http://www.enterprise.com/" rel="nofollow"&gt;Enterprise Rent-A-Car&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;That was called a "bug report".  It was not actually a request for a condescending message about how I can still rent a car by navigating the website in a different way.  I knew that.  &lt;br /&gt;&lt;br /&gt;I took the time to write up detailed instructions for reproducing the bug as a professional courtesy to your developers.  Unfortunately, they will never see my message, since your customer service is managed strictly from a "deal with nuisance customers" point of view.  Looks like I wasted a couple seconds of your time as well as several minutes of my own.&lt;br /&gt;&lt;br /&gt;RESOLVED: If I ever work on a project large enough to have a customer service department separate from development, I will insist upon bridging this gap.  I will make sure customer service has the access, knowledge, and encouragement to communicate constantly with me.  I will regard customer service as a valuable conduit for end-user feedback rather than a distant, uninteresting group of non-colleagues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-3711736633417106400?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/3711736633417106400/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=3711736633417106400" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/3711736633417106400" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/3711736633417106400" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/bug-reports-from-public.html" title="bug reports from the public" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-6803550807107306175</id><published>2009-08-04T04:35:00.000-07:00</published><updated>2009-08-04T13:23:42.072-07:00</updated><title type="text">logging is ugly</title><content type="html">Instrumenting your code - whether with a PL/SQL package like &lt;a href="http://www.toadworld.com/Experts/StevenFeuersteinsPLSQLObsession/MyPetProjectsandContributions/QuestErrorManagerQEM/tabid/210/Default.aspx"&gt;Quest Error Manager&lt;/a&gt; as Steven Feuerstein suggests, &lt;a href="http://docs.python.org/library/logging.html#module-logging"&gt;Python's logging module&lt;/a&gt;, or whatever - is an important part of writing good code.&lt;br /&gt;&lt;br /&gt;I don't.  Not very often, anyway.  When I do, I often delete the logging calls as soon as the code is more or less working.  The biggest reason is the ugliness.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;def days_ago (ndays):&lt;br /&gt;    logging.info('days_ago called with arg %s' % str(ndays))&lt;br /&gt;    logging.info('arg type %s' % type(ndays))&lt;br /&gt;    try:&lt;br /&gt;        ndays = int(ndays)&lt;br /&gt;        logging.info('argument converted to integer %d' % ndays)&lt;br /&gt;        current_date = datetime.datetime.now()&lt;br /&gt;        logging.info('current date is %s' % str(current_date))&lt;br /&gt;        result = current_date - datetime.timedelta(ndays)&lt;br /&gt;    except ValueError, e:&lt;br /&gt;        logging.error('Error converting ndays to integer:')&lt;br /&gt;        logging.error(str(e))&lt;br /&gt;        result = None&lt;br /&gt;    logging.info('returning from days_ago: %s' % str(result))&lt;br /&gt;    return result&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;EWWWWWW!  That is &lt;span style="font-weight:bold;"&gt;ugly&lt;/span&gt;!  It completely disrupts the comfortable reading of the code.  It buries the actual purpose and actions of the function under a steaming heap of chatter.  It offends everything that I value in beauty and readability.  What to do?&lt;br /&gt;&lt;br /&gt;One solution might be a code editor that would toggle the visibility of all logging calls in a program.  You could leave them invisible most of the time, and only look at the logging statements when you have a specific reason to.  I can see two problems with that, though.&lt;ul&gt;&lt;li&gt;The logging calls themselves could get out of synch with the functioning code.  This could be partially addressed by having logging calls become visible automatically whenever code adjacent to them is changed.&lt;/li&gt;&lt;li&gt;This would create code which is readable and beautiful in my editor, but ugly when somebody else tries to read it.  Perhaps if we cooked up a convention whereby a header comment could define the suggested hiding of logging calls for each program, and most editors could be trained to recognize and respect these suggestions?&lt;/li&gt;&lt;/ul&gt;I don't have the answer for this.  I'd love to hear ideas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;EDIT&lt;/span&gt;: &lt;a href="http://blog.extracheese.org/"&gt;Gary Bernhardt&lt;/a&gt; tweets, "Anything that you want your editor to to be able to hide (comments, setters/getters, logging) shouldn't exist".  &lt;br /&gt;&lt;br /&gt;An interesting idea... how to eliminate logging?  A good logging decorator could log arguments, return values, and error messages to any decorated function - and that level of information could suffice, if the functions are very fine-grained.  Having to write fine-grained functions is the sort of constraint that might improve programming style, too, much the way unit testing demands well-defined functions.  I think I'll try this philosophy and see if I can make it work. &lt;br /&gt;&lt;br /&gt;It's not much help for the PL/SQL side of things, though.  I'm trying to imagine if there's some way to make an analog to Python's decorators in PL/SQL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-6803550807107306175?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/6803550807107306175/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=6803550807107306175" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6803550807107306175" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6803550807107306175" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/08/logging-is-ugly.html" title="logging is ugly" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-2204117308578388873</id><published>2009-07-28T11:58:00.000-07:00</published><updated>2009-07-28T12:05:09.933-07:00</updated><title type="text">Database comics</title><content type="html">Clearly, it's somebody's responsibility to create a Hall of Fame for database-related comic strips.  I may as well start gethering them here.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/exploits_of_a_mom.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; " src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png" border="0" alt="xkcd comic: Exploits of a Mom" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://browsertoolkit.com/fault-tolerance.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; " src="http://browsertoolkit.com/fault-tolerance.png" border="0" alt="Fault-tolerance comic on key-value stores" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What else is out there?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-2204117308578388873?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/2204117308578388873/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=2204117308578388873" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/2204117308578388873" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/2204117308578388873" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/07/database-comics.html" title="Database comics" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-8557784824493373533</id><published>2009-07-26T19:14:00.000-07:00</published><updated>2009-08-10T03:02:46.881-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pyohio" /><category scheme="http://www.blogger.com/atom/ns#" term="pyohio python conference ohio" /><title type="text">now that's agile</title><content type="html">My favorite anecdote from PyOhio 2009:&lt;br /&gt;&lt;a href="http://www.linkedin.com/in/williammcvey"&gt;&lt;br /&gt;William McVey&lt;/a&gt; prepared slides for his Sunday PyOhio presentation using reStructuredText and rst2s5, but he wasn't satisfied with S5's presentation quality.  He tried rst2odp to generate an OpenOffice Impress document instead, but it failed him.&lt;br /&gt;&lt;br /&gt;So he convened a Saturday night sprint on rst2odp at PyOhio.  Working past midnight, a small team fixed the rst2odp flaws.  William regenerated his slides and presented successfully on Sunday.&lt;br /&gt;&lt;br /&gt;Finally, in a mighty feat of recursion, he described the feat in a lightning talk Sunday evening, using slides generated by rst2odp, including a slide that contained the source code of the lightning talk he was giving, including the slide with the source code...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-8557784824493373533?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/8557784824493373533/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=8557784824493373533" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/8557784824493373533" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/8557784824493373533" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/07/now-thats-agile.html" title="now that's agile" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-544942399630086473</id><published>2009-07-26T07:19:00.000-07:00</published><updated>2009-07-26T07:23:32.345-07:00</updated><title type="text">Oracle - Linux - Python tutorial slides (PyOhio)</title><content type="html">Todd Trichler from OTN is beginning his half of our presentation while I post... my half's materials are &lt;a href="http://catherinedevlin.pythoneers.com/pyora_tutorial.tar.gz"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-544942399630086473?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/544942399630086473/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=544942399630086473" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/544942399630086473" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/544942399630086473" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/07/oracle-linux-python-tutorial-slides.html" title="Oracle - Linux - Python tutorial slides (PyOhio)" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-7316972539313500681</id><published>2009-07-23T14:27:00.000-07:00</published><updated>2009-08-10T06:47:00.005-07:00</updated><title type="text">doubleplus PyOhio</title><content type="html">&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; 2009 &gt; (2 * 2008)&lt;br /&gt;True&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;PyOhio 2008 had 93 registrants.  &lt;a href="http://www.pyohio.org/"&gt;PyOhio 2009&lt;/a&gt; has more than doubled that number already.  Hooray!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-7316972539313500681?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/7316972539313500681/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=7316972539313500681" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7316972539313500681" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/7316972539313500681" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/07/doubleplus-pyohio.html" title="doubleplus PyOhio" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-546436867588040845</id><published>2009-07-02T13:34:00.000-07:00</published><updated>2009-07-02T14:09:28.955-07:00</updated><title type="text">PyOhio registration, schedule, sponsors...</title><content type="html">Things are really coming together!&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://pyohio.org"&gt;&lt;img src="http://66.35.48.8/catherine/blogbadge.png" alt="PyOhio" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PyOhio registration is open.  38 people have signed up in just over a day!&lt;/li&gt;&lt;li&gt;The talk schedule is up.  25 talks, my goodness.&lt;/li&gt;&lt;li&gt;Oracle Technology Network and Intellovations have stepped forward as sponsors.&lt;/li&gt;&lt;li&gt;Oracle is also sending Todd Trichler to cooperate with me on a two-hour tutorial on Oracle/Python/Linux.  I'm enjoying the preparations so far - I think you'll like it if you have any interest in databases.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-546436867588040845?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/546436867588040845/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=546436867588040845" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/546436867588040845" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/546436867588040845" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/07/pyohio-registration-schedule-sponsors.html" title="PyOhio registration, schedule, sponsors..." /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-6364275055431209314</id><published>2009-06-24T14:19:00.000-07:00</published><updated>2009-06-25T09:38:06.339-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title type="text">don't need no stinking rules engine</title><content type="html">There's a whole class of programs called &amp;quot;rules engines&amp;quot;.  The idea is to remove the details of a process from the hard-code of the program, store them externally, and view/modify them easily.  The engine then converts the rules, stored in some sort of custom format, back into an executable form at runtime.
&lt;br /&gt;
&lt;br /&gt;In my experience, Python &lt;em&gt;is&lt;/em&gt; an effective rule engine.  Thanks to Python's readability, you can store business rules as snippets of Python code - in textfiles, a database table, or wherever you prefer - and business users should be able to read them comfortably.  After that, a very lightweight Python program can load the rules and the relevant data and use &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;exec()&lt;/span&gt;&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eval()&lt;/span&gt;&lt;/tt&gt; to apply the rules to it.
&lt;br /&gt;
&lt;br /&gt;One of my main projects is an example of this.  It's program that synchronizes data between two Oracle databases.  That sounds easy, but business details complicate it enormously:&lt;ul class="simple"&gt;
&lt;br /&gt;&lt;li&gt;Table and column naming, structure, and normalization differ&lt;/li&gt;&lt;li&gt;Only some rows are transferred, according to a complex set of business rules&lt;/li&gt;&lt;li&gt;Only some columns are transferred.  Column values are combined, split, truncated, have functions applied, etc.  Again, governed by a jungle of business rules&lt;/li&gt;&lt;li&gt;The business rules change continually&lt;/li&lt;li&gt;Rules must be documented.  Letting documentation get out of synch with implemented rules is very bad.&lt;/li&gt;&lt;li&gt;Users may demand explanations for each decision made by the program, down to the row and column level&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;My first take on the problem was a large hard-coded PL/SQL procedure.  What a nightmare!
&lt;br /&gt;
&lt;br /&gt;Later, I rewrote the rules as snippets of Python.  Each rule is stored a database table along with the dates it takes effect and expires, the person authorizing the rule, and a justification.  This readable, self-documenting set of rules can also answer questions like, &amp;quot;Why did things change since last month?&amp;quot;.
&lt;br /&gt;
&lt;br /&gt;Unfortunately, I didn't know much about object-relational mappers when I wrote it, so the program has clunky data-fetching code.  I'm currently working on a third version of the program that uses SQLAlchemy; the resulting program is &lt;em&gt;very&lt;/em&gt; short.  Broadly, here's what it does:
&lt;br /&gt;
&lt;br /&gt;- Queries the row-level and column-level rules from their respective tables
&lt;br /&gt;
&lt;br /&gt;- Fetches a row from the local database (&lt;cite&gt;ours&lt;/cite&gt;) and the corresponding row from the remote database (&lt;cite&gt;theirs&lt;/cite&gt;)
&lt;br /&gt;
&lt;br /&gt;- The heart of the engine:
&lt;br /&gt;&lt;pre&gt;
&lt;br /&gt;data = {'ours': ours, 'theirs': theirs}
&lt;br /&gt;for row_rule in row_rules:
&lt;br /&gt;    if not eval(row_rule, data):
&lt;br /&gt;        return
&lt;br /&gt;for column_rule in column_rules:
&lt;br /&gt;    exec(column_rule, data)
&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;Actually, the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;data&lt;/span&gt;&lt;/tt&gt; dict also includes definitions of a few functions that some of the rules invoke.  The function names are chosen to be self-explanatory to business users.  For example:
&lt;br /&gt;&lt;pre class="literal-block"&gt;
&lt;br /&gt;def fiscalYear(inDate):
&lt;br /&gt;    if inDate.month &amp;gt; 9:
&lt;br /&gt;        result = inDate.year + 1
&lt;br /&gt;    else:
&lt;br /&gt;        result = inDate.year
&lt;br /&gt;    return result
&lt;br /&gt;
&lt;br /&gt;data = {'ours': ours, 'theirs': theirs, 'fiscalYear': fiscalYear}
&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;I suppose it wouldn't be too hard to put the function definitions themselves in among the rules, then include &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;locals()&lt;/span&gt;&lt;/tt&gt; in with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;data&lt;/span&gt;&lt;/tt&gt;, as long as execution order is controlled (easily done by putting execution_order columns in the rules tables).  It hasn't been necessary for my project.
&lt;br /&gt;
&lt;br /&gt;- Now &lt;var&gt;row_rules&lt;/var&gt; has &lt;var&gt;eval()&lt;/var&gt;-able entries like::&lt;pre&gt;
&lt;br /&gt;  id  start   end     code                      authorized   reason
&lt;br /&gt;   1  1/1/06  7/1/09  ours.funded == "Y"        Bob          I said so
&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;and &lt;var&gt;column_rules&lt;/var&gt; has &lt;var&gt;exec()&lt;/var&gt;-able entries like::&lt;pre&gt;
&lt;br /&gt;  id  start   end     code                           authorized   reason
&lt;br /&gt;   1  2/2/08          if (ours.value &gt; 1000):        Steve        to annoy Bob
&lt;br /&gt;                          theirs.value = ours.value
&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;- Add some logging and a &amp;quot;test-run&amp;quot; capacity which reports on the changes without actually performing them.  (It uses &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;sqlalchemy.orm.attributes.get_history()&lt;/span&gt;&lt;/tt&gt; for this; make sure to set &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;autoflush=False&lt;/span&gt;&lt;/tt&gt; if you use this, or intermediate flushes might clear the history.)
&lt;br /&gt;
&lt;br /&gt;I suppose I could try writing a sample rules-engine implementation in simple, general terms, that people could crib from for their own &amp;quot;rules engine&amp;quot; applications.  I wonder if that would be helpful, or if just the general idea is enough guidance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-6364275055431209314?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/6364275055431209314/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=6364275055431209314" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6364275055431209314" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/6364275055431209314" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/06/dont-need-no-stinking-rules-engine.html" title="don't need no stinking rules engine" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-553035376723864323</id><published>2009-06-19T06:35:00.000-07:00</published><updated>2009-06-19T07:08:57.637-07:00</updated><title type="text">Python for Secretaries</title><content type="html">As if I need a new ambition, I've got an itch to create and teach a course called "Computer Programming for Secretaries".  Since I got into IT via the secretarial pool, I think I'm the perfect one to do it.&lt;br /&gt;&lt;br /&gt;To outsiders, programming has this horribly intimidating aura.  You've got enterprisey Software Architects trying to sound professional, academic Computer Scientists telling you that you're oversimplifying the problem, fearsome Hacker Gods strutting their skillz.  Lots of people want to make sure you know how smart they are, and that nothing could happen without their planet-sized brains.&lt;br /&gt;&lt;br /&gt;but &lt;span style="font-weight:bold;"&gt;programming is not rocket science&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you want to launch satellites into space, you need to invest your life in the field and be part of a large, well-funded institution.  Yes, you can have lots of fun with model rocketry, but you're just playing.  You're not actually going to get anything into orbit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;programming is more like cooking&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My friend James is a professional chef.  Everything he makes involves a bunch of French words, ingredients I've never heard of, and turns out eyes-roll-back delicious.  I don't have the ambition to invest the time and effort to cook that well... &lt;span style="font-style:italic;"&gt;but I can still roast a turkey&lt;/span&gt;.  That's what programming is like, especially dynamic language programming.  With a lot of skill, you can work miracles - but with a little skill, you can work little miracles.  You don't need to go in for the whole hog.&lt;br /&gt;&lt;br /&gt;That's what I'd like a class to address.  There are programming books aimed at kids, but none that I know of aimed at adult business users.  There are people who could write themselves small, useful programs, but who will flee in well-justified terror if you start talking about overriding import hooks.  There are people spending hours cutting-and-pasting from one file to another because they don't know how to write a six-line script.  There are people could replace some of their daily tedium with just a little dose of Python.  There is Resolver One, which is a fantastic way to integrate tiny dashes of Python with everyday spreadsheet work, but it's being used by thousands instead of by millions.&lt;br /&gt;&lt;br /&gt;So... yeah.  What should such a class include?  More importantly, once I'm ready to teach such a class, where do I teach it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-553035376723864323?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/553035376723864323/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=553035376723864323" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/553035376723864323" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/553035376723864323" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/06/python-for-secretaries.html" title="Python for Secretaries" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-1207650926204333252</id><published>2009-06-15T07:56:00.000-07:00</published><updated>2009-06-15T08:12:11.114-07:00</updated><title type="text">how to tell a geek</title><content type="html">Given a choice between spending an hour doing a task manually, or spending three hours writing a program to do it automatically... a geek will write the program, &lt;span style="font-style:italic;"&gt;every single time&lt;/span&gt;.  And, if not given the choice, if explicitly ordered to do the job manually, we'll disobey and write the program anyway.  I've heard it said that a good geek is lazy, but I think it's more precise to say that a geek dreads &lt;span style="font-style:italic;"&gt;boredom&lt;/span&gt; above all else.  We'll move mountains to accomplish a task, as long as it's interesting.&lt;br /&gt;&lt;br /&gt;This is not nearly as crazy as it sounds, because after we've "finished" a task, without fail, the requestor will return and say, "I know I said that would just be a one-time change, but...", or, "Actually, it turns out we don't need A B C D, we need A B Q D C", or whatever.  You &lt;span style="font-style:italic;"&gt;will&lt;/span&gt; reuse that program, no matter what they say; never throw it away!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-1207650926204333252?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/1207650926204333252/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=1207650926204333252" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1207650926204333252" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/1207650926204333252" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/06/how-to-tell-geek.html" title="how to tell a geek" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11802292.post-4487005247595426371</id><published>2009-06-09T13:31:00.000-07:00</published><updated>2009-06-09T14:02:44.106-07:00</updated><title type="text">NCR</title><content type="html">Pardon, oh Citizens of the World who read this, while I go regional for a moment and speak as a Dayton-area resident on news almost certainly irrelevant to you.&lt;br /&gt;&lt;br /&gt;The big news here last week was NCR's decision to leave Dayton.  Basically, three reasons have been given:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.daytondailynews.com/business/ncrs-blunt-words-add-urgency-to-concerns-151458.html"&gt;"the high availability of a skilled work force"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;More direct international flights from Atlanta than from Dayton&lt;/li&gt;&lt;li&gt;$60 to $80 million in incentives from Georgia&lt;/li&gt;&lt;/ul&gt;The funny thing about the first reason is... &lt;span style="font-style:italic;"&gt;NCR doesn't hire people&lt;/span&gt;.  (Their manufacturing plants may hire, but I'm speaking of their HQ here in Dayton).  Since I came to the Dayton area, I've had IT friends in NCR and have tried to keep up with them.  The news from them has always been the same: "We just went through another round of downsizing.  We keep wondering when our turn will come."  For a company in continual contraction, the benefit of a larger pool of people to not hire seems... um, not clear.&lt;br /&gt;&lt;br /&gt;That leaves shorter plane flights for those who fly to Europe - seems a strange reason to move 1,300 people - and a large amount of cash.  Many people think Ohio should have tried to outbid Georgia, but that would have to come at the expense of companies that &lt;span style="font-style:italic;"&gt;don't&lt;/span&gt; threaten relocation - and it begins to blur the line between "private company" and "state-funded entity", anyway.&lt;br /&gt;&lt;br /&gt;Moving itself, of course, gets rid of those employees who choose not to relocate.  I predict that most Ohioans who choose not to move with NCR will not be replaced; the company will use the natural contraction in place of one of its periodic downsizings.&lt;br /&gt;&lt;br /&gt;Anyway, it's sad for Dayton, since the company had such a history here, but that's pretty much what NCR has been about here for years - history.  For decades now, growth for Dayton - as for most cities - hasn't come from big, stable, traditional companies but from small companies, appearing and disappearing quickly as new opportunities appear and change and dry up.  It's a less predictable business world, but that's the century we're in.  No amount of sighing will prolong the 20th century&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11802292-4487005247595426371?l=catherinedevlin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://catherinedevlin.blogspot.com/feeds/4487005247595426371/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11802292&amp;postID=4487005247595426371" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/4487005247595426371" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11802292/posts/default/4487005247595426371" /><link rel="alternate" type="text/html" href="http://catherinedevlin.blogspot.com/2009/06/ncr.html" title="NCR" /><author><name>Catherine</name><uri>http://www.blogger.com/profile/12229578427522022392</uri><email>sam18xgy4fz@liquidid.net</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="14833827471004419423" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry></feed>
