<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:kurtmckee</id>
  <title>Kurt McKee</title>
  <subtitle>Kurt McKee</subtitle>
  <author>
    <email>contactme@kurtmckee.org</email>
    <name>Kurt McKee</name>
  </author>
  <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom"/>
  <updated>2013-04-09T05:34:35Z</updated>
  <lj:journal userid="7639322" username="kurtmckee" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://kurtmckee.livejournal.com/data/atom" title="Kurt McKee"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:45844</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/45844.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=45844"/>
    <title>And after four days</title>
    <published>2013-04-09T05:32:59Z</published>
    <updated>2013-04-09T05:34:35Z</updated>
    <category term="work"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;And after four business days we're back in extended hours. At least I got a two-day weekend out of it. I didn't even make it into the building before I found out. I am absolutely exhausted and uninspired.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:45738</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/45738.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=45738"/>
    <title>April didn't come soon enough</title>
    <published>2013-04-01T23:22:28Z</published>
    <updated>2013-04-01T23:22:59Z</updated>
    <category term="work"/>
    <category term="programming"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;Man alive, I've been working 12-hour days, seven days a week, for almost the entirety of March. It has been grueling. During this time I gained 10 pounds due to atrocious eating habits (like eating right before bed at 3:00am), my voice has become damaged thanks to stress- and diet-related acid reflux, and I've started waking up with caffeine deprivation headaches.&lt;/p&gt;

&lt;p&gt;It all culminated in a very successful quarter-end, though. I got off work at 4:35am on Easter morning, slept for a bit, then went back for another 12 hours. When I got home this morning and checked my mailbox I realized that the stars were beginning to align for me: a Victoria's Secret swimsuit catalog had been mis-delivered to me. Ha!&lt;/p&gt;

&lt;p&gt;Google has announced that they're shutting down their Reader service, so I'm excited to coincidentally have free time open up to improve feedparser. It's been a while since I've had time to solve complex problems, so I'm looking forward to relaxing with a hobby I enjoy. Stay tuned for another post in which I'll summarize the state of feedparser and what I'm planning to work on this year!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:45426</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/45426.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=45426"/>
    <title>In Europe, day 4</title>
    <published>2013-02-06T23:24:16Z</published>
    <updated>2013-02-08T16:05:30Z</updated>
    <category term="travel"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;Although my days have been largely consumed by meetings and discussions I've been finding time to enjoy Zaltbommel and its many restaurants.&lt;/p&gt;

&lt;p&gt;Yesterday for dinner I had duck liver, quail, candied apple, pork and mashed potatoes, crème brûlée, wine, and a delicious Trappist beer named Dubbel at a wonderful restaurant in Rossum named De Gouden Molen (the Golden Windmill, I'm told). The night before that I had a Greek meal consisting of souvlaki, suzuki, fried potatoes, tzatziki, and vegetables. The beer of the evening was called Bavaria and was outstanding.&lt;/p&gt;

&lt;p&gt;Tonight, however, my coworker and I were exhausted so we had a simple meal: McDonald's. Damn, baby, the Dutch have better french fries than we do, even at McDonald's! And the vegetables on my Chicken Sensation were fresh and delish! I've spent the evening relaxing and emailing while watching 28 Dresses and, now, the first Star Trek movie. It's airing on RTL7 (&lt;em&gt;meer voor mannen&lt;/em&gt;). Even their Captain Morgan commercials are better than ours!&lt;/p&gt;

&lt;p&gt;There's just one thing I need in this world: French vanilla coffee creamer. Everyone here laughs at me, even at the grocery store! &lt;q&gt;&lt;em&gt;Koffie met vanille&lt;/em&gt;?!&lt;/q&gt; marveled the clerk. Heaven help me, YES! All of the coffee here is unpotable? C'MON!&lt;/p&gt;

&lt;p&gt;Anyway, now it's bedtime. I've got a big day of trainings and meetings tomorrow, and then I'm hoping to head into Den Bosch by train for dinner and to find a music store...&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:45293</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/45293.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=45293"/>
    <title>In Europe, day 1</title>
    <published>2013-02-03T20:40:48Z</published>
    <updated>2013-02-03T20:40:48Z</updated>
    <category term="travel"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;I don't expect that I'll liveblog my trip to Europe, but I did have a great first day and I wanted to let everyone know that I made it safely.&lt;/p&gt;

&lt;p&gt;My coworker and I arrived in Amsterdam at 7:30am, and we quickly got the rental car and headed to our hotel to check in and get some breakfast. We headed into Zaltbommel for lunch and ate at a place that appeared to be named, simply, "Restaurant". I had a cold-smoked salmon sandwich on pita bread that was unlike anything I'd ever had before. The pretty English-speaking waitress brought it to me while people's pet dogs wandered around the area and children played at the bar.&lt;/p&gt;

&lt;p&gt;After a short nap I met up with my coworker at the hotel bar; he had struck up a conversation with a man who was from Dallas (small world) and happened to be born a stone's throw from the tiny West Virginian town my coworker was born in (very small world!). The man had already eaten, but he so strongly recommended a restaurant to us for dinner that he decided to lead us there in his own car despite the rain. The restaurant was named "Maxima" and was located on a street corner in Waardenburg. I had swordfish, salmon (or &lt;em&gt;zalm&lt;/em&gt; #omgculturesnob), whole shrimp, and mussels for dinner with a side of the most delicious and least oily french fries I've had in my life.&lt;/p&gt;

&lt;p&gt;And to the true culture snobs, my meal was not the least bit sullied by french fries. As a matter of fact I ordered a Malbec rosé instead of a white wine to go with the seafood, you haters!&lt;/p&gt;

&lt;p&gt;I've taken some pictures, but I'm going to spend some time relaxing and getting ready for bed. I manipulated my sleep schedule to deal with the jet lag, by which I mean that I failed to sleep much the night before the trip or on the plane, so I'm well-exhausted now.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:45048</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/45048.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=45048"/>
    <title>I'll be in the Netherlands</title>
    <published>2013-01-13T23:21:40Z</published>
    <updated>2013-01-24T17:11:20Z</updated>
    <category term="listparser"/>
    <category term="work"/>
    <category term="python"/>
    <category term="feedparser"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;Hey everybody, I'm going to be in Zaltbommel and Waardenburg, Netherlands starting February 4th for two weeks. If anyone would like to get together with me while I'm there, please let me know! I'd be delighted to meet with you, have a drink, and talk about feedparser or Python in general (or anything else for that matter)!&lt;/p&gt;

&lt;p&gt;UPDATE: I'm going to be in Skopje, Macedonia starting February 18th for a week. I'd love to meet with anyone around that area, too!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:44618</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/44618.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=44618"/>
    <title>A learning experience</title>
    <published>2013-01-13T04:23:40Z</published>
    <updated>2013-01-13T04:23:57Z</updated>
    <category term="quote"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;&lt;em&gt;While at a birthday party for a lesbian friend of mine, I was the only straight guest at the party.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Birthday girl&lt;/strong&gt;: &lt;q&gt;We're all doing jello shots!&lt;/q&gt;&lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;I've never done jello shots.&lt;/q&gt;&lt;br /&gt;
&lt;strong&gt;Birthday girl&lt;/strong&gt;: &lt;q&gt;Well you can't use your finger! You have to use your tongue to get all the jello out. It's a competition, so try to keep up.&lt;/q&gt;&lt;br /&gt;
&lt;em&gt;Everyone does the jello shots&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;How's this?&lt;/q&gt;&lt;br /&gt;
&lt;strong&gt;Unknown girl&lt;/strong&gt;: &lt;q&gt;Holy shit, he's like a washing machine!&lt;/q&gt;&lt;br /&gt;
&lt;strong&gt;Birthday girl&lt;/strong&gt;: &lt;q&gt;Seriously?! You beat out all of the lesbians?!&lt;/q&gt;&lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Well sure. I just traced the letters of the alphabet.&lt;/q&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;While relating the story to another friend of mine.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;I felt really proud about that, like I'd achieved something.&lt;/q&gt;&lt;br /&gt;
&lt;strong&gt;Him&lt;/strong&gt;: &lt;q&gt;Yes, you're the King of Lesbians.&lt;/q&gt;
&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:44417</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/44417.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=44417"/>
    <title>Date parsing</title>
    <published>2012-12-17T17:25:45Z</published>
    <updated>2012-12-17T17:25:45Z</updated>
    <category term="listparser"/>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;I have lost patience with the RFC 822 date parsing in both &lt;a href="https://code.google.com/p/feedparser/" rel="nofollow"&gt;feedparser&lt;/a&gt; and &lt;a href="https://github.com/kurtmckee/listparser" rel="nofollow"&gt;listparser&lt;/a&gt;. Back in 2009 when I started writing listparser I decided to use regular expressions to turn RFC 822 date strings into Python &lt;code&gt;datetime&lt;/code&gt; objects. Earlier this year when I discovered that feedparser's RFC 822 parser had copied code from Python's &lt;code&gt;rfc822&lt;/code&gt; module I stripped it out and replaced it with the code I'd written for listparser.&lt;/p&gt;

&lt;p&gt;Over time it's been necessary to tweak the code to support additional variations: extra commas, extra whitespace, swapped days and months, non-standard timezone modifications...so this weekend I decided to look at what the regular expression currently looks like. The result is not pretty:&lt;/p&gt;

&lt;pre&gt;(?:(?P&amp;lt;dayname&amp;gt;mon|tue|wed|thu|fri|sat|sun), )?(?P&amp;lt;day&amp;gt; *\\d{1
,2}) (?P&amp;lt;month&amp;gt;jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec
)(?:[a-z]*,?) (?P&amp;lt;year&amp;gt;(?:\\d{2})?\\d{2})(?: (?P&amp;lt;hour&amp;gt;\\d{2}):
(?P&amp;lt;minute&amp;gt;\\d{2})(?::(?P&amp;lt;second&amp;gt;\\d{2}))? (?:etc/)?(?P&amp;lt;tz&amp;gt;ut|
gmt(?:[+-]\\d{2}:\\d{2})?|[aecmp][sd]?t|[zamny]|[+-]\\d{4}))?&lt;/pre&gt;

&lt;p&gt;What's worse, to support swapped days and months it's necessary to create a second regular expression to match that, too. So I decided to rewrite the code using &lt;code&gt;str.split()&lt;/code&gt; and a couple of dictionaries. I then ran timing tests on the whole affair, and I'm feeling pretty pleased with the results so far, as it just barely edges out the current code. I expect the new parser to land in feedparser after I integrate it into listparser.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:44081</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/44081.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=44081"/>
    <title>listparser 0.17 - "Territory expansion"</title>
    <published>2012-12-16T09:08:55Z</published>
    <updated>2012-12-16T09:08:55Z</updated>
    <category term="listparser"/>
    <content type="html">&lt;p&gt;I'm pleased to announce that listparser 0.17 is available for immediate download! This release features support for Python 2.4 through 3.3, Jython 2.5.2 and 2.5.3, as well as PyPy 1.8.0. The codebase runs on all of these with no modification, and should still also run on IronPython 2.6.2 (although I'm currently not able to test this).&lt;/p&gt;

&lt;p&gt;You can &lt;a href="http://pypi.python.org/pypi/listparser" rel="nofollow"&gt;download a copy from the Python Package Index&lt;/a&gt;, or &lt;a href="https://github.com/kurtmckee/listparser" rel="nofollow"&gt;clone the git repository at GitHub&lt;/a&gt;. Bug reports and pull requests are always accepted at GitHub.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;listparser is a Python library that parses subscription lists (also called reading lists) and returns all of the feeds, subscription lists, and "opportunity" URLs that it finds. It supports OPML, RDF+FOAF, and the iGoogle exported settings format.&lt;/em&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:43918</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/43918.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=43918"/>
    <title>Announcing feedparser 5.1.3</title>
    <published>2012-12-09T21:18:22Z</published>
    <updated>2012-12-09T21:18:22Z</updated>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;Howdy everybody!&lt;/p&gt;

&lt;p&gt;I'm pleased to announce the release of feedparser 5.1.3! This version features a number of crash fixes, minor documentation fixes, and improved date parsing and character encoding handling, You'll also find that two HTML5 element attributes are no longer stripped by the HTML sanitizer. You can grab the latest release from &lt;a href="http://pypi.python.org/pypi/feedparser" rel="nofollow"&gt;PyPI&lt;/a&gt; or from &lt;a href="http://code.google.com/p/feedparser/" rel="nofollow"&gt;Google Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, feedparser is now using a git repository on Google Code, and I keep &lt;a href="https://github.com/kurtmckee/feedparser/" rel="nofollow"&gt;a mirror on github&lt;/a&gt; for those users as well.&lt;/p&gt;

&lt;p&gt;This release contains patches and unit tests from a number of contributors, including Julian Berman, Bernd Schlapsi, Andy Wingo, as well as Google users bendriko and chungwu.&lt;/p&gt;

&lt;p&gt;Stay tuned, because there are some great patches coming in from a number of contributors that will help form the next feature release.&lt;/p&gt;

&lt;p&gt;Kurt&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:43570</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/43570.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=43570"/>
    <title>Getting back into it (part 6)</title>
    <published>2012-11-29T17:12:46Z</published>
    <updated>2012-12-03T05:40:27Z</updated>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;Finally! I discovered what the problem was with Ubuntu and old versions of Python (I had to create symbolic links for &lt;code&gt;libz.so.1&lt;/code&gt; and &lt;code&gt;libreadline.so.5&lt;/code&gt; from &lt;code&gt;/lib/x86_64-linux-gnu&lt;/code&gt; to &lt;code&gt;/lib&lt;/code&gt;). That resolved all of the problems I was experiencing with the older versions' interactive shells. I also re-created the test script that automates feedparser testing across Python 2.4 through 3.3. All that's left is to install coverage and sphinx again.&lt;/p&gt;

&lt;p&gt;I've also made it a goal to work on bug reports almost every morning, so the issue tracker is shrinking back down. I'm abruptly back on 12 hour days at work and my weekend is in jeopardy, so I think I'll push a new release as soon as possible and then begin pulling in new features and making larger changes.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:43375</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/43375.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=43375"/>
    <title>Getting back into it (part 5)</title>
    <published>2012-11-21T17:10:09Z</published>
    <updated>2012-11-21T17:11:06Z</updated>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;A day or two ago I reviewed almost every bug report that's accumulated in the feedparser issue tracker. Several of them I've marked NeedInfo, but almost all of the rest of them are valid and will be addressed.&lt;/p&gt;

&lt;p&gt;I'm expecting that there will be an opportunity to begin fetching and reviewing the git pull requests and miscellaneous patches later this weekend, but first I'm going to spend time with family that have come into town for Thanksgiving.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:43211</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/43211.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=43211"/>
    <title>Getting back into it (part 4)</title>
    <published>2012-11-05T08:02:37Z</published>
    <updated>2012-11-05T08:02:37Z</updated>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;I made time this weekend to continue reading &lt;a href="http://git-scm.com/book" rel="nofollow"&gt;Pro Git&lt;/a&gt;, and I paid special attention to dealing with remote branches. I learned quite a bit, and I think I'm nearly to the point that I can competently deal with the pull requests I've received. I also created a new SSH key so I can push to github again.&lt;/p&gt;

&lt;p&gt;The biggest problem I have right now is that I can't run the unit tests across Python 2.4 through 3.3. I'm going to have to figure out the correct way to handle that, or I'm going to have to recreate the sketchy shell script I used to use...ugh.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:42816</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/42816.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=42816"/>
    <title>Getting back into it (part 3)</title>
    <published>2012-10-27T06:24:09Z</published>
    <updated>2012-11-05T07:53:55Z</updated>
    <category term="automation"/>
    <category term="software"/>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;This post is about software development, but I'm disappointed to say it's not about feedparser or listparser development.&lt;/p&gt;

&lt;p&gt;I'm back to working 14+ hour days, and much of my time has been spent writing automation scripts in a custom scripting language that can be interpreted by &lt;a href="http://ttssh2.sourceforge.jp/" rel="nofollow"&gt;Tera Term&lt;/a&gt;. It has a featureset that makes what I'm doing fairly easy, but it lacks niceties that I'm accustomed to. For instance, everything is global. No, &lt;em&gt;everything&lt;/em&gt;. There is no scope. Loops have &lt;code&gt;break&lt;/code&gt; but not &lt;code&gt;continue&lt;/code&gt;. Subroutines exist but not functions (no arguments, no return values...probably because it has no scope). Nevertheless, I've been able to accomplish a great deal with it.&lt;/p&gt;

&lt;p&gt;Now I'm tackling a new problem: browser automation. I frequently work with HTTP-based interfaces, and it's pretty tedious. At first I thought "I need simplicity. I'll just use &lt;a href="https://addons.mozilla.org/en-us/firefox/addon/imacros-for-firefox/" rel="nofollow"&gt;iMacros&lt;/a&gt;." Then I tried it and slapped myself, because while it seemed very easy to use it couldn't be used as a part of a larger script. So I installed &lt;a href="http://seleniumhq.org/" rel="nofollow"&gt;Selenium&lt;/a&gt;. By the time I left work today I had some promising results, and I expect that I may have a great example by the end of tomorrow.&lt;/p&gt;

&lt;p&gt;The biggest problem for me will be navigating through the stupid web interfaces of third-party vendors. Those guys lurvs their stupid frames, their Internet Explorer-only Javascript, and their Flash-based login screens that look like they're sitting on the edge of still waters that reflect what you're typing. Thank God for search engines, because I would never have overcome the simple issues I ran into today.&lt;/p&gt;

&lt;p&gt;It's made me hungry to get another feedparser release out the door!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:42497</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/42497.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=42497"/>
    <title>Getting back into it (part 2)</title>
    <published>2012-10-16T05:52:52Z</published>
    <updated>2012-11-11T23:53:30Z</updated>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;I was invited to participate in the &lt;a href="http://gpodder.org/" rel="nofollow"&gt;gpodder&lt;/a&gt; hackfest last Saturday by joining the group on IRC. I had a blast talking with the group! In the invitation it was suggested that I could join and talk about my plans for feedparser. I've thought a lot about serious architectural issues, so after discussing it on IRC I wanted to share what I wrote (spelling mistakes have been fixed):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;first, feedparser has a serious design flaw: wellformed feeds are severely punished because the initial design was to use sgmllib. all of the xml parsing is force-fed through the sgml function calls, which doubles the function call count.&lt;/p&gt;

&lt;p&gt;feedparser has a second flaw that's bothered me. it's not modular (avoiding the word plugins throughout this paragraph), so some decisions were made that have created confusing behavior. it will sometimes act like an xml dom parser and collect everything it doesn't recognize into a dict. unfortunately, it doesn't always guess correctly (depending on the presence of element attributes iirc) and i keep getting bug reports about it not handling such-and-such namespace under such-and-such circumstance.&lt;/p&gt;

&lt;p&gt;third, i'm not sold on the beautifulsoup dependency for several reasons. first, i don't think it's worthwhile to parse through html and try to extract vcard or vcalendar information. picking out enclosure information and tag information seems worthwhile, but i think that can be accomplished without beautifulsoup. second, beautifulsoup itself (the 3.2.x version that's supported by feedparser) is a dead end. bs4 might be an upgrade path, but at that point i'm back to "is the return on investment worth it for this dependency?"&lt;/p&gt;

&lt;p&gt;and i should add that another objection to beautifulsoup is the effect it has on performance, which goes right back to "is the potential that someone wants a vcard they can download to their address book worth considering?" i personally don't think so, but i'm open to discussion on the topic.&lt;/p&gt;

&lt;p&gt;fourth, i'd like to support python 3 without 2to3 conversion if possible. i worked on this very intermittently for a few months in a private branch and then lost that work when my hdd died. that was discouraging enough i'd rather get a few wins before i tackle a potential dead end. ;)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;As a direct result of that conversation, I added a one-line patch that fixes a bug introduced by the chardet library. It's a start, and it helped me identify some more issues with my development environment.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:42487</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/42487.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=42487"/>
    <title>Getting back into it (part 1)</title>
    <published>2012-10-09T15:57:39Z</published>
    <updated>2012-10-09T16:00:53Z</updated>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;After losing so, so much in a catastrophic hard drive failure, I've found it difficult to get my development environment back up and running. Time was, I could open a terminal and everything was ready to go: command completion, test suite, every version of Python, BeautifulSoup, lxml, Sphinx...I had everything set up and functional. Now I'm starting from scratch and it's daunting.&lt;/p&gt;

&lt;p&gt;So, to stay focused I'm going to post updates as the recovery progresses. So far I've gotten Python 2.4 through 3.3 installed on Ubuntu and I've installed git. Next up: configuring &lt;a href="http://tox.testrun.org/" rel="nofollow"&gt;tox&lt;/a&gt; to run the unit tests across all of the Python versions instead of writing another convoluted shell script.&lt;/p&gt;

&lt;p&gt;It'd be nice if I could get readline working for Python 2.4 through 2.6. I found out that the lower Python versions didn't have command histories and history searches and blew a gasket. That is unacceptable because I don't rely on &lt;code&gt;print&lt;/code&gt; statements for debugging and instead use &lt;code&gt;pdb&lt;/code&gt; like an adult, so command histories and searches are required. Not a top priority, but still a big deal.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:42166</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/42166.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=42166"/>
    <title>And now I look around</title>
    <published>2012-10-01T19:24:47Z</published>
    <updated>2012-10-01T19:24:47Z</updated>
    <category term="work"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;Work has been very demanding throughout the month of September. The sheer number of hours I worked, especially for the final week, is staggering. On Monday, for instance, I worked from 9:30am to 5:00am the next day (19.5 hours). I continued working 16 hour days throughout the week, and then Saturday I got to work around noon and didn't leave until 9:00am yesterday morning (just under 21 hours total), then I came back to work a few hours later and worked another 12 hours.&lt;/p&gt;

&lt;p&gt;Late this morning I woke up and looked around my apartment at the effect work has had on my life. I see that I've got dirty dishes scattered around my coffee table. The milk carton in my fridge has ballooned as the milk soured. I'll have to wear a dirty uniform to work because I haven't had time to do laundry. And to top it all off I've had a flat tire for the past week.&lt;/p&gt;

&lt;p&gt;This morning when I checked my email I found an email from a developer who's been wanting me to incorporate some patches into feedparser. The developer could not have known about my circumstances, but I did bristle at first when I read "When are you going to review the patches and pull requests?" It's actually something that's weighed on me as the month's gone on, because I've seen emails from Debian, Ubuntu, and Redhat about feedparser -- not to mention several private developers -- and it's been frustrating that I haven't been able to respond to anything as quickly I'd like. I'm determined to get back to feedparser this month!&lt;/p&gt;

&lt;p&gt;But first I need to buy some milk.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:41752</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/41752.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=41752"/>
    <title>Leveling up my tech</title>
    <published>2012-08-12T22:32:21Z</published>
    <updated>2012-08-12T22:32:21Z</updated>
    <category term="technology"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;At the end of June I experienced a catastrophic hard drive failure: I turned on my computer and heard a metallic ping, followed by the gut-wrenching grinding noise of something dragged across the spinning platters. I turned the computer off immediately, but when I booted it back up a few days later the drive was no longer spinning up at all and the BIOS could no longer see it.&lt;/p&gt;

&lt;p&gt;That computer was 10 years old and in need of replacement, so I bought all the parts I needed and put together a new, screaming fast machine. All I can say is 'wow', because YouTube videos no longer play at two frames per second. My biggest problem now -- aside from data loss -- is recovering all of my passwords. (LinkedIn had a security breach a few months ago, which prompted me to change all of my passwords to unique random strings. I didn't update my backups, so it's going to be a long road to reset all of those stupid passwords.)&lt;/p&gt;

&lt;p&gt;I'm also pleased that I finally took the time to fix my mouse, which had been suffering &lt;a href="https://en.wikipedia.org/w/index.php?title=Switch&amp;amp;oldid=506891872#Contact_bounce" rel="nofollow"&gt;click bounce problems&lt;/a&gt; (it was detecting spurious clicks, so a single click might be detected as a double- or triple-click, and drag-and-dropping was an impossibility). The mouse now behaves perfectly, thanks to &lt;a href="http://www.uniquestuff.net/fixing_mouse_double_clicking_on_single_click.html" rel="nofollow"&gt;a helpful-but-sketchy-looking website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, I found an HP Photosmart C4250 out by the dumpster with all of the cables included. I brought it in, turned it on, saw an error in Korean, reset the language to English, and discovered that there were refilled print cartridges installed. I bought new cartridges and now have a fully functional printer/scanner/copier. I can finally scan my photographs and properly integrate them into my digital collection.&lt;/p&gt;

&lt;p&gt;My tech is looking very sleek and modern now, but it will still take time for me to recover from the hard drive failure. That was a terrible blow to my productivity, but I'll recover eventually.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:41550</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/41550.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=41550"/>
    <title>Maintaining my humanity</title>
    <published>2012-07-29T18:10:11Z</published>
    <updated>2012-11-17T17:06:08Z</updated>
    <category term="life"/>
    <content type="html">&lt;p&gt;Yesterday while driving home just before midnight I passed by a woman who was walking along the side of the highway. I saw that she wasn't carrying anything that would warrant walking (such as a gas can or a bag of groceries) so I circled back around, stopped, and asked if she needed to use a phone or wanted a ride. She said that she could use a ride to 72nd street, and my jaw dropped. 72nd was at least six miles away!&lt;/p&gt;

&lt;p&gt;She hopped in the car and as we talked she said that she had been walking from Target on the north side of town -- four miles already! I asked how she ended up at Target without a ride home, and she revealed she was in a long-term relationship with a guy and they had been arguing a lot recently. They had it out at Target, he said something really awful to her, and she snapped and walked out.&lt;/p&gt;

&lt;p&gt;Long commutes came up in the conversation, but when I mentioned where I live and work and she seemed to shrink a little in the seat. "It seems like you're driving a long distance out of your way," she said. While that was true, I replied that "helping you helps me be a better person." I have few opportunities to help people, so making sure that a stranger gets home safely -- as opposed to walking for miles and miles in dark clothing along an unlit two-lane highway frequented by drunken lake visitors with a 60 MPH speed limit after midnight -- is an important opportunity to fulfill a personal mandate: creating good in the world.&lt;/p&gt;

&lt;p&gt;I've spent years on the internet and I've observed an enormous amount of unnecessary negativity and conflict. So, although ill-defined, I long ago decided that I would &lt;q&gt;deliberately create good in the world&lt;/q&gt;. &lt;q&gt;Pay it forward&lt;/q&gt; isn't equivalent in my eyes because I don't view kindness as a currency (or at least, if it is then its velocity of circulation is vanishingly low and that economy would collapse very quickly). I also don't think that &lt;q&gt;Do unto others as you would have them do unto you&lt;/q&gt; is equivalent, because it means that people are the only recipients of kindness. Again, my personal viewpoint is poorly defined, but maybe that's unconsciously so I can feel like recycling and picking up trash from my apartment parking lot makes me a good person, heh.&lt;/p&gt;

&lt;p&gt;The point of writing this isn't to show off. I just hope to inspire you to deliberately do good things.&lt;/p&gt;

&lt;p&gt;Oh, and the end of the story is that I drove her all the way home and used my odometer on the way back to check the total distance: including the distance down 72nd, I saved her almost eight miles of life-endangering walking. Nice!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:41315</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/41315.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=41315"/>
    <title>Why. Why would he ruin the joke like that.</title>
    <published>2012-05-04T06:49:07Z</published>
    <updated>2012-05-04T06:49:07Z</updated>
    <category term="quote"/>
    <content type="html">&lt;p&gt;While an observer was being shown around at work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pete&lt;/strong&gt;: &lt;q&gt;And this is Kurt. He'll be building and configuring the servers for that system over there.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Actually, David's going to be right next to me, helping me the whole way. I've told him to mimic my movements, so if you cross your eyes just right it'll look like a single person, but in 3D.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Pete&lt;/strong&gt;: &lt;q&gt;It'll also look like their heights and hair colors will average out.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Whoa! Pete. You need to reel that in.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Pete&lt;/strong&gt;: &lt;q&gt;Too much?&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Too much.&lt;/q&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:41205</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/41205.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=41205"/>
    <title>Announcing feedparser 5.1.2</title>
    <published>2012-05-03T14:53:41Z</published>
    <updated>2012-05-03T14:55:15Z</updated>
    <category term="release"/>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;Howdy everybody,&lt;/p&gt;

&lt;p&gt;I'm pleased to announce that feedparser 5.1.2 is available for immediate download, and I want to stress the word "immediate"! This is a security release, and all users and developers are strongly encouraged to upgrade immediately.&lt;/p&gt;

&lt;h2&gt;Security fix&lt;/h2&gt;

&lt;p&gt;Yesterday while working on a character encoding bug I noticed that it was possible to slip XML ENTITY declarations past feedparser's filter by encoding the document in a non-ASCII-compatible character encoding. ENTITY declarations are like variables or placeholders in XML. When an XML parser finds an entity (like &lt;code&gt;&amp;amp;Aacute;&lt;/code&gt;) it will substitute whatever text corresponds to the entity (like &lt;code&gt;Á&lt;/code&gt;). The problem is that entities can reference other entities, which can lead to exponential memory consumption, even in small documents.&lt;/p&gt;

&lt;p&gt;As an example, the following series of ENTITY declarations can demonstrate the problem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;!ENTITY exponential1 "long text to be repeated"&amp;gt;
&amp;lt;!ENTITY exponential2 "&amp;amp;exponential1;&amp;amp;exponential1;"&amp;gt;
&amp;lt;!ENTITY exponential3 "&amp;amp;exponential2;&amp;amp;exponential2;"&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Each additional entity doubles the number of times 'exponential1' has to be repeated. This has the potential to be used as an attack vector, and feedparser has a filter in place to strip dangerous ENTITY declarations from documents prior to parsing them. Unfortunately, the filter was being run before the character decoding code, which allowed ENTITY declarations through if the document was not ASCII-compatible.&lt;/p&gt;

&lt;p&gt;This is now fixed, and you should upgrade immediately!&lt;/p&gt;

&lt;h2&gt;Other fixes&lt;/h2&gt;

&lt;p&gt;After the last release I received reports that the RFC822 date parser couldn't handle single-digit days. This has been fixed. feedparser can now also handle feeds that have been compressed with the deflate algorithm but that are missing headers and checksum data. It will also try to continue parsing if it encounters a decompression error that might be recoverable (which can happen if a feed claims to be compressed but is not).&lt;/p&gt;

&lt;p&gt;Finally, magnet URIs are now considered safe, and there have been a few other minor fixes.&lt;/p&gt;

&lt;h2&gt;Go get it&lt;/h2&gt;

&lt;p&gt;As always, feedparser can be downloaded from PyPI or from Google Code:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;a href="http://pypi.python.org/pypi/feedparser" rel="nofollow"&gt;http://pypi.python.org/pypi/feedparser&lt;/a&gt;&lt;/code&gt; &lt;br /&gt;
&lt;code&gt;&lt;a href="http://pypi.python.org/pypi/feedparser" rel="nofollow"&gt;https://code.google.com/p/feedparser/downloads/list&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Remember, this is a security release, so hurry and upgrade before it goes out of style!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:40816</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/40816.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=40816"/>
    <title>Turning a phrase</title>
    <published>2012-05-01T16:20:10Z</published>
    <updated>2012-05-04T14:00:46Z</updated>
    <category term="quote"/>
    <content type="html">&lt;p&gt;While discussing my brother's typical weekend:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frederick&lt;/strong&gt;: &lt;q&gt;I think they're planning on pushing it back to 5:00pm.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;You mean, 'push it up to 5:00pm'?&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Frederick&lt;/strong&gt;: &lt;q&gt;I've never been clear on 'pushing it back' versus 'pushing it forward'. Just like how people say 'turn up the air conditioning' when they want to drop the temperature.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;I think that comes from wanting to increase the amount of cool.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Frederick&lt;/strong&gt;: &lt;q&gt;Hey, &lt;em&gt;this&lt;/em&gt; guy doesn't need to increase his amount of cool.&lt;/q&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:40621</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/40621.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=40621"/>
    <title>Customizing websites using a scalpel</title>
    <published>2012-04-24T15:22:22Z</published>
    <updated>2012-04-24T15:28:30Z</updated>
    <category term="extension"/>
    <category term="firefox"/>
    <content type="html">&lt;p&gt;My computer is absurdly old. I hand-selected the components and assembled it back in 2002. It was a marvel of processing power at the time, but you'd never know it now. As software has become more featureful, my computer has proven unable to keep up. Nowadays some websites cause Firefox to hang for seconds at a time. As an example, two weeks ago I had reason to visit SoundCloud.com.&lt;/p&gt;

&lt;p&gt;One of my brothers was in town, and we had stopped at Jimmy John's for lunch, but what's this? They had some absolutely &lt;em&gt;bangin'&lt;/em&gt; music on! I asked the guy behind the counter about it, and he grinned and said "This is Unprotected Sex." While I silently congratulated myself on my word choice, he continued that it was his and his friend's music, and that I could &lt;a href="http://soundcloud.com/thrft-str" rel="nofollow"&gt;check it out on SoundCloud&lt;/a&gt;. (The track in question was "Wizardsbro demo".)&lt;/p&gt;

&lt;p&gt;SoundCloud's music player has an interesting feature: users can leave comments at specific moments in the song, and the website will put their avatar underneath the player at the point that they left the comment. For popular artists like Porter Robinson or Skrillex, this means that there are hundreds upon hundreds of overlapping images to load, and my computer can't handle that.&lt;/p&gt;

&lt;p&gt;I finally fixed the problem using &lt;a href="https://adblockplus.org/en/elemhidehelper" rel="nofollow"&gt;the Element Hiding Helper extension&lt;/a&gt;, a companion to &lt;a href="https://adblockplus.org/" rel="nofollow"&gt;Adblock Plus&lt;/a&gt;. It let me quickly zero in on the offending HTML and block it forever:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;soundcloud.com##OL.timestamped-comments:last-child&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;I've again extended the life of my computer, so while I'm an idiot for doing so, at least...um...&lt;/p&gt;

&lt;p&gt;Well, the point is that Element Hiding Helper is awesome, and you should use it to excise the stupid stuff websites throw at you.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:40264</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/40264.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=40264"/>
    <title>listparser now has a unified codebase</title>
    <published>2012-04-19T04:00:22Z</published>
    <updated>2012-04-19T04:00:22Z</updated>
    <category term="listparser"/>
    <content type="html">&lt;p&gt;&lt;a href="https://github.com/kurtmckee/listparser" rel="nofollow"&gt;listparser&lt;/a&gt; now supports both Python 2 and Python 3 with a single codebase. I'd wondered how difficult it would be, and it turns out: not very! I'm delighted with the results, particularly because I can now generate &lt;a href="http://nedbatchelder.com/code/coverage/" rel="nofollow"&gt;coverage&lt;/a&gt; reports that take into account every interpreter that listparser runs on (including Jython, and excepting IronPython).&lt;/p&gt;

&lt;p&gt;As a side benefit, I can take this experience and apply it to the &lt;a href="https://code.google.com/p/feedparser/" rel="nofollow"&gt;feedparser&lt;/a&gt; codebase in the future. However, I have some bug reports and documentation changes to tend to first...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;listparser is a Python library that parses subscription lists (also called reading lists) and returns all of the feeds, subscription lists, and "opportunity" URLs that it finds. It supports OPML, RDF+FOAF, and the iGoogle exported settings format.&lt;/em&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:40160</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/40160.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=40160"/>
    <title>You know what they say about assumptions</title>
    <published>2012-04-07T16:32:29Z</published>
    <updated>2012-04-07T16:32:29Z</updated>
    <category term="quote"/>
    <content type="html">&lt;p&gt;I walked into the cafeteria at work and, as I passed one of the cafeteria ladies, I pouted and rubbed my tummy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;¡Tengo hambre, Angie!&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Angie&lt;/strong&gt;: &lt;q&gt;Ha ha, you're just like my kids! But wait, why do you think I understand Spanish? Because of the color of my skin?&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Wh...&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Angie&lt;/strong&gt;: &lt;q&gt;Ha ha, I'm just playing with you. You're crazy!&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;One of the guys at work is a young Puerto Rican that listens exclusively to rap and R&amp;amp;B. We were working on servers together and I heard him hum the tune to "It's a Hard Knock Life".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Wait, was that "It's a Hard Knock Life"?&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Julio&lt;/strong&gt;: &lt;q&gt;Yeah, I love that song.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Really.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Julio&lt;/strong&gt;: &lt;q&gt;Love it. I was listening to it on the way in. Jay-Z was just killin' it.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Jay-Z?&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Wayne&lt;/strong&gt;: &lt;q&gt;Kurt, I don't think he's seen "Annie".&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Julio&lt;/strong&gt;: &lt;q&gt;Annie?&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Me&lt;/strong&gt;: &lt;q&gt;Oh Julio, you'd love it. It's the touching story of a young white girl who overcomes adversity.&lt;/q&gt; &lt;br /&gt;
&lt;strong&gt;Julio&lt;/strong&gt;: &lt;q&gt;That doesn't sound like my kind of thing.&lt;/q&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kurtmckee:39826</id>
    <link rel="alternate" type="text/html" href="http://kurtmckee.livejournal.com/39826.html"/>
    <link rel="self" type="text/xml" href="http://kurtmckee.livejournal.com/data/atom/?itemid=39826"/>
    <title>Announcing feedparser 5.1.1</title>
    <published>2012-03-20T16:25:54Z</published>
    <updated>2012-03-20T16:25:54Z</updated>
    <category term="release"/>
    <category term="feedparser"/>
    <content type="html">&lt;p&gt;I'm pleased to announce the release of &lt;a href="https://code.google.com/p/feedparser/" rel="nofollow"&gt;feedparser 5.1.1&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;This release contains a number of important changes that range from fixed crasher bugs to improved date and time string parsing. There are also some bug fixes that affect how various elements are parsed.&lt;/p&gt;

&lt;h1&gt;Unit test fixes&lt;/h1&gt;

&lt;p&gt;Several Linux distribution maintainers came forward after the last release and pointed out issues that ranged from missing unit test files to failures that only seemed to occur on x64 platforms. I believe all of the issues have been ironed out in this release, so feedparser 5.1.1 shouldn't pose a problem to include in package repositories.&lt;/p&gt;

&lt;h1&gt;Parsing changes&lt;/h1&gt;

&lt;p&gt;This release contains a couple of changes to how certain elements are parsed.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;itunes:keywords&lt;/code&gt; element is now split on commas, not whitespace. This brings feedparser in line with the element's description on Apple's website.&lt;/p&gt;

&lt;p&gt;Further, &lt;code&gt;pubDate&lt;/code&gt; now maps to &lt;code&gt;published&lt;/code&gt; rather than &lt;code&gt;updated&lt;/code&gt; in the dictionary that feedparser returns. By mapping &lt;code&gt;pubDate&lt;/code&gt; to &lt;code&gt;published&lt;/code&gt;, its semantic meaning is retained, but developers may need to modify their software if they're only checking the &lt;code&gt;updated&lt;/code&gt; key. One software developer already pointed out that old versions of his software will be affected by this change, so a temporary fix is in place to give developers time to change their software:&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;updated&lt;/code&gt; does not exist, membership tests will always return False.&lt;/p&gt;

&lt;p&gt;However, if &lt;code&gt;updated&lt;/code&gt; does not exist, and
if &lt;code&gt;published&lt;/code&gt; does exist, and
if the software accesses &lt;code&gt;updated&lt;/code&gt;,
feedparser will return the contents of &lt;code&gt;published&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's an example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from feedparser import FeedParserDict
&amp;gt;&amp;gt;&amp;gt; d = FeedParserDict(published='pub')
&amp;gt;&amp;gt;&amp;gt; 'updated' in d
False
&amp;gt;&amp;gt;&amp;gt; d['updated']
'pub'
&amp;gt;&amp;gt;&amp;gt; d = FeedParserDict(published='pub', updated='today')
&amp;gt;&amp;gt;&amp;gt; 'updated' in d
True
&amp;gt;&amp;gt;&amp;gt; d['updated']
'today'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Remember that this is only a stopgap measure. It's intended to help avoid affecting users, should they be using an old version of some software with a new version of feedparser. This hack will be removed in a future version of feedparser.&lt;/p&gt;

&lt;h1&gt;In conclusion&lt;/h1&gt;

&lt;p&gt;A big thank you to everyone who contributed to this release! As always, if you find an issue don't hesitate to file a report on the issue tracker.&lt;/p&gt;</content>
  </entry>
</feed>
