<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0"
xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
 <channel>
  <title>Python owns us - The weblog of Jarno Virtanen: Category python</title>
  <link>http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/python</link>
  <description>Pythonic links and commentary</description>
<creativeCommons:license>http://creativecommons.org/licenses/publicdomain/2.0/</creativeCommons:license>
  <image>
   <url>http://weblog.hotales.org/cgi-bin/weblog/resources/img/export.png</url>
   <title>Python owns us - The weblog of Jarno Virtanen</title>
   <link>http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python?reverse=1</link>
  </image>
  <managingEditor>jajvirta@hole.fi (Jarno Virtanen)</managingEditor>
  <language>en</language>
  <docs>http://backend.userland.com/rss</docs>
  <lastBuildDate>Tue, 04 Jul 2006 10:37:33 GMT</lastBuildDate>
<item>
 <description>Most programmers seem to have a pretty good idea what's wrong with their day job. Interruptions, wrong tools, wrong people, you name it. We dream of a "perfect software development shop" where everything would be just ... perfect. 
 &lt;p&gt;
 So here's an idea. Go to the infogami site that I created, &lt;a href="http://perfect-sw-shop.infogami.com/"&gt;In a perfect software development shop ...&lt;/a&gt;, and add your ideas of a perfect software development firm. 
 &lt;p&gt;
 (I've added a couple, which don't necessarily reflect my dayjob. Just some ideas.)
 &lt;p&gt;
 Spread the meme if you wish.
</description>
 <pubDate>Tue, 04 Jul 2006 10:37:33 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/07/04/0</guid>
</item>
<item>
 <description>I was kinda delighted to see that &lt;a href="http://www.minix3.org/"&gt;Minix 3&lt;/a&gt;, the new version of Minix that is not a teaching tool, already has a Pyt&lt;f&gt;hon port, but appalled when I realized it was &lt;a href="http://www.minix3.org/software/index.html"&gt;Pyt&lt;f&gt;hon 1.5.2 that someone had ported&lt;/a&gt;. Now, I don't have any plans to toy around with Minix 3, but, still, Pyt&lt;f&gt;hon 1.5.2? That's like so last century. 
</description>
 <pubDate>Sun, 02 Jul 2006 11:15:11 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/07/02/0</guid>
</item>
<item>
 <description>&lt;a href="http://www.metabang.com/unclog/publisha/why.html"&gt;Gary King asked&lt;/a&gt; why a person would choose Ruby on Rails over Lisp in web development. Well, I don't know about that, but now that I've used &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt;, there are things that I've become to appreciate in frameworks. 
 &lt;p&gt;
 So, from the top of my head, not a complete or decisive list, and in no particular order, some of the things that I've grown to like in a web development framework:
 &lt;p&gt;
 &lt;ul&gt;
 &lt;li&gt;A decent website. (Which is kept up-to-date. Might even get a facelift now and then. Gasp.)&lt;/li&gt;
 &lt;li&gt;Continuous development (That is, new releases.)&lt;/li&gt;
 &lt;li&gt;Project quickstart. (&lt;code&gt;tg-admin quickstart myproject&lt;/code&gt; and you're ready to hack and view results at localhost:8080 or whatever.)&lt;/li&gt;
 &lt;li&gt;Painless but powerful HTML-templating. (&lt;a href="http://kid.lesscode.org/"&gt;Kid&lt;/a&gt; in TurboGears.)&lt;/li&gt;
 &lt;li&gt;HTML-templates are can be viewed as HTML. (Ie. no custom
 "HTML" tags.)
 &lt;li&gt;Easy ajax integration. (Especially important: don't have to duplicate anything on the server because of AJAX. Meaning that controller methods return the exact same data whether it's rendered with a Kid template or with Mochikit.)&lt;/li&gt;
 &lt;li&gt;Ajax library that fixes some of Javascript's flaws (&lt;a href="http://mochikit.com/"&gt;Mochikit&lt;/a&gt; makes Javascript look more like Python, in a good way.)
 &lt;li&gt;Works on windows, too. (I primarily work on Linux, but I do need Windows box also.)&lt;/li&gt;
 &lt;li&gt;Development environment. (I don't have to manually restart the webserver whenever I make changes in the templates or the code.)&lt;/li&gt;
 &lt;li&gt;Quickstart tutorial. (Get a good understanding of the framework in just few minutes.)&lt;/li&gt;
 &lt;li&gt;Documentation. (Well, the documentation of TurboGears is pretty scattered, but there is documentation.)&lt;/li&gt;
 &lt;li&gt;Plugged-in persistence. (If I just want to persist something, it should be easy. And it is, with SQLObject.)&lt;/li&gt;
 &lt;li&gt;"Shell access" to persistent data. (&lt;code&gt;tg-admin shell ..&lt;/code&gt;)
 &lt;li&gt;Bugfixes, bugfixes, bugfixes.&lt;/li&gt;
 &lt;li&gt;Features, features, features.&lt;/li&gt;
 &lt;li&gt;Straight-forward server configuration. (No XML, please.)&lt;/li&gt;
 &lt;li&gt;Clear development/production distinction.&lt;/li&gt;
 &lt;li&gt;MVC. (No religion here, it's just nice to have.)&lt;/li&gt;
 &lt;li&gt;Fast and easy install.&lt;/li&gt;
 &lt;li&gt;Visibility and buzz.&lt;/li&gt;
 &lt;/ul&gt;
 &lt;p&gt;
 So, there.
 &lt;p&gt;
 It's not to say that every framework should have just those and a bunch of other features, but they make &lt;a href="http://www.jajvirta.fi/static/rants/tools-pain-and-programming.html"&gt;TurboGears feel good for me&lt;/a&gt;.
</description>
 <pubDate>Sun, 11 Jun 2006 11:36:11 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/06/11/0</guid>
</item>
<item>
 <description>It's funny how you sometimes bumb into mentions of Pyth&lt;foo&gt;on in odd places. I've been obsessing about Jeff Hawkins and his theories of how the neo-cortex of the human brain works. He has founded a firm to build intelligent machines, &lt;a href="http://www.numenta.com/employment.php"&gt;Numenta&lt;/a&gt;, and I just happened to glance at their &lt;a href="http://www.numenta.com/employment.php"&gt;employment prospects&lt;/a&gt; &amp;mdash;though I'm not applying there or anything&amp;mdash; and there's a mention of P&lt;asdf&gt;ython. It's not a requirement or anything, but they're into Py&lt;foo&gt;thon too. 
 &lt;p&gt;
 The core of their products will be so intensive computationally that Pyt&lt;foo&gt;hon as such won't be fast enough. It is based on algorithms that are the basis of human intelligence. Or so Hawkins argues. I'm not going to go into details of Hawkins' argument. You have to read his book for it. But I have a feeling that that's important stuff they're working on.
</description>
 <pubDate>Mon, 22 May 2006 12:24:47 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/05/22/0</guid>
</item>
<item>
 <description>Now that people have &lt;a href="http://reddit.com/info/48z0/comments"&gt;noticed that reddit's recommendation engine really doesn't work&lt;/a&gt;, I'd suggest reddit developers and anyone else interested to take a look at Leonard's thoughts: &lt;a href="http://www.crummy.com/software/UltraGleeper/IntroPaper.html"&gt;The Ultra Gleeper: A Recommendation Engine for Web Pages&lt;/a&gt;. Leonard's solutions might not be applicable to every recommendation problem out there, but he has given a lot of thought and effort to the issue. His approach avoids (or at least tries really hard to avoid) all the usual pitfalls of such engines. 
 &lt;p&gt;
</description>
 <pubDate>Wed, 12 Apr 2006 10:22:44 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/04/12/0</guid>
</item>
<item>
 <description>&lt;a href="http://www.hotales.org/writings/python-ruby-ii.html"&gt;A short writeup about P&lt;foo&gt;ython's interactive interpreter not quitting when you type 'quit'. And about comparing that to&amp;nbsp;Ruby's interactive interpreter&lt;/a&gt;.
 &lt;p&gt;
 I would have written it here, but my hosting provider seems to have permanently decided that mentioning P&lt;fo&gt;ython or R&lt;fa&gt;uby [1] or similar words in my weblog entries is a security threat. (Nevermind other, &lt;em&gt;real&lt;/em&gt; security threats.) I really need to do something about the situation soon.
 &lt;p&gt;
 [1] I have to bypass it with stupid tricks, sigh.
 &lt;p&gt;
 Update: &lt;a href="http://www.hotales.org/writings/python-ruby-ii.html#update-bicking"&gt;Ian Bicking notes&lt;/a&gt; that Py&lt;faa&gt;thon 2.5 answers to "quit" with "use quit() to exit", which is adequate solution given the nasty technical details involved. The not-so-magical-any-more-Python-3000 might fix this for real. 
 &lt;p&gt;
 (Yeah. Commenting on this weblog is broken too, sigh.)
</description>
 <pubDate>Thu, 30 Mar 2006 19:11:07 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/03/30/0</guid>
</item>
<item>
 <title>Random book from Amazon</title>
 <description>I revived my age old application that gives you &lt;a href="http://jajvirta.python-hosted.com/randombook/"&gt;(quasi-)random books from Amazon&lt;/a&gt;. 
 &lt;p&gt;
 Just needed to update the &lt;a href="http://www.josephson.org/projects/pyamazon/"&gt;pyamazon&lt;/a&gt; library and rewrote the application in &lt;a href="http://www.cherrypy.org/"&gt;CherryPy&lt;/a&gt;.
 &lt;p&gt;
 I find the application a bit addicting. For a little while, at least.
 &lt;p&gt;
 (And one day I'll get around ordering a real domain for myself, too.)
</description>
 <pubDate>Fri, 24 Feb 2006 14:50:43 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/02/24/0</guid>
</item>
<item>
 <title>Deception, bias and programming language communities</title>
 <description>After listening &lt;a href="http://www.itconversations.com/shows/detail787.html"&gt;Robert Trivers' talk on deception&lt;/a&gt;, I began wondering about self-deception, bias and programming languages. Bias in the sense of favoring arguments that support your view and vice-versa. 
 &lt;p&gt;
 The bias is worst for things that you have already made up your mind. Say you are choosing a college. Before choosing one, you probably weigh the alternatives quite critically and might even experience some anxiety over the choice. But once you've made up your mind, ie. chose to go to a certain college, you just ignore everything negative about it and endorse all positive tidbits you hear regarding it. 
 &lt;p&gt;
 This all happens mostly unconsciously. Even if you know about it, it's extremely hard to take it into account. (Let alone if you don't know about it.) You'd have to &lt;em&gt;always&lt;/em&gt; be consciously aware of this bias and deliberately take it into the calculation.
 &lt;p&gt;
 Another example would be a so called we-bias. You belong to a group and then there's everyone else. If a member of your group does something positive, say, gives a donation to a charity, you tend to generalize: "Bob is such a generous guy." Whereas if it's not a member of your group, you tend to be very specific: "Alice gave a small donation." And vice versa for negatives. Member of your group: "Bob stumped into Ned." Not a member of your group: "Alice is so hostile."
 &lt;p&gt;
 Again, this happens mostly unconsciously. You probably have to be a researcher, or at least an outside observer, to tap into this phenomenon. You're very unlikely to notice your own bias. (Unless you specifically look for it; a rare occasion I would assume.) Self-deception is a very strong power. As Trivers noted, it's likely that a selective force was in favor of genuine self-deception, because one is undoubtedly a better liar if one isn't aware of one's lying. And, boy, is lying good for your breeding prospects or what!
 &lt;p&gt;
 All this deception and group bias must be going on in programming language communities, too. And I'd argue that there isn't a simple cure for it. You might think you're immune to such deception, but, then again, you might be just cheating yourself. You see, you &lt;em&gt;are&lt;/em&gt; prone to deception and bias if you have taken sides, so to speak. In other words: you are biased, if you have a favorite programming language. 
 &lt;p&gt;
 No matter how hard you try to be objective, you probably still aren't.  No matter how diverse you think your views are &amp;mdash;if you still have a favorite programming language (or two)&amp;mdash; you probably are biased. 
 &lt;p&gt;
 I think the deception and especially bias is apparent in the way programming language communities are hostile to other, inferior languages. Once you've made your personal decision (which you might of course change later) on a preferred programming language, you tend become dismissive about the relative weaknesses of your language and you tend to emphasize to strengths of your language. What's more, you probably become extremely critical about other languages. 
 &lt;p&gt;
 People can look for good ideas and strengths in other languages, but they do think that "their language" is one some sense the "best language", at least for them. They feel as if there was a genuinely all-around better language out there, they'd switch to it, immediately. But I would assume that this is not the case. 
 &lt;p&gt;
 There are exceptions to this rule, of course, but if you're now thinking "yeah, that's me", I wouldn't be so sure about it. I am pretty sure &lt;em&gt;I&lt;/em&gt; am biased and self-deceptive, especially on this subject! 
 &lt;p&gt;
 And frankly, I don't know if this is such a bad thing, after all. Sure, self-deception and bias distort your objectivity and decisions, but it is &lt;em&gt;so hard&lt;/em&gt; to always fight against self-deception. And once you've made your decision, you're probably going to stick with it for a while and knowing your language very well is good for your productivity. Furthermore, you &lt;em&gt;can&lt;/em&gt; always explore other languages; it's just that you won't probably make objective and balanced observations of other languages. Get used to it.
</description>
 <pubDate>Fri, 03 Feb 2006 19:06:31 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2006/02/03/0</guid>
</item>
<item>
 <description>&lt;a href="http://www.aaronsw.com/weblog/rewritingreddit"&gt;Aaron says&lt;/a&gt;:
 &lt;p&gt;
 &lt;blockquote&gt;
 My friends over at reddit.com rewrote their site from&amp;nbsp;Lisp to P&lt;foo/&gt;ython in the past week.
 &lt;p&gt;
 [...]
 &lt;p&gt;
 The idea that there is something better than&amp;nbsp;Lisp is apparently inconceivable to some, judging from comments &lt;a href="http://reddit.com/blog/2005/12/night-of-living-python.html"&gt;on the reddit blog&lt;/a&gt;. The Lispers instead quickly set about trying to find the real reason behind the switch.
 &lt;/blockquote&gt;
</description>
 <pubDate>Wed, 07 Dec 2005 03:46:05 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/12/07/0</guid>
</item>
<item>
 <description>Holy shit. CherryPy is damn impressive and slick. And easy too. No wonder Kevin Dangoor chose it for the Turbogears web stack. 
 &lt;p&gt;
 (I haven't had much motivation to experiment with Zope 3 recently. Which is not to say that it's Zope 3's fault.)
</description>
 <pubDate>Sat, 03 Dec 2005 18:25:12 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/12/03/0</guid>
</item>
<item>
 <title>The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Floating Point Numbers (No Excuses!)</title>
 <description>(The title shamelessly &lt;a href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;mimicked from Joel Spolsky&lt;/a&gt;.)
 &lt;p&gt;
 If you &lt;a href="http://blog.leetsoft.com/articles/2005/09/27/wtf"&gt;ever happen to wonder&lt;/a&gt; what the hell is going on with situations like this:
 &lt;p&gt;
 &lt;pre&gt;
 &gt;&gt;&gt; print 0.1
 0.1
 &gt;&gt;&gt; 0.1
 0.10000000000000001
 &lt;/pre&gt;
 &lt;p&gt;
 please, please, please read the&amp;nbsp;Python&amp;nbsp;tutorial appendix: &lt;a href="http://docs.python.org/tut/node16.html"&gt;Floating Point Arithmetic: Issues and Limitations&lt;/a&gt;.
 &lt;p&gt;
 It's all there. Explained by a seasoned expert. If you don't understand floating point numbers after reading it, don't use floating point numbers. (At least for anything serious.)
 &lt;p&gt;
 A very important concept regarding floating points is the fact that you can't "round" the approximation for the number 0.1, that is, 0.10000000000000001, to get rid off the ugly tail; the approximation is already as accurate as possible!
</description>
 <pubDate>Wed, 09 Nov 2005 10:54:44 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/11/09/0</guid>
</item>
<item>
 <title>Reloading views in Zope 3</title>
 <description>For starters, I must say that the Zope 3 product named &lt;a href="http://gintas.pov.lt/z3reload/"&gt;&lt;code&gt;z3reload&lt;/code&gt;&lt;/a&gt; is a real life-saver for a Zope 3 newbie like me. It's pretty &lt;a href="http://gintas.pov.lt/darcs/z3reload/README.txt"&gt;easy to install and configure&lt;/a&gt;, and works, of course, transparently. Exploring Zope 3  sometimes feels like trying to find a light-switch in a completely dark house and this process is much less painful with automatic reloading of views. 
 &lt;p&gt;
 Over and out.
</description>
 <pubDate>Mon, 10 Oct 2005 18:17:55 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">zope</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/10/10/0</guid>
</item>
<item>
 <title>Learning, perhaps, Zope 3</title>
 <description>With the little free time I have for myself, I've decided to try to grok Zope 3. 
 &lt;p&gt;
 Years ago, I made websites with Zope 2 for a living (for a while), but I quit that job (for reasons that had nothing to do with Zope) and I haven't done anything with Zope ever since. (What stuck with me, of course, was Python.) My memories of Zope 2 were pretty much those of many others: an impressive system, but not quite the ideal web application platform. 
 &lt;p&gt;
 Since then, I've been hearing that this new system, Zope 3 or X3, has all the goodies of Zope, but is a &lt;em&gt;programmer friendly&lt;/em&gt; web application platform. Sounds good to me, so maybe it's time to find out about that. 
 &lt;p&gt;
 I am in the happy position of not having to drag around the historical baggage of Zope 2. I do not have to move from Zope 2 to Zope 3, nor do I have to un-learn much of Zope 2. I'm doing this for a hobby, out of general curiosity. (I can quit whenever I want to.) I'll try to approach Zope 3 as just another web application platforms amongst many others. An old platform as whole, but a new platform to me. 
 &lt;p&gt;
 Given the constraints of this hobby, limited resources and especially time, I cannot promise much of this venture, but I hope I can document parts of it. 
 &lt;p&gt;
 My motivation to try and understand Zope 3 in particular is the fact that some people have claimed that it makes it easier to reuse code. We all should know by now that code reuse is hardly ever easy, but, given the opportunity, it's something to strive for. It should not be the Holy Grail of programming, but it's damn boring to do the same stuff all over again, one time after another. 
 &lt;p&gt;
 I am also hoping to find out that Zope 3 makes web application programming fluent and ultimately fun activity. 
 &lt;p&gt;
 Finally, I have no broader context for this venture; I have no job prospects nor opportunities to use Zope 3 in my current day job. I am doing it just for the fun of it. 
 &lt;p&gt;
 Let's see. 
 &lt;p&gt;
 (Maybe I give up in a day, and you'll never hear another word on this subject from me. That's a possibility, too.)
 &lt;p&gt;
 Off to Benji York's &lt;cite&gt;&lt;a href="http://www.benjiyork.com/quick_start.txt"&gt;Zope 3 Quick Start Guide&lt;/a&gt;&lt;/cite&gt;, then.
</description>
 <pubDate>Sat, 08 Oct 2005 18:25:19 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">zope</category>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/10/08/0</guid>
</item>
<item>
 <description>Question: "What exactly is&amp;nbsp;python&amp;nbsp;used for besides shell-type scripting?"
 &lt;p&gt;
 &lt;a href="http://lair.xent.com/pipermail/fork/Week-of-Mon-20050926/037538.html"&gt;Answer&lt;/a&gt;: 
 &lt;p&gt;
 &lt;blockquote&gt;
 Too busy to answer properly, but I'll just mention that Fermilab uses a home-grown&amp;nbsp;python&amp;nbsp;package called Enstore to manage their data store of 3 Petabytes of physics data, growing at 1PB/year.  The transfers of ~25TB/day to and from that system is what keeps me busy.
 &lt;/blockquote&gt;
 &lt;p&gt;
 (A &lt;a href="http://hepix.fzk.de/upload/lectures/enstore_presentation.pdf"&gt;presentation&lt;/a&gt; about their system.)
</description>
 <pubDate>Tue, 04 Oct 2005 10:12:10 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/10/04/0</guid>
</item>
<item>
 <description>&lt;a href="http://www.ibiblio.org/obp/pyBiblio/pythonvideo.php"&gt;A marketing video of Python&lt;/a&gt;. I like it.
 &lt;p&gt;
 (The original site is not, at the moment, very fast, so you might want to search for the file on search engines.)
</description>
 <pubDate>Wed, 28 Sep 2005 18:23:42 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/09/28/0</guid>
</item>
<item>
 <description>News from &lt;a href="http://starship.python.net/crew/theller/py2exe/"&gt;py2exe&lt;/a&gt; page:
 &lt;p&gt;
 &lt;blockquote&gt;
 Can now create single file executables.
 &lt;/blockquote&gt;
 &lt;p&gt;
 I don't know whether it was a big job, but I know it's a big deal for many. Sure, it's &lt;em&gt;really&lt;/em&gt; not that important to have a single executable, but it's the kind of things that somehow end up mattering anyhow. 
</description>
 <pubDate>Wed, 07 Sep 2005 04:14:45 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/09/07/0</guid>
</item>
<item>
 <title>Beautiful</title>
 <description>Adding to the ever-growing body of P&lt;empty&gt;ython tutorials, the &lt;a href="http://zesty.ca/bc/syllabus.html"&gt;material&lt;/a&gt; of Ka-Ping Yee's aptly named course, &lt;a href="http://zesty.ca/bc/"&gt;Beautiful Code&lt;/a&gt;, gives a pleasant yet efficient introductory lesson to the world of P&lt;empty&gt;ython. 
 &lt;p&gt;
</description>
 <pubDate>Wed, 03 Aug 2005 05:15:11 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/08/03/0</guid>
</item>
<item>
 <description>Some kind of a deliverable from &lt;a href="http://codespeak.net/pypy/index.cgi?news"&gt;PyPy&lt;/a&gt; team: &lt;a href="http://codespeak.net/pipermail/pypy-dev/2005q3/002239.html"&gt;seems they've made PyPy run on its own&lt;/a&gt;. See also the collection of photos &lt;a href="http://codespeak.net/~hpk/hildesheim2-sprint-www/"&gt;building up to the moment&lt;/a&gt;.
 &lt;p&gt;
 I am still low on original content, sorry for that.
</description>
 <pubDate>Mon, 01 Aug 2005 18:58:23 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/08/01/0</guid>
</item>
<item>
 <title>PyPy 0.6 released</title>
 <description>&lt;a href="http://codespeak.net/pipermail/pypy-dev/2005q2/002082.html"&gt;PyPy Development Team announced the first public release of PyPy&lt;/a&gt; after two years of spare-time and half a year of EU funded development. 
 &lt;p&gt;
 More details at &lt;a href="http://codespeak.net/pypy/index.cgi?news"&gt;PyPy homepage&lt;/a&gt;.
 &lt;p&gt;
 The &lt;a href="http://codespeak.net/pypy/index.cgi?getting-started"&gt;Getting Started&lt;/a&gt; document provides quick steps to get your own copy of PyPy running.
</description>
 <pubDate>Mon, 23 May 2005 11:50:22 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/05/23/0</guid>
</item>
<item>
 <title>More accurate language statistics from Roeland Rengelink</title>
 <description>&lt;a href="http://rengelink.textdriven.com/blog/"&gt;Roeland Rengelink&lt;/a&gt; did, back in 2001, just &lt;a href="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/03/30/0"&gt;what I asked for&lt;/a&gt;, eg. &lt;a href="http://mail.python.org/pipermail/python-list/2001-December/078587.html"&gt;compared the growth rate (among others) of various programming languages at Sourceforge&lt;/a&gt;. Now &lt;a href="http://rengelink.textdriven.com/blog/index.php?id=2"&gt;he did it again and the numbers aren't so great for Python&lt;/a&gt;, actually. 
</description>
 <pubDate>Thu, 07 Apr 2005 14:37:52 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/04/07/0</guid>
</item>
<item>
 <description>This week's mildly interesting (and certainly somewhat dubious) datapoint comes from an ancient Freshmeat &lt;a href="http://freshmeat.net/articles/view/334/"&gt;article that complains of too few Python&amp;nbsp;projects&lt;/a&gt;. The author proclaims:
 &lt;p&gt;
 &lt;blockquote&gt;
 As I write this, there are almost 3,000 projects in freshmeat's C category and almost 1,500 in the Perl&amp;nbsp;category, but there are only about 400 projects in the Python&amp;nbsp;category. SourceForge has similar statistics.
 &lt;/blockquote&gt;
 &lt;p&gt;
 Comparing this with the current programming language statistics from Freshmeat, we compile the following table:
 &lt;p&gt;
 &lt;blockquote&gt;
 &lt;table&gt;
 &lt;tr&gt;&lt;th&gt;Language&lt;/th&gt;&lt;th&gt;Growth (2001 - 2005)&lt;/th&gt;
 &lt;tr&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;2.4&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;Perl&lt;/td&gt;&lt;td&gt;2.2&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;Python&lt;/td&gt;&lt;td&gt;4.5&lt;/td&gt;
 &lt;/table&gt;
 &lt;/blockquote&gt;
 &lt;p&gt;
 The number of projects per programming language is consistent with Sourceforge's numbers:
 &lt;p&gt;
 &lt;blockquote&gt;
 &lt;table border=1&gt;
 &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Number of C projects /&lt;br&gt; number of Perl&amp;nbsp;projects&lt;/td&gt;&lt;td&gt;C / Python&lt;/td&gt;&lt;td&gt;Perl&amp;nbsp;/ Python&lt;/td&gt;
 &lt;tr&gt;&lt;td&gt;Freshmeat&lt;/td&gt;&lt;td&gt;2.2&lt;/td&gt;&lt;td&gt;4.0&lt;/td&gt;&lt;td&gt;1.8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;Sourceforge&lt;/td&gt;&lt;td&gt;2.5&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;td&gt;1.5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/table&gt;
 &lt;/blockquote&gt;
 &lt;p&gt;
 (Consistency is caused partly by the overlap of projects in these sites.)
 &lt;p&gt;
 The article didn't provide numbers from Sourceforge, but noted that "SourceForge has similar statistics" so we can conclude that the growths are similar both in Freshmeat and Sourceforge. Thus, Python&amp;nbsp;is catching up with at least C and Perl. (Though Python&amp;nbsp;might be losing to other languages.)
 &lt;p&gt;
 Someone enthusiastic enough could gather more accurate statistics from Sourceforge's listings and generate nice plots of them. Scraping automatically all the needed pages from &lt;a href="http://www.sf.net/"&gt;sf.net&lt;/a&gt; would be somewhat impolite, though, I think.
 &lt;p&gt;
</description>
 <pubDate>Wed, 30 Mar 2005 17:48:26 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/03/30/0</guid>
</item>
<item>
 <description>Although Joel gets the details a bit wrong, &lt;a href="http://spambayes.sf.net/"&gt;SpamBayes&lt;/a&gt; gets well-deserved publicity on Joel's essay &lt;a href="http://www.joelonsoftware.com/articles/FogBugzII.html"&gt;&lt;cite&gt;The Road to FogBugz 4.0: Part II&lt;/cite&gt;&lt;/a&gt;:
 &lt;p&gt;
 &lt;blockquote&gt;
 In the meantime I had been using SpamBayes for my own personal email. This is probably the best implementation of what is probably the best spam filtering algorithm out there: Bayesian filtering, invented by Paul Graham and first published in August 2002 in his seminal article A Plan for Spam. 
 &lt;/blockquote&gt;
 &lt;p&gt;
 ...
 &lt;p&gt;
 It wasn't Graham who &lt;em&gt;invented&lt;/em&gt; Bayesian filtering, though his essay certainly popularized the idea and made a huge impact on the adoption of statistical spam filters. Also, &lt;a href="http://spambayes.sourceforge.net/background.html"&gt;SpamBayes's algorithm is not exactly Bayesian&lt;/a&gt;, as far as I understand. And, actually, &lt;a href="http://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html"&gt;Paul Graham's Bayesian algorithm isn't Bayesian either&lt;/a&gt;, but I don't think we want to &lt;a href="http://mail.python.org/pipermail/python-dev/2002-August/028216.html"&gt;dwell on that&lt;/a&gt;. See also Tim's comments on &lt;a href="http://radio.weblogs.com/0101454/stories/2002/09/19/timOnNbc.html"&gt;relative merits of Graham's scheme vs. the so called naive bayesian classification&lt;/a&gt;:
 &lt;p&gt;
 &lt;blockquote&gt;
 I doubt that Graham's approach would work well for a subtle classification problem -- but it's not trying to, and it works exceedingly well for what it is trying to do. That seems a stroke of genius to me.
 &lt;/blockquote&gt;
</description>
 <pubDate>Tue, 29 Mar 2005 18:26:40 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/03/29/0</guid>
</item>
<item>
 <description>&lt;a href="http://www.postneo.com/2005/03/28/mobile-screen-scraping-with-beautifulsoup-and-python-for-series-60"&gt;BeautifulSoup on Python&amp;nbsp;for Series 60&lt;/a&gt;.
</description>
 <pubDate>Mon, 28 Mar 2005 18:50:50 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/03/28/0</guid>
</item>
<item>
 <description>Having used JARs with Java, I think 
 &lt;a href="http://peak.telecommunity.com/DevCenter/PythonEggs"&gt;PythonEggs&lt;/a&gt; is a great idea. And, as of PyCon 2005, &lt;a href="http://dirtsimple.org/2005/03/eggs-are-coming.html"&gt;it seems it's a lot less of an idea and more of an implementation&lt;/a&gt;. 
 &lt;p&gt;
</description>
 <pubDate>Tue, 22 Mar 2005 17:45:29 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/03/22/0</guid>
</item>
<item>
 <description>&lt;a href="http://boredomandlaziness.skystorm.net/"&gt;Nick Coghlan's weblog, Boredom &amp; Laziness&lt;/a&gt;, seems informed and entertaining. One of the topics covered is, of course, Python. Check out, for example, his take on &lt;a href="http://boredomandlaziness.skystorm.net/2004/12/type-checking-in-python.html"&gt;static typing in Python&lt;/a&gt;. (I also found the &lt;a href="http://boredomandlaziness.skystorm.net/2004/12/brain-dead-software-1-yast-online.html"&gt;note about Yast Online Update's braindeadness&lt;/a&gt; accurate.)
</description>
 <pubDate>Sat, 19 Mar 2005 05:39:20 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/03/19/0</guid>
</item>
<item>
 <title>Lesser known historical tidbit of Python</title>
 <description>Most of us know, and some have even read, the &lt;a href="http://groups-beta.google.com/group/comp.sys.sgi/msg/22662b06471e2437?fwc=1"&gt;original announcement of a new programming language called Python back in 1991 by Guido van Rossum&lt;/a&gt;. But did you know that shortly before that &lt;a href="http://groups-beta.google.com/group/alt.sources.d/msg/f0aea54237fcc183?fwc=1"&gt;Guido wrote a rather apologetic response&lt;/a&gt; to being flamed about non-source posting to &lt;code&gt;alt.sources.d&lt;/code&gt;:
 &lt;p&gt;
 &lt;blockquote&gt;
 OK, hey, I surrender!  I won't ever post non-source to alt.sources again! But don't send me any more flames.  How many self-appointed policemen does alt.sources have?  Are there any other rules I should be aware of? I am about to post half a megabyte of source; wouldn't want to be flamed for *that*... 
 &lt;/blockquote&gt;
 &lt;p&gt;
 ?
 &lt;p&gt;
 Well, I didn't.
</description>
 <pubDate>Sun, 20 Feb 2005 09:06:21 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/20/1</guid>
</item>
<item>
 <title>Python whitespace FAQ, or, Python is not Fortran 77</title>
 <description>It's really rather shame that I should write a page like this in these modern, wise times, but I have heard people mentioning this stuff now and then.
 &lt;p&gt;
 &lt;strong&gt;So, does Python's significant whitespace suck because Fortran sucks?&lt;/strong&gt;
 &lt;p&gt;
 No, it doesn't.
 &lt;p&gt;
 &lt;strong&gt;Should I refer to Fortran (77)'s whitespace syntax and semantics when discussing Python's significant whitespace?&lt;/strong&gt;
 &lt;p&gt;
 No, you shouldn't.
 &lt;p&gt;
 &lt;strong&gt;Why not?&lt;/strong&gt;
 &lt;p&gt;
 See &lt;a href="http://www.ictp.trieste.it/~manuals/programming/sun/fortran/f77rm/1_elements.doc.html#1710"&gt;Fortran 77 language reference&lt;/a&gt;. Python's significant whitespace just means that you need to indent your code correctly, which you should do anyway, and that's it. There are no fixed fields or anything like that in Python. See &lt;a href="http://www.linuxjournal.com/article/3882"&gt;this old Linux Journal article by Eric Raymond&lt;/a&gt; for overcoming similar preconceptions.
 &lt;p&gt;
 &lt;strong&gt;But am I allowed to dislike Python's significant whitespace anyway?&lt;/strong&gt;
 &lt;p&gt;
 Sure, as long as you don't refer to Fortran (77).
 &lt;p&gt;
 &lt;strong&gt;Should I dislike Python's significant whitespace?&lt;/strong&gt;
 &lt;p&gt;
 No, you shouldn't.
 &lt;p&gt;
 &lt;strong&gt;Why not?&lt;/strong&gt;
 &lt;p&gt;
 Because it's the most natural thing, and, while it's a lovable feature of Python, it's not that big a deal anyhow. It shouldn't be a show-stopper.
 &lt;p&gt;
 &lt;strong&gt;But it's ugly and wrong.&lt;/strong&gt;
 &lt;p&gt;
 No, it's not. It's beautiful and right. But this isn't going anywhere with us arguing whether it's right or wrong. The point is that if the only reason holding you back from trying out Python is its significant whitespace, then you're &lt;em&gt;really stupid&lt;/em&gt;. I mean a total idiot. Even if the significant whitespace is only the proverbial straw that broke the camel's back, you're still an idiot for not trying out Python because of this.
 &lt;p&gt;
 You need not like it after you've really tried it. You may as well say that you don't like the significant whitespace because you couldn't get comfortable with it. I would find that odd, but I wouldn't argue with you on that. However, if you dismiss Python as a viable alternative because of its significant whitespace; well, as I said, that's just stupid.
 &lt;p&gt;
 &lt;strong&gt;But it's so brittle!&lt;/strong&gt;
 &lt;p&gt;
 No, it's not.
 &lt;p&gt;
 I know of zero cases where a non-newbie has unintentionally screwed up his Python program totally because of the significance of the whitespace. &lt;em&gt;That just does not happen&lt;/em&gt;. Again, these are not issues that make programming hard or easy (and, believe me, there are things that &lt;em&gt;really&lt;/em&gt; make programming hard), but are of rather minor importance.
 &lt;p&gt;
 I am not saying that messing up one's Python program is something totally unheard of, but, on the other hand, I personally &lt;em&gt;know&lt;/em&gt; of many cases where screwed-up indentation in a language that doesn't have significant whitespace has lead a programmer to astray. 
 Yeah, sure, from time to time you introduce a bug to your program by mis-indenting in Python, but this happens in other languages too (only in reverse, because of the insignificance of the whitespace). On my personal account, then, significant whitespace has saved me from more trouble than it has put me into.
 &lt;p&gt;
 &lt;strong&gt;Well, the indentation might get screwed in web pages or emails, right?&lt;/strong&gt;
 &lt;p&gt;
 Yeah, sure. And that's an annoyance. But if the code is anything more than ten lines, it should be laid out by a professional anyhow and if the code is something significant, you shouldn't distribute it that way. If the code is an example, it's a nuisance if the indentation gets screwed, but you can work the indentation out yourself, too. 
 &lt;p&gt;
 (My own code examples in the archives of this blog are actually broken, because of some change in the blogging software I use. You can more easily copy &amp; paste the Java code in my archives, right now, but I really should just fix the mark-up.)
 &lt;p&gt;
 If you're distributing the code in regular script files, the significant whitespace poses no extra threats.
 &lt;p&gt;
 &lt;strong&gt;It's difficult to program Python in Notepad/Word/Some-other-exotic-editor because of the significant whitespace.&lt;/strong&gt;
 &lt;p&gt;
 Yes, it's a bit difficult, though not impossible. I hope you don't get too upset by this, but I'll have to be insulting you again: if you program in Notepad, then you are stupid. You are, believe me.
 &lt;p&gt;
 If you don't know what editor you should use, see the page &lt;a href="http://www.python.org/moin/PythonEditors"&gt;Python Editors&lt;/a&gt;.
 &lt;p&gt;
 &lt;strong&gt;It's difficult to move around big code blocks because of the indentation issue.&lt;/strong&gt;
 &lt;p&gt;
 This is true and a real issue. There are features in advanced editors that make it easier, but it's not real easy with them either. But it's not like you can move around big blocks of code easily in every other language either. The program might be syntactically correct after moving the code block, but you still have to fix the indentation. 
 &lt;p&gt;
 But this is really also a question of one's personal programming habits.
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;small&gt;&lt;p class="nbwordcount"&gt;(words: 758)&lt;/p&gt;&lt;/small&gt;
</description>
 <pubDate>Sat, 19 Feb 2005 05:19:46 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/19/1</guid>
</item>
<item>
 <title>Python really becoming Lisp?</title>
 <description>Y'all have of course read all the past Python vs. Lisp hoobla; Python being "Lisp-envy" of sorts, and you may have mostly ignored it, or tried to, at least. Nevertheless, Oliver Steel offers a clearer viewpoint to this kind of thinking with his post &lt;a href="http://osteele.com/archives/2004/09/becoming-lisp"&gt;Becoming Lisp&lt;/a&gt;. 
 &lt;p&gt;
 He points us to recent Python Cookbook recipes that are based on (to some extent) type/class unification, decorators and generator expressions:
 &lt;blockquote&gt;
 I’ve listed below some of the functional and metaprogramming recipes and packages that have shown up in PyPI and the Python Cookbook over the past few weeks.
 &lt;p&gt;
 ...
 &lt;p&gt;
 The point is that these are flowing in fast and furious, and that they don’t take much code. The recipes below are from just two weeks.
 &lt;/blockquote&gt;
</description>
 <pubDate>Wed, 09 Feb 2005 05:34:06 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/09/2</guid>
</item>
<item>
 <title>Ultra Gleeper, a recommendation engine that really works, unlike most</title>
 <description>The brief exposure that I had with Leonard's &lt;a href="http://www.crummy.com/software/UltraGleeper/"&gt;Ultra Gleeper&lt;/a&gt; &amp;mdash;he gave me a free test-drive after I whined about the sorry state of recommendation engines in my weblog&amp;mdash; was sweet and joyful. It really did fix the problems I reported about recommendation engines I had had the displeasure to deal with. Check out his latest &lt;a href="http://www.crummy.com/2005/02/06/1"&gt;Ultra Gleeping status report&lt;/a&gt; and particularly the introduction paper: &lt;a href="http://www.crummy.com/software/UltraGleeper/IntroPaper.html"&gt;&lt;cite&gt;The Ultra Gleeper: A Recommendation Engine for Web Pages&lt;/cite&gt;&lt;/a&gt;. 
 &lt;p&gt;
</description>
 <pubDate>Mon, 07 Feb 2005 09:09:48 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/07/0</guid>
</item>
<item>
 <title>IDEs are not silver bullets either</title>
 <description>I am really growing tired of hearing the same old "Java has Eclipse or IDEA or Some-other-IDE, therefore you can be as productive in Java as in any other language" phrase spouted whenever anyone mentions Python, Perl or Ruby (or Lisp or Smalltalk). Sure, Eclipse is neat. Sure, even I use Eclipse at work. 
 &lt;p&gt;
 Eclipse makes it easy to find appropriate Java methods, because it has a powerful auto-completion. It even opens up the corresponding documentation in the context. And yes, Python IDEs do something similar too, but they can never be quite as complete as Java's, because of the dynamic typing. Ditto for refactoring. Ditto for many other features.
 &lt;p&gt;
 But &lt;strong&gt;it does not mean that programming in Java suddenly, magically becomes easy&lt;/strong&gt;. Programming isn't hard because you can't always find the right libraries, classes and methods instantly. (Programming might be a bit inconvenient because of this.) Programming is hard, because it's complex. Programming is hard, because it's abstract. Programming is hard, because you can't visualize it. &lt;a href="http://www.virtualschool.edu/mon/SoftwareEngineering/BrooksNoSilverBullet.html"&gt;Etc&lt;/a&gt;. 
 &lt;p&gt;
 Programming isn't hard at the level of individual expressions and statements. Programming is hard at higher levels, at higher levels of abstraction. But these two are not separable. The higher levels, where things are more hairy, are composed of the individual expressions and statements. What's more, you can't escape from the lower levels. You drag them with you whatever you do. This is why programming in assembler is harder: you have drag the most low-level statements with your abstractions. The devil &lt;em&gt;really&lt;/em&gt; is in the details.
 &lt;p&gt;
 The issue is of course not as bleak as I have painted it. You can make your own abstractions, making it easier for you to work with the high level concepts. Making abstractions is indeed a very powerful tool. Unfortunately, abstractions are not silver bullets either. (Not in the form of Objects, or in the form of Subroutines.) You still can't completely escape the individual expressions. You just can't. Abstractions leak. Bugs creep in. Integration becomes harder the more components you have. In some sense, abstractions makes the thing just harder.
 &lt;p&gt;
 What dynamic languages target is the level of the individual statements. They make &amp;mdash;it is argued&amp;mdash; the lowest level visible to the programmer a bit higher. They make the base level a bit higher. It's the fundamental bottom-up programming. Make the language of the programmer a bit closer to the domain of problems. (Domain specific languages are even more powerful with this, but they have their own set of problems, too.)
 &lt;p&gt;
 The &lt;em&gt;point&lt;/em&gt; is not to make programming more convenient (although that's arguably one side-effect of dynamic languages); the point is to make the difficult task of making large programs less daunting. It's of course debatable whether dynamic languages succeed in this mission, but IDEs do not belong to that discussion. It all boils down to this: &lt;strong&gt;No IDE is going to make Java a higher level programming language&lt;/strong&gt;. Unless, of course, the &lt;a href="http://www.jython.org"&gt;"IDE" is actually a interpreter to some higher level language&lt;/a&gt; itself. 
</description>
 <pubDate>Sun, 06 Feb 2005 11:28:02 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/06/1</guid>
</item>
<item>
 <title>NewsBruiser plugin in development: Automatic paragraphs</title>
 <description>I don't have reST support on the site where my NewsBruiser installation lives (and I don't particularly like reST anyway), so I decided to write a plugin that does the only thing I really need when writing entries: converting two consecutive linefeeds to a &amp;lt;p&gt; tag. (Two consecutive linefeeds is, of course, the Universal Paragraph Separator; so much that even in applications where you don't need to type two consecutive linefeeds to start a paragraph, you do it anyhow.)
 &lt;p&gt;
 The only challenging thing writing the plugin was that my ISP doesn't provide a decent programming environment &amp;mdash; I don't have command line Python or Python mode for Emacs there. Otherwise, writing the plugin, with all its warts and bugs, took about 15 minutes, including the "I Want Options" based option to NewsBruiser configuration.
 &lt;p&gt;
 So I propose a NewsBruiser Plugin Development slogan:
 &lt;p&gt;
 &lt;center&gt;&lt;em&gt;NewsBruiser Plugin Development &amp;mdash; so easy that a child can do it&lt;/em&gt; (see the picture below)
 &lt;p&gt;
 &lt;img src="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/attachment/python/2005/02/06/0/telma-nb.jpg"&gt;
 &lt;p&gt;
 (To be honest, though, Telma was IRCing at the moment..)&lt;/center&gt;
 &lt;p&gt;
 Here's the tgz package of the plugin: &lt;a href="http://www.hotales.org/downloads/AutomaticParagraphs-1e-13.tgz"&gt;AutomaticParagraphs-1e-13.tgz&lt;/a&gt;. Extract it to your NewsBruiser base directory (it creates a directory nb/plugin/entry/filter/paragraph/) and configure it on the Entries tab in the NewsBruiser configuration.
</description>
 <pubDate>Sun, 06 Feb 2005 06:13:54 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/06/0</guid>
</item>
<item>
 <title>Upgraded to NewsBruiser 2.6</title>
 <description>Finally decided to upgrade to a &lt;a href="http://newsbruiser.tigris.org/source/browse/newsbruiser/CHANGELOG?rev=1.280&amp;content-type=text/x-cvsweb-markup"&gt;more recent version of NewsBruiser, namely 2.6&lt;/a&gt;. I don't actually know whether there's a real &lt;a href="http://newsbruiser.tigris.org/"&gt;NewsBruiser&lt;/a&gt; upgrade guide out there somewhere, but I did it by making a new installation of the more recent version and manually copying the data from the old installation. Then I checked that most of the stuff still worked and switched to the new location with Apache rewrite configuration change. Seemed to work. Let me know if anything's hosed.
 &lt;p&gt;
 (Well I did incorporate the couple of dirty tweaks I did for my Finnish weblogs, but you don't want to know about those..)
 &lt;p&gt;
 SummaryList does not work for POU right now, though it works for my other blogs; I need to figure that out.
 &lt;p&gt;
 I leaped from 2.3 to 2.6 and the change definitely seems substantial. Thanks again to the Evil^H^H^Hnergetic Master Mind behind all this, &lt;a href="http://www.crummy.com"&gt;Leonard&lt;/a&gt;.
 &lt;p&gt;
 &lt;strong&gt;update&lt;/strong&gt;: OK, some minor differences are visible to users. URLs are bit different. Old links to POU's articles should work, but links to individual entries now have longer URLs.
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
</description>
 <pubDate>Sat, 05 Feb 2005 19:42:21 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/05/1</guid>
</item>
<item>
 <description>It seems &lt;cite&gt;Python owns us&lt;/cite&gt; is not syndicated either in the "original" &lt;a href="http://mechanicalcat.net/pyblagg.html"&gt;Python Programmer Weblogs&lt;/a&gt; or in &lt;a href="http://www.planetpython.org/"&gt;Planet Python&lt;/a&gt;. I don't know what's up with Planet Python (maybe it's same as with the other), but Python Programmer Weblogs has a link to the RSS feed of POU's previous location (&lt;a href="http://www.hole.fi/jajvirta/weblog/rss.xml"&gt;http://www.hole.fi/jajvirta/weblog/rss.xml&lt;/a&gt;), which, alas, is not up at the moment. (And the site is not in my control.) But the thing is that the previous location has been giving permanent redirect for at least eight months. Google, for example, correctly displays the new syndication location if &lt;a href="http://www.google.com/search?q=www.hole.fi%2Fjajvirta%2Fweblog%2Frss.xml"&gt;you ask for http://www.hole.fi/jajvirta/weblog/rss.xml&lt;/a&gt;. 
 &lt;p&gt;
 A permanent redirect means, &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;according to RFC 2616&lt;/a&gt;, that
 &lt;blockquote&gt;
 The requested resource has been assigned a new permanent URI and any future references to this resource SHOULD use one of the returned URIs. 
 &lt;/blockquote&gt;
 It's only a SHOULD, sure, but it'd be nice if aggregators respected it. I cannot do much else myself, because &lt;a href="http://lowlife.jp/cgi-bin/moin.cgi/PythonProgrammersWeblog"&gt;I've corrected the wiki page&lt;/a&gt;, but it seems it isn't scraped automatically anymore.
 &lt;p&gt;
 And I know that this is the wrong place to whine about the issue, because anyone reading POU directly don't need it in the syndicated feeds. (Actually, it might be for the better this way, since you don't have to see my entries twice.) Anyway, this entry falls into the category "in case you wondered". I did.
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
</description>
 <pubDate>Mon, 31 Jan 2005 06:10:54 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/01/31/0</guid>
</item>
<item>
 <title>Clever is better than explicit?</title>
 <description>I suppose you all know &lt;a href="http://www.python.org/peps/pep-0020.html"&gt;The Zen of Python&lt;/a&gt; and its second line, "explicit is better than implicit". Sure, it's  basically just a catch-phrase, but rings true for most of us. (Trying to define its &lt;em&gt;exact&lt;/em&gt; meaning would be quite difficult, though.) We don't want no magic. We want programmers to express what they mean. 
 &lt;p&gt;
 Then earlier today, somehow, I ended up reading a Python Cookbook recipe, written by the brilliant Alex Martelli, titled &lt;cite&gt;&lt;a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66516"&gt;Add an entry to a dictionary, unless the entry is already there&lt;/a&gt;&lt;/cite&gt;. It offers an alternative to the common pattern when dealing with, for example, lists embedded in dictionaries. The usual, "obvious" way is to do this:
 &lt;pre&gt;
 if d.has_key(key):
     d[key].append(value)
 else:
     d[key] = [value]
 &lt;/pre&gt;
 But it's rather many lines to say a fundamentally simple thing (a simple thing in &lt;em&gt;Python programs&lt;/em&gt;, at least). So Alex proposes a more succinct way to express the same thing in Python code:
 &lt;pre&gt;
 d.setdefault(key,[]).append(value)
 &lt;/pre&gt;
 It exploits the &lt;code&gt;setdefault()&lt;/code&gt; dict method, which, &lt;a href="http://docs.python.org/lib/typesmapping.html"&gt;as Python Library Reference puts it&lt;/a&gt;, works like this:
 &lt;blockquote&gt;
 a.setdefault(k[, x])&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[k] if k in a, else x (also setting it)
 &lt;/blockquote&gt;
 (OK, maybe "exploit" is too strong a word, because the above usage is just what &lt;code&gt;setdefault()&lt;/code&gt; is for.)
 &lt;p&gt;
 Anyhow.
 &lt;p&gt;
 It got me thinking whether this is an improvement of the obvious way to do the same thing. (I am using "obvious" here in a probably non-obvious way: meaning that it's obvious to me.) I did not come to any decisive conclusion, but my initial reaction was that the latter way is not exactly explicit. The &lt;em&gt;code&lt;/em&gt; doesn't say, directly (to me, again), that "I want this value to added to the list of this key". But then again, neither does the former.
 &lt;p&gt;
 When working with immutable values, like counting the number of occurances of different words, for example, you can express the similar pattern with the aid of dicts &lt;code&gt;get()&lt;/code&gt;, like this:
 &lt;pre&gt;
 d[word] = d.get(word, 0) + 1
 &lt;/pre&gt;
 But this reads more clearly, I think. It says that "if we haven't found any occurances of &lt;code&gt;word&lt;/code&gt; yet, that equals to 0 occurances so far".
 &lt;p&gt;
 What I wanted to say with all this, I guess, is that if I were to read, for the first time, the source code of some program that I needed to understand, code like &lt;code&gt;d.setdefault(key,[]).append(value)&lt;/code&gt; would make me a bit baffled. (Before I knew this particular idiom, that is.) While the more verbose way to say it, &lt;code&gt;if d.has_key(key): ...&lt;/code&gt;, would be instantly obvious. But I am not sure about this whole thing. I know that I am not on solid ground with these arguments. I do not know, anymore, what &lt;em&gt;really&lt;/em&gt; is more obvious and more explicit, in the good way. Even for myself.
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
  
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
</description>
 <pubDate>Sun, 30 Jan 2005 17:48:17 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/01/30/1</guid>
</item>
<item>
 <title>Jython Servlets, JSP and JSTL</title>
 <description>I was supposed to say a few words about Jython Servlets, JSP and JSTL, but I ended up writing a whole tutorial on it:
 &lt;p&gt;
 &lt;a href="http://www.hotales.org/writings/jython-servlet-jsp.html"&gt;Using JSP for HTML layout for a Jython Servlet&lt;/a&gt;.
 &lt;p&gt;
</description>
 <pubDate>Fri, 28 Jan 2005 19:27:59 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/01/28/0</guid>
</item>
<item>
 <description>For what it's worth, here are some numbers comparing &lt;a href="http://effbot.org/zone/celementtree.htm"&gt;cElementTree&lt;/a&gt; and &lt;a href="http://weblog.hotales.org/view/python/2004/09/01/1"&gt;Java DOM (through Jython)&lt;/a&gt;. (Not a reasonable comparison, of course, but is supposed to serve as a rough reference point.) 
 &lt;p&gt;
 &lt;ul&gt;
 &lt;li&gt;
 The usual &lt;code&gt;start = time.time(); do_stuff(); print time.time()-start&lt;/code&gt; maneuver was used for timing. 
 &lt;li&gt;According to pystone.py, &lt;code&gt;This machine benchmarks at 23201.4 pystones/second&lt;/code&gt;. It claims to have a 1.8GHz processor.
 &lt;li&gt;Python 2.3.3 was used.
 &lt;li&gt;The source XML was a 400k file that repeats one similar structure [1] N times. 
 &lt;li&gt;As for why this machine is so damn slow although the pystone reports relatively big numbers, I have no idea. Maybe there's something weird with disk reading, dunno. Anyway, the relative speeds of the benchmark seem to match other people's benchmarks.
 &lt;/ul&gt;
 &lt;pre&gt;
 xml.dom.minidom    5.7s  (Python 2.2)
 xml.dom.minidom    1.3s  (Python 2.3)
 ElementTree 1.2    1.1s
 Java DOM           0.4s  (Jython 2.1)
 cElementTree       0.06s
 &lt;/pre&gt;
 So, it's pretty clear that cElementTree beats &lt;a href="http://weblog.hotales.org/view/python/2004/09/01/1"&gt;this particular style of XML parsing&lt;/a&gt; hands down..
 &lt;p&gt;
 And yes, this machine seems to be particularly slow at it's job, consistently, as Fredrik wondered in the &lt;a href="http://weblog.hotales.org/view/python/2004/09/01/1"&gt;comments of my entry about the Jython/Java style XML parsing&lt;/a&gt;.
 &lt;p&gt;
 &lt;p&gt;
 [1] &lt;pre&gt;
 &amp;lt;entry&gt;
   &amp;lt;host&gt;64.172.22.154&amp;lt;/host&gt;
   &amp;lt;referer&gt;-&amp;lt;/referer&gt;
   ... 
   [ca. 10 elements like those above]
 &amp;lt;/entry&gt;
 &lt;/pre&gt;
 &lt;p&gt;
 &lt;strong&gt;update&lt;/strong&gt;: Oh yeah, and the numbers are definitely &lt;strong&gt;not&lt;/strong&gt; totally consistent with my previous ad hoc benchmarks, but previously xml.dom.minidom probably suffered more because of its extravagant use of memory. Now that I tuned the size of the XML file down to 400k, the difference between xml.dom.minidom and Java DOM is much milder.
 &lt;p&gt;
 &lt;p&gt;
</description>
 <pubDate>Wed, 26 Jan 2005 19:58:57 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/01/26/0</guid>
</item>
<item>
 <description>Quite a flurry of activity &lt;a href="http://www.airynothing.com/cgi-bin/mt-comments.cgi?entry_id=3382"&gt;at the comments&lt;/a&gt; of &lt;a href="http://www.amk.ca/diary/archives/cat_python.html#003382"&gt;Andrew's entry&lt;/a&gt; in which he says that Python development should focus more on the standard library rather than core language features (and thus CPython implementation). 
</description>
 <pubDate>Sat, 02 Oct 2004 07:14:29 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/10/02/0</guid>
</item>
<item>
 <description>&lt;a href="http://weblog.hotales.org/view/python/2004/09/01/1#comments"&gt;Fredrik asked about my suspicious timings&lt;/a&gt;, and I'm a bit puzzled too, now. Well, anyway, with XML (stolen from some David Mertz article that benchmarked XML parsers) like this:
 &lt;pre&gt;
 &lt;entry&gt;
   &lt;host&gt;64.172.22.154&lt;/host&gt;
   &lt;referer&gt;-&lt;/referer&gt;
   &lt;userAgent&gt;-&lt;/userAgent&gt;
   &lt;dateTime&gt;19/Aug/2001:01:46:01&lt;/dateTime&gt;
   &lt;reqID&gt;-0500&lt;/reqID&gt;
   &lt;reqType&gt;GET&lt;/reqType&gt;
   &lt;resource&gt;/&lt;/resource&gt;
   &lt;protocol&gt;HTTP/1.1&lt;/protocol&gt;
   &lt;statusCode&gt;200&lt;/statusCode&gt;
   &lt;byteCount&gt;2131&lt;/byteCount&gt;
 &lt;/entry&gt;
 &lt;/pre&gt;
 times 3000 (which equals around 1 megabyte), the following code prints out a time of around 3 seconds:
 &lt;pre&gt;
 from xml.dom.minidom import parse
 import time
 start_time = time.time()
 dom1 = parse('myfile2.xml')
 print time.time() - start_time
 &lt;/pre&gt;
 (And similarly, this parsing with elementree (w. Python parser) prints out a time of around 2.5 seconds:
 &lt;pre&gt;
 import time
 from elementtree import ElementTree
 t1 = time.time()
 tree = ElementTree.parse("myfile2.xml")
 print time.time()-t1
 &lt;/pre&gt;
 )
 &lt;p&gt;
 The similar parsing with Jython and Java's libraries takes around half  a second, by the way. The difference 5-6 times to pure Python parsers versus difference of over 10 times in the previous timing. The previous Python minidom timing suffered from memory consumption and swapping, I think.
</description>
 <pubDate>Tue, 07 Sep 2004 19:00:10 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/09/07/0</guid>
</item>
<item>
 <title>Parsing XML in Jython with Java SDK's libraries</title>
 <description>In somewhat &lt;a href="http://weblog.hotales.org/view/python/2004/09/01/0"&gt;similar fashion&lt;/a&gt;, it's easy to parse an XML document to a DOM tree in Jython with Java SDK's libraries:
 &lt;pre&gt;
 from java.io import FileInputStream
 from javax.xml.transform.stream import StreamSource
 from javax.xml.transform.stream import StreamResult
 &lt;p&gt;
 from javax.xml.parsers import DocumentBuilderFactory
 &lt;p&gt;
 factory = DocumentBuilderFactory.newInstance()
 builder = factory.newDocumentBuilder()
 &lt;p&gt;
 input = FileInputStream("myfile.xml")
 document = builder.parse(input)
 document.getDocumentElement()
 # etc.
 &lt;/pre&gt;
 There's no specific need for this, because you can do DOM stuff in recent Python implementations too, but with my naive benchmarks the above Jython snippet clocked at roughly 2 seconds with a 3 megabyte XML file and a Python 2.3 minidom parsing [1] clocked at 26 seconds. (I am not saying that the stock Python 2.3 minidom parser is representative for Python XML parsers, but to give some reference for the speed.)
 &lt;p&gt;
 I am not, of course, suggesting that you should switch to Jython, but I wish I did demonstrate the usefulness of Jython as a scripting tool for various XML tasks.
 &lt;p&gt;
 [1]
 &lt;pre&gt;
 from xml.dom.minidom import parse
 dom1 = parse('myfile.xml')
 &lt;/pre&gt;
</description>
 <pubDate>Wed, 01 Sep 2004 19:58:38 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/09/01/1</guid>
</item>
<item>
 <title>How to do an XSL transformation in Jython</title>
 <description>Since Python standard library doesn't have (to my knowledge, at least) an XSL transformer, and if you happen to have Jython installed, here's how you can do an XSL transformation with Java SDK's libraries:
 &lt;pre&gt;
 from java.io import FileInputStream
 from java.io import ByteArrayOutputStream
 &lt;p&gt;
 from javax.xml.transform import TransformerFactory
 from javax.xml.transform.stream import StreamSource
 from javax.xml.transform.stream import StreamResult
 &lt;p&gt;
 input = FileInputStream("test.xsl")
 xslSource = StreamSource(input)
 xslTemplate = TransformerFactory.newInstance().newTemplates(xslSource);
 transformer = xslTemplate.newTransformer()
 &lt;p&gt;
 output = ByteArrayOutputStream()
 result = StreamResult(output)
 &lt;p&gt;
 source = StreamSource(FileInputStream("source.xml"))
 transformer.transform(source, result)
 &lt;p&gt;
 print output # .. or output.toString()
 &lt;/pre&gt;
</description>
 <pubDate>Wed, 01 Sep 2004 19:13:09 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/09/01/0</guid>
</item>
<item>
 <title>Speed</title>
 <description>I might be hallucinating, but it seems that there's a good chance that recent dynamic languages like Python, Perl and Ruby are on the verge to become a great deal faster. Apart from, say, Psyco, the efforts mostly remain vapourware, but people with brains the size of a small planet are serious about this stuff, and, you've got to admit, a small dose of additional speed for Python programs wouldn't hurt. This is not to say that the current situation is intolerable; Python's been doing fine for well over ten years now. It's just that it's somewhat inconvenient to drop back to C/C++/Java for performance bottlenecks. 
 &lt;p&gt;
 Languages like Lisp, Smalltalk and Self are mostly over this hurdle already. They've been optimized by the &lt;a href="http://webpages.charter.net/allanms/popl84.pdf"&gt;power of academic interest and really smart people&lt;/a&gt; [pdf]. One might ask that why don't I just switch to some of these languages, and to tell you the truth, I don't have a perfect answer for that. It's just that I've already learned Python, and I'm really comfortable with it, and I'm not, right now, willing to invest time to become acquinted with some other language. Learning the language is not the hard part; the hard part is to learn to make real programs with the language. With languages like Java or PHP, it's really rather easy to learn the language and to learn how to make real programs with them. Past some point it might be laborous and difficult to make programs with Java or PHP, but that's not what counts at first. (Sure, of course, it &lt;em&gt;should&lt;/em&gt; count.)
 &lt;p&gt;
 Well, anyway. It's things like Psyco, Parrot (and its JIT), &lt;a href="http://webpages.charter.net/allanms/2004/08/you-dont-tug-on-supermans-cape.html"&gt;pycore&lt;/a&gt;, Starkiller, a &lt;a href="http://www.southern-storm.com.au/libjit.html"&gt;general purpose Just-In-Time library&lt;/a&gt;, IronPython, and, yes, even PyPy (which at its current stage is not what you would call fast) that bring hope to speed addicts. I'm not really qualified to judge any of the projects, but I would guess that if it was (and is) possible to substantially speed up Lisp, Smalltalk etc. in the past, why wouldn't it be possible to speed up Python. It just needs a handful of geniuses and a lot of work. I wish them all motivation and resources to finish their respective projects.
 &lt;p&gt;
 (There's also the slim chance that the different people working on such projects could collaborate, but I really don't know if that would be useful.)
 &lt;p&gt;
 &lt;p&gt;
</description>
 <pubDate>Thu, 12 Aug 2004 06:46:22 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/08/12/0</guid>
</item>
<item>
 <title>std.utest, the complementary unit testing framework</title>
 <description>Holger Krekel and Armin Rigo have been working on a "&lt;a href="http://codespeak.net/svn/user/hpk/talks/std-talk.txt"&gt;complementary second standard library&lt;/a&gt;" for Python. They want to make the standard library more Pythonic, rather than Java-like. Their motto is that "the best API is the one that doesn't exist." 
 &lt;p&gt;
 And, indeed, their unit testing framework, &lt;code&gt;std.utest&lt;/code&gt;, is mostly non-existent to the application programmer. Consider this simple routine, in a module named, say, &lt;code&gt;list.py&lt;/code&gt;:
 &lt;pre&gt;
 def matching_names(prefix, names):
     """Case insensitive match."""
     
     prefix = prefix.upper()
     return [name for name in names
             if name.upper().startswith(prefix)]
 &lt;/pre&gt;
 Now, to test it with &lt;code&gt;std.utest&lt;/code&gt; we make a module named &lt;code&gt;test_list.py&lt;/code&gt;, and its complete listing is this:
 &lt;pre&gt;
 from list import matching_names
 &lt;p&gt;
 def test_matching_names():
     names = ["abc", "Abac", "baca", "bbb"]
     assert matching_names("a", names) == ["abc", "Abac"]
     assert matching_names("ab", names) == ["abc", "Abac"]
     assert matching_names("ba", names) == ["bac"]
 &lt;/pre&gt;
 No special imports, no classes (although you can use a class to organize your tests if you want), no inheritance, no test runners, no suites. Running this with std.utest's supplied test runner (you can write your own if necessary) is as simple as this:
 &lt;pre&gt;
 python ..\std\bin\utest
 &lt;/pre&gt;
 Which spits out this:
 &lt;pre&gt;
 inserting C:\Documents and Settings\Jarno Virtanen
 _______________________________________________________________________________
 ______________________________  TESTS STARTING  ______________________________
 _______________________________________________________________________________
 F
 &lt;p&gt;
 _______________________________________________________________________________
 ________________________________ Test Failure ________________________________
 &lt;p&gt;
 &gt;&gt;&gt; test_matching_names
 &gt;&gt;&gt; 'C:\\Documents and Settings\\Jarno Virtanen\\cd\\test_list.py', line 9
 &lt;p&gt;
 def test_matching_names():
     names = ["abc", "Abac", "baca", "bbb"]
     assert matching_names("a", names) == ["abc", "Abac"]
     assert matching_names("ab", names) == ["abc", "Abac"]
 &gt;   assert matching_names("ba", names) == ["bac"]
 &lt;p&gt;
 -------------------------------------------------------------------------------
 assert ['baca'] == ['bac']
  +  where ['baca'] = matching_names('ba', ['abc', 'Abac', 'baca', 'bbb'])
 ============================== 1 TESTS FINISHED ==============================
 0.05 seconds (0 passed, 1 failed, 0 skipped)
 &lt;/pre&gt;
 &lt;p&gt;
 Notice how std.utest magically deduces what exactly was compared, in the runtime, in the failing assertion. It also shows how the tested routine was called by.
 &lt;p&gt;
 Unfortunately, no one has yet written much documentation about the complementary standard library. You pretty much have to figure it out yourself, but, as you saw, it's not too difficult once the basic idea is revealed. 
 &lt;p&gt;
 The only way (that I know of) to obtain it right now is to use Subversion and check out the project like this:
 &lt;pre&gt;
 svn co http://codespeak.net/svn/std/trunk/src/std
 &lt;/pre&gt;
</description>
 <pubDate>Sat, 07 Aug 2004 08:18:53 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/08/07/0</guid>
</item>
<item>
 <description>A friend of mine, &lt;a href="http://www.hmm.iki.fi/~hmm/"&gt;Markku Hänninen&lt;/a&gt;, starts weblogging by &lt;a href="http://www.hmm.iki.fi/nb/nb.cgi/view/hmmlog/2004/07/28/0"&gt;implementing type checking on a local namespace of an interactive Jython interpreter&lt;/a&gt;.
 &lt;p&gt;
 Also, he is yet another new &lt;a href="http://newsbruiser.tigris.org/"&gt;NewsBruiser&lt;/a&gt; user.
</description>
 <pubDate>Fri, 06 Aug 2004 19:40:19 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/08/06/1</guid>
</item>
<item>
 <title>Score one for Python</title>
 <description>I had an amusing incident when I was fixing some bug in a software written in Java. I rather quickly managed to deduce the bug to a portion of a method and I began fixing it. I started by reorganizing the code and after a while I ended up with code somewhat like the following:
 &lt;pre&gt;
     while (true) {
         // ...
 &lt;p&gt;
         for (int i = 0; ...) {
 	    doSomething();
 	    if (someCondition) {
                 updateSomething();
 	        someFlag = true;
                 break;
 	    }
         if (someFlag) {
 	    break;
         }
         if (somethingElse) {
             doSomethingElse();
         }
     }
 &lt;/pre&gt;
 And the damn thing didn't work correctly. 
 &lt;p&gt;
 Furthermore, it seemed like the software was caught in an endless loop. It's of course blatantly obvious now, and might have been obvious to you at first glance, that the for loop is missing an ending curly brace. Turns out that the rest of the method was some 10 lines of comments &lt;em&gt;and a closing curly brace&lt;/em&gt;. The curly brace was scrolled out of the screen.
 &lt;p&gt;
 It didn't take that long to figure out the problem, but still, it was rather frustrating. The problem was that my brain assumed that the indentation was correct and deduced the control flow from it. The thing is, such problem isn't (in practice) not even possible in Python. Score one for significant indentation. 
</description>
 <pubDate>Fri, 06 Aug 2004 19:12:41 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/08/06/0</guid>
</item>
<item>
 <description>By the way, &lt;a href="http://codespeak.net/pipermail/pypy-dev/2004q2/001319.html" title="Michael Hudson's post about needing talks at EuroPython suggesting that someone talked about the funding"&gt;did anyone talk&lt;/a&gt; about the possible EU funding for the PyPy project? Is there some sort of a public progress report on the subject? Can anyone shed some light on the funding? Does anyone actually know the situation? All I've seen is "it's too soon to say anything about the funding", which might still be true.
 &lt;p&gt;
 I'm just curious.
</description>
 <pubDate>Sun, 01 Aug 2004 10:53:02 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/08/01/1</guid>
</item>
<item>
 <title>Implementations of Python </title>
 <description>So, let's see. There's
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="http://www.python.org/"&gt;CPython&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.ironpython.com/"&gt;IronPython&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://codespeak.net/pypy/"&gt;PyPy&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://web.mit.edu/msalib/www/urop/"&gt;Starkiller&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://groups.google.com/groups?selm=410238F0.8040106%40toetsch.at"&gt;Something on Parrot&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://wiki.cs.uiuc.edu/CampSmalltalk/What's+Going+on+at+CSOregon2004"&gt;Something on Smalltalk VM&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.stackless.com/"&gt;Stackless (which is a kind of a different implementation)&lt;/a&gt; and&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://psyco.sourceforge.net/"&gt;Psyco (which is a kind of a JIT compiler for Python)&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 Any others? (There used to be an implementation of Python named &lt;a href=""&gt;Vyper&lt;/a&gt;, but it no longer exists.)
 &lt;p&gt;
 I wouldn't complain about Python having too few independent implementations anymore.
</description>
 <pubDate>Thu, 29 Jul 2004 19:14:48 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/29/4</guid>
</item>
<item>
 <title>Imperative programming</title>
 <description>Just in time to fit to &lt;a href="http://starship.python.net/crew/mwh/blog/nb.cgi/view/weblog/2004/07/29/0"&gt;Michael's observation&lt;/a&gt;, I'm feeling like talking about Java and Python, again; nothing particularly deep, though, I'm afraid. You see, &lt;a href="http://blog.colorstudy.com/ianb/weblog/2004/07/29.html#P137"&gt;Ian Bicking ponders&lt;/a&gt; on application development models, PHP, and Zope. (And little Python too.) The point was, or the point as I twisted it to fit my universe, that implementing a software in a pure object oriented fashion does not give as much leeway as implementing it partly imperative way, partly object oriented. In imperative and iterative way, you pile functionality to the software and &lt;em&gt;find&lt;/em&gt; the objects through experience during the development. And the abstractions needn't always be objects, they can be plain routines too.
 &lt;p&gt;
 This is exactly what I've been going through developing in Java versus in Python. Finding regular functions and procedures and modules, as opposed to objects, is just so much easier and natural to me. As you write code, you see that this chunk of code really is something you are going to need in some other context later; fine, let's put that into a routine. The great thing about this is that you don't lose anything with it. In fact, the code is generally more readable after such refactoring. The name of your routine succintly says what the chunk of code in it is supposed to do. 
 &lt;p&gt;
 Whereas in a pure object oriented development, you generally need to think what this routine &lt;em&gt;belongs to&lt;/em&gt;. Sure, you can slap the routine in Java to a static method and do the thing in a imperative way, but this is not the way Java programs are supposed to be structured; and I'm talking just about that. This gets into my way all the time. It's nice when things finally click and a thing can be stuffed into an object, but often they don't. 
 &lt;p&gt;
 In other words, object orientation is a nice way to structure your program, though not necessarily the best way, but it's a poor way to figure out how to solve a specific "algorithmic" problem. The first thing that I do when I'm faced with a specific problem is to connect the dots from &lt;em&gt;end to end&lt;/em&gt; (if that's possible), ie. to make sure that I can do the whole thing. Often skeching solution to the problem requires so much code that I &lt;em&gt;need&lt;/em&gt; to restructure my code. This most often pretty easy in the imperative way, as I've explained.
 &lt;p&gt;
 I am willing to accept that I'm a poor object oriented programmer, but I think there's more to the issue than that. But I don't know.
 &lt;p&gt;
 ...
 &lt;p&gt;
 As for PHP, I agree with Ian that PHP's strong point is specifically the fact that you can so easily slap a snippet of code to a web page, to, say, print a date on the page, and organically grow it by slapping more snippets to the page. I've found PHP rather icky to program with, but maybe that's just an attitude. PHP might not be a great programming language, as far as programming languages are considered as such, but it's definitely a great &lt;em&gt;tool&lt;/em&gt; for a broad set of problems.
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
</description>
 <pubDate>Thu, 29 Jul 2004 18:57:36 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/29/3</guid>
</item>
<item>
 <title>Python on Smalltalk VM?</title>
 <description>It seems to have escaped from &lt;a href="http://www.pythonware.com/daily/"&gt;Daily Python URL&lt;/a&gt;, and other Pythonous news sources, that &lt;a href="http://www.aladdin.com/users/ghost/"&gt;L. Peter Deutsch&lt;/a&gt; of the Ghostscript fame is working on a project to make Python programs run on a Smalltalk virtual machine. From CampSmalltalk's Wiki:
 &lt;blockquote&gt;
 pycore is a project to run Python programs, unchanged, on Smalltalk. It currently runs a few tiny test programs on VisualWorks, 5-10x faster than the standard Python implementation. I'm going to get it to the point where it will run some small but realistic pre-existing Python program. I'd also love to get some help in making the code nicely transportable between VW and Squeak.
 &lt;/blockquote&gt;
 &lt;p&gt;
 We now know to be careful predicting the future and hoping too much, but that sounds impressing to me.
 &lt;p&gt;
 [&lt;a href="http://www.oblomovka.com/entries/2004/07/28#1091033040"&gt;Spotted via Danny O'Brien's weblog&lt;/a&gt;.]
</description>
 <pubDate>Thu, 29 Jul 2004 18:09:54 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/29/2</guid>
</item>
<item>
 <title>IronPython in the wild</title>
 <description>In other news, &lt;a href="http://www.ironpython.com/"&gt;IronPython is released&lt;/a&gt; to the world. Jim Hugunin also works for Microsoft now, with the Common Language Runtime team, giving him a possibility to concentrate on the development of IronPython. Congratulations to Jim.
 &lt;p&gt;
 I currently do not work on the CLR platform, but it's nice to see a functional and efficient implementation of Python on it.
 &lt;p&gt;
 Update: &lt;a href="http://usefulinc.com/edd/blog/contents/2004/07/29-ironpython/read"&gt;Edd Dumbill has a good coverage on the release&lt;/a&gt;.
</description>
 <pubDate>Thu, 29 Jul 2004 04:56:00 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/29/0</guid>
</item>
<item>
 <title>Paul Graham and Arc</title>
 <description>I listened to &lt;a href="http://www.itconversations.com/shows/detail164.html"&gt;Paul Graham's interview&lt;/a&gt; at &lt;a href="http://www.itconversations.com/"&gt;ITConversations&lt;/a&gt;. You've got to admire his approach to the development of Arc, a new Lisp dialect. He is not planning to release it until he feels it's ready, which might take several years. A lot of people are, even as of now, eagerly waiting for the release. And I bet Paul sometimes feels a strong urge to just show the world the amazing stuff he has done and get on with the project in public. 
 &lt;p&gt;
 Even if you are just programming some little utility for yourself and your co-workers, there's a point in the development, when a feeling of wanting to share your work just overwhelms you. "Look at this neat script!" As soon as you actually share it, you suddenly realize dozen things that are broken and another dozen things wrong with the UI (be it graphical or command line UI or a programming API). And if the utility happens to be useful, you realize that you just cannot change it that easily anymore. There are people already using it and you find yourself at the maintenance phase of the classic waterfall model. It's not that it isn't fun developing the thing anymore, but that it's considerably more constrained. 
 &lt;p&gt;
 And I'm just talking about a silly little utility. 
 &lt;p&gt;
 Think of the implications in programming languages. It takes a heck of a lot of work to try to improve a language (and it's libraries) and to provide some sort of a backwards compatibility. (Now, place yourself in the shoes of a programmer that, yet again, runs into a Java API document, that describes a perfect method for your needs, just to find out that it's DEPRECATED. Bastards! It's not particularly a Java problem, though, but somehow I have the most painful experiences programming Java.) Furthermore, there's going to be a herd of vocal people that &lt;em&gt;don't want you to change the language&lt;/em&gt; (at least in the way you are going to change it), even though they couldn't design their way through a cubicle. If only you could have anticipated all these things that need to be changed at the first place.
 &lt;p&gt;
 Of course, you rarely can anticipate future needs and future enlightenments. A bunch of languages have been born by sort of an accident. Guido never ment Python to be a full-blown general purpose programming language. Yet that's just what it is nowadays. And I'm not saying that Python isn't fit for general purpose programming, quite the contrary actually, but that it wasn't the idea Guido had in his mind when went on &lt;a href="http://www.python.org/doc/essays/foreword.html"&gt;a prolonged Christmas vacation&lt;/a&gt;. (OK, the vacation didn't last longer, but its implications sure did.)
 &lt;p&gt;
 Anyways.
 &lt;p&gt;
 Graham obviously has a pretty strong agenda for Arc. He knows what he wants Arc to be good at, specifically web programming, and Arc, of course, has a rather solid foundation already, being a dialect of Lisp. Sure, Arc might get popular at some entirely different application area, or might not get popular at all, but there, nevertheless, will be a lot of hurdles along the way, a lot of things that need to be done completely different than originally thought. By holding of the release, he buys himself a &lt;em&gt;lot&lt;/em&gt; of room and freedom with the design. 
 &lt;p&gt;
 One might suggest that Graham could just release the damn thing, and after finding flaws in the core design, he could just say "fuck off, users", and release a new, totally incompatible version of Arc later, but that's not the way hackers go about. In fact, this relates to another concept Graham talked in the interview. Namely, &lt;em&gt;empathy&lt;/em&gt;. He argues that great programmers can feel truly emphatic of their users. Great programmers can get into the shoes of the user, so to speak. And emphatic programmers just don't go introducing backwards incompatible changes to their language; unless necessary, of course. And if the users are programmers themselves, and the software is a programming language, the emotional and intellectual investment that the users devote to the software is something that you just can't ignore.
 &lt;p&gt;
 So, all in all, I wish that Graham can continue to design Arc in peace and comes up with a great programming language. I won't probably be using it, because I've kind of decided to stick with Python, for better of for worse, for my favorite language. I'll be using languages like Java or even Perl at work, and I'm fine with it; believe it or not, Paul, but Java is a right tool for a broad set of problems and contexts. But when I can make the decision myself, the implementation language is going to be Python. But never say never; I'll look forward to see as for what kind of language Arc turns out to be.
 &lt;p&gt;
 &lt;p&gt;
 &lt;p&gt;
</description>
 <pubDate>Wed, 28 Jul 2004 19:36:43 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/28/0</guid>
</item>
<item>
 <title>Category feeds, or, Python category feed</title>
 <description>&lt;p&gt;I realized that NewsBruiser has category feeds (if only I categorized my posts) and remembering the results of my reader survey earlier, I decided that I will categorize at least the posts related to Python so that you can filter out the non-relevant posts. Seems that I can't, or don't want to, restrict my posts strictly on the subject of Python.
 &lt;/p&gt;
 &lt;p&gt;
 So, here you are: &lt;a href="http://weblog.hotales.org/syndicate/python/python"&gt;Category feed containing only posts about Python&lt;/a&gt;. 
 &lt;/p&gt;
</description>
 <pubDate>Thu, 15 Jul 2004 17:00:17 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/15/1</guid>
</item>
<item>
 <title>Pie-thon update</title>
 <description>Given that &lt;a href="http://conferences.oreillynet.com/os2004/"&gt;OSCON 2004&lt;/a&gt; is approaching, I thought a brief update on &lt;a href="http://www.hole.fi/jajvirta/weblog/20040108T2001.html"&gt;Pie-thon&lt;/a&gt; should be in order.
 &lt;p&gt;
 So,
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="http://www.amk.ca/diary/archives/cat_python.html#003176"&gt;Andrew has been playing with Parrot's CVS&lt;/a&gt;...
 &lt;li&gt;... &lt;a href="http://www.amk.ca/diary/archives/cat_python.html#003198"&gt;and has figured out how to run Python programs with Parrot&lt;/a&gt;.
 &lt;li&gt;&lt;a href="http://mail.python.org/pipermail/python-dev/2004-July/046162.html"&gt;The subject has been brought up on python-dev mailing list&lt;/a&gt;.
 &lt;li&gt;&lt;a href="http://www.sidhe.org/~dan/blog/archives/000359.html"&gt;Dan has had difficulties with his computer&lt;/a&gt; ...
 &lt;li&gt; ... &lt;a href="http://www.sidhe.org/~dan/blog/archives/000362.html"&gt;but has now made progress on the project&lt;/a&gt;.
 &lt;/ul&gt;
 &lt;p&gt;
</description>
 <pubDate>Thu, 15 Jul 2004 16:42:47 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/15/0</guid>
</item>
<item>
 <title>Trying out Quixote</title>
 <description>Seeing &lt;a href="http://www.amk.ca/diary/archives/cat_python.html#003164"&gt;Andrew mention&lt;/a&gt; the release of &lt;a href="http://www.mems-exchange.org/software/quixote/"&gt;Quixote&lt;/a&gt; 1.0  (and the weather being rather moist), I decided to give it a try. I am impressed. I read through the demo application and a couple of articles, and I think I've grasped the basic architecture. The main design principle of Quixote is evident: Quixote applications are almost like normal Python applications. 
 &lt;p&gt;
 (Flashback: I remember &lt;a href="http://www.epoz.org/"&gt;Etienne Posthumus&lt;/a&gt; (&lt;a href="http://www.epoz.org/blog"&gt;who blogs too&lt;/a&gt;) praising Quixote at Europython 2003 and searching for other Quixote users. I didn't know what the fuzz was all about then.)
 &lt;p&gt;
 Quixote, by design, does not make a clear distinction between web programmers and web designers (ie. HTML coders). While I can appreciate such a distinction in certain contexts, I think Quixote's approach fits better with my pet projects. 
 &lt;p&gt;
 Let's see if I can come up with something for the public eye one day.
</description>
 <pubDate>Fri, 02 Jul 2004 07:13:59 GMT</pubDate>
 <category domain="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/category/python/">python</category>
 <guid isPermalink="true">http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2004/07/02/0</guid>
</item>
 </channel>
</rss>
