<?xml version="1.0"?>
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns="http://purl.org/rss/1.0/"
>
<channel rdf:about="http://planet.python.org/">
	<title>Planet Python</title>
	<link>http://planet.python.org/</link>
	<description>Planet Python - http://planet.python.org/</description>

	<items>
		<rdf:Seq>
			<rdf:li rdf:resource="http://tarekziade.wordpress.com/?p=973" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-7176062489626496619.post-1955330441532928689" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-11788780.post-527242992269361490" />
			<rdf:li rdf:resource="http://www.logilab.org/blogentry/18838" />
			<rdf:li rdf:resource="http://faassen.n--tree.net/blog/view/weblog/2009/11/06/0" />
			<rdf:li rdf:resource="http://pyre.third-bit.com/blog/?p=3142" />
			<rdf:li rdf:resource="http://jcalderone.livejournal.com/53074.html" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-130402213334709639.post-3282047014695827839" />
			<rdf:li rdf:resource="http://simonwillison.net/2009/Nov/6/neopythonic/" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-684183198890094283.post-8590203215247302804" />
			<rdf:li rdf:resource="http://thomas.apestaart.org/log/?p=1061" />
			<rdf:li rdf:resource="http://lericson.blogg.se/code/2009/november/multitouch-on-unibody-macbooks.html" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-684183198890094283.post-24164141902509361" />
			<rdf:li rdf:resource="http://thomas.apestaart.org/log/?p=1059" />
			<rdf:li rdf:resource="http://nedbatchelder.com/blog/200911/continuous_integration_for_python_with_hudson.html" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3971202189709462152.post-7608527610228870250" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-2363643920942057324.post-6796371828982948720" />
			<rdf:li rdf:resource="http://ericholscher.com/blog/2009/nov/5/adding-testing-pip/" />
			<rdf:li rdf:resource="http://www.python.org/news/index.html#Thu5Nov2009184600-0500" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-8212254010436871241.post-4433996884499631327" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-7176062489626496619.post-5486694113588267806" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-10678074.post-2583167037261338039" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-130402213334709639.post-4709054541894079059" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-684183198890094283.post-2237607397047546604" />
			<rdf:li rdf:resource="http://freshfoo.com/blog/2009/11/05/disqus" />
		</rdf:Seq>
	</items>
</channel>

<item rdf:about="http://tarekziade.wordpress.com/2009/11/07/virtualenv-and-zc-buildout-now-with-distribute-included/">
	<title>Tarek Ziade: virtualenv and zc.buildout now with Distribute included</title>
	<link>http://tarekziade.wordpress.com/2009/11/07/virtualenv-and-zc-buildout-now-with-distribute-included/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;We are still actively working in fixing all the remaining bugs in &lt;a href=&quot;http://pypi.python.org/pypi/distribute&quot;&gt;Distribute&lt;/a&gt; (our Setuptools fork).&lt;/p&gt;
&lt;p&gt;But we have reached an important milestone this week: both &lt;a href=&quot;http://pypi.python.org/pypi/virtualenv/1.4&quot; target=&quot;_blank&quot;&gt;virtualenv&lt;/a&gt; and &lt;a href=&quot;http://pypi.python.org/pypi/zc.buildout&quot; target=&quot;_blank&quot;&gt;zc.buildout&lt;/a&gt; now comes with an option to switch to Distribute.&lt;/p&gt;
&lt;p&gt;In virtualenv:&lt;/p&gt;
&lt;pre&gt;$ virtualenv --distribute ENV&lt;/pre&gt;
&lt;p&gt;In zc.buildout, using its bootstrap.py file:&lt;/p&gt;
&lt;pre&gt;$ python bootstrap.py --distribute&lt;/pre&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;
&lt;p&gt;For those who may wonder why they should switch to Distribute over Setuptools, it&amp;#8217;s quite simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Distribute 0.6.x is a drop-in replacement for Setuptools&lt;/li&gt;
&lt;li&gt;Distribute is actively maintained, and has over 10 commiters&lt;/li&gt;
&lt;li&gt;Distribute 0.6.x offers Python 3 support !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if you still struggle with packaging issues, the place to hang around to get some help is the #distutils IRC channel on Freenode.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/tarekziade.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/tarekziade.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/tarekziade.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/tarekziade.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/tarekziade.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/tarekziade.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/tarekziade.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/tarekziade.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/tarekziade.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/tarekziade.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&amp;blog=448161&amp;post=973&amp;subd=tarekziade&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-07T01:43:13+00:00</dc:date>
</item>
<item rdf:about="http://lazypython.blogspot.com/2009/11/towards-better-template-tag-definition.html">
	<title>Alex Gaynor: Towards a Better Template Tag Definition Syntax</title>
	<link>http://lazypython.blogspot.com/2009/11/towards-better-template-tag-definition.html</link>
	<content:encoded>&lt;a href=&quot;http://ericholscher.com/&quot;&gt;Eric Holscher&lt;/a&gt; has blogged a &lt;a href=&quot;http://ericholscher.com/blog/2009/nov/3/class-based-template-tags/&quot;&gt;few&lt;/a&gt; &lt;a href=&quot;http://ericholscher.com/blog/2009/nov/3/making-template-parsing-easier/&quot;&gt;times&lt;/a&gt; this month about various template tag definition syntax ideas.  In particular he's looked at a system based on &lt;a href=&quot;http://github.com/codysoyland/surlex&quot;&gt;Surlex&lt;/a&gt; (which is essentially an alternate syntax for certain parts of regular expressions), and a system based on keywords.  I highly recommend giving his posts a read as they explain the ideas he's looked at in far better detail than I could.  However, I wasn't particularly satisfied with either of these solution, I love Django's use of regular expressions for URL resolving, however, for whatever reason I don't really like the look of using regular expressions (or an alternate syntax like Surlex) for template tag parsing.  Instead I've been thinking about an object based parsing syntax, similar to &lt;a href=&quot;http://pyparsing.wikispaces.com/&quot;&gt;PyParsing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is an idea I've been thinking about for several months now, but Eric's posts finally gave me the kick in the pants I needed to do the work.  Therefore, I'm pleased to announce that I've released &lt;a href=&quot;http://github.com/alex/django-kickass-templatetags&quot;&gt;django-kickass-templatetags&lt;/a&gt;.  Yes, I'm looking for a better name, it's already been pointed out to me that a name like that won't fly in the US government, or most corporate environments.  This library is essentially me putting to code everything I've been thinking about, but enough talking let's take a look at what the template tag definition syntax:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    @tag(register, [Constant(&quot;for&quot;), Variable(), Optional([Constant(&quot;as&quot;), Name()])]):&lt;br /&gt;    def example_tag(context, val, asvar=None):&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see it's a purely object based syntax, with different classes for different components of a template tag.  For example this would parse something like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    {% example_tag for variable %}&lt;br /&gt;    {% example_tag for variable as new_var %}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It's probably clear that this is significantly less code than the manual parsing, manual node construction, and manual resolving of variable that you would have needed to do with a raw templatetag definition.  Then the function you have gets the resolved values for each of its parameters, and at that point it's basically the same as Node.render, it is expected to either return a string to be inserted into the template or alter the context.  I'm looking forward to never writing manual template parsing again.  However, there are still a few scenarios it doens't handle, it won't handle something like the logic in the {% if %} tag, and it won't handle tags with {% end %} type tags.  I feel like these should both be solvable problems, but since it's a bolt-on addition to the existing tools it ultimately doesn't have to cover every use case, just the common ones (when's the last time you wrote your own implementation of the {% if %} or {% for %} tags).&lt;br /&gt;&lt;br /&gt;It's my hope that something like this becomes popular, as a) developers will be happier, b) moving towards a community standard is the first step towards including a solution out of the box.  The pain and boilerplate of defining templatetags has long been a complain about Django's template language (especially because the language itself limits your ability to perform any sort of advanced logic), therefore making it as painless as possible ultimately helps make the case for the philosophy of the language itself (which I very much agree with it).&lt;br /&gt;&lt;br /&gt;In keeping with my promise I'm giving an overview of what my next post will be, and this time I'm giving a full 3-day forecast :).  Tommorow I'm going to blog about pip, virtualenv, and my development workflow.  Sunday's post will cover a new optimization that just landed in Unladen Swallow.  And finally Monday's post will contain a strange metaphor, and I'm not saying any more :P.  &lt;a href=&quot;http://github.com/alex/django-kickass-templatetags&quot;&gt;Go checkout the code and enjoy.&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7176062489626496619-1955330441532928689?l=lazypython.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-06T23:17:38+00:00</dc:date>
</item>
<item rdf:about="http://jjinux.blogspot.com/2009/11/suicide.html">
	<title>Shannon -jj Behrens: Suicide</title>
	<link>http://jjinux.blogspot.com/2009/11/suicide.html</link>
	<content:encoded>My friend committed suicide.  He was a brilliant programmer, and he had everything going for him.  He was very successful.&lt;br /&gt;&lt;br /&gt;I'm crushed because I know I could have helped if only he had given me a chance.  He never did.&lt;br /&gt;&lt;br /&gt;We in the programming world aren't always the most emotionally balanced.  I know of three others who took their lives in the programming world.  I've hinted at this before on my &lt;a href=&quot;http://jjinux.blogspot.com/2008/05/bipolar-lisp-programmer.html&quot;&gt;Bipolar Lisp Programmer&lt;/a&gt; post.  To compound matters, our society has been moving away from personal interaction and responsibility for decades, leading to a culture that is toxic.&lt;br /&gt;&lt;br /&gt;Mother Theresa said that the greatest poverty that she ever saw was to see people who felt unloved.  If your friends are feeling unloved, please reach out to them.  We are each far more loved than we think.  In the programming world, it's so easy to get caught up in petty struggles, like Pylons vs. Django, Ruby vs. Python, free software vs. open source, Linux vs. pretty much everything else ;)  What we forget is that we're all people with hopes and dreams, fears and insecurities.  We're all trying to change the world, but as Mother Theresa said, &quot;In this life we cannot do great things. We can only do small things with great love.&quot;&lt;br /&gt;&lt;br /&gt;Look out for each other, but if you have no where to turn, contact me!  Call me directly at (925) 209-6439.  Don't consider the middle of the night an inconvenience.  When else am I going to work with five kids around ;)  I will do everything I can to help.  I don't want to wake up on another day to find another brilliant mind missing from this great community of thinkers.  We are a community and we are only as great as the individuals that thrive and share with one another in that community.  Everyone contributes, whether in small ways or large, and every loss is felt by more people than we consider in our moments of darkness.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/11788780-527242992269361490?l=jjinux.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-06T22:15:40+00:00</dc:date>
</item>
<item rdf:about="http://feedproxy.google.com/~r/logilaborg_en/~3/spIl_Qr7Qvg/18838">
	<title>Logilab: First contact with pupynere</title>
	<link>http://feedproxy.google.com/~r/logilaborg_en/~3/spIl_Qr7Qvg/18838</link>
	<content:encoded>&lt;p&gt;I spent some time this week evaluating &lt;a class=&quot;reference&quot; href=&quot;http://dealmeida.net/projects/pupynere&quot;&gt;Pupynere&lt;/a&gt;, the PUre PYthon NEtcdf REader written by Roberto De Almeida. I see several advantages in pupynere.&lt;/p&gt;
&lt;p&gt;First it's a pure Python module with no external dependency. It doesn't even depend on the &lt;a class=&quot;reference&quot; href=&quot;http://www.unidata.ucar.edu/software/netcdf/&quot;&gt;NetCDF&lt;/a&gt; lib and it is therefore very easy to deploy.&lt;/p&gt;
&lt;p&gt;Second, it offers the same interface as &lt;cite&gt;Scientific Python&lt;/cite&gt;'s NetCDF bindings which makes transitioning from one module to another very easy.&lt;/p&gt;
&lt;p&gt;Third pupynere is being integrated into &lt;a class=&quot;reference&quot; href=&quot;http://www.scipy.org/&quot;&gt;Scipy&lt;/a&gt; as the &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;scypi.io.netcdf&lt;/span&gt;&lt;/tt&gt; module. Once integrated, this could ensure a wide adoption by the python community.&lt;/p&gt;
&lt;p&gt;Finally it's easy to dig in this clear and small code base of about 600 lines. I have just sent several fixes and bug reports to the author.&lt;/p&gt;
&lt;p&gt;However pupynere isn't mature yet. First it seems pupynere has been only used for simple cases so far. Many common cases are broken. Moreover there is no support for new NetCDF formats such as long-NetCDF and NetCDF4, and important features such as file update are still missing. In addition, The lack of a test suite is a serious issue. In my opinion, various bugs could already have been detected and fixed with simple unit tests. Contributions would be much more
comfortable with the safety net offered by a test suite. I am not certain
that the fixes and improvements I made this week did not introduce regressions.&lt;/p&gt;
&lt;p&gt;To conclude, pupynere seems too young for production use. But I invite people
to try it and provide feedback and fixes to the author. I'm looking forward to using this project in production in the future.&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-06T20:38:59+00:00</dc:date>
</item>
<item rdf:about="http://faassen.n--tree.net/blog/view/weblog/2009/11/06/0">
	<title>Python Secret Weblog: The Success of the Zope Component Architecture</title>
	<link>http://faassen.n--tree.net/blog/view/weblog/2009/11/06/0</link>
	<content:encoded>&lt;p&gt;Prompted by recent brief negative &lt;a class=&quot;reference&quot; href=&quot;http://mockit.blogspot.com/2009/11/emperors-new-clothes.html&quot;&gt;pronunciations&lt;/a&gt; by Malthe on the
Zope Component Architecture (ZCA), I thought I'd talk a bit about what
I think about it. I'm not going to go into hermeneutics here of what
Malthe might mean -- others attempts at exegesis exist in the comments
to that blog entry already. Instead, I'll just talk about what I think
makes the ZCA useful, and why it is successful. Finally I'll go into
some reasons why people are frustrated by the ZCA.&lt;/p&gt;
&lt;div class=&quot;section&quot;&gt;
&lt;h1&gt;&lt;a id=&quot;what-is-the-zca-used-for&quot; name=&quot;what-is-the-zca-used-for&quot;&gt;What is the ZCA used for?&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;What is the ZCA used for? It's used to glue things to each other: glue
event handlers to events, glue views to models, glue plugins into
applications and libraries, and more abstractly, glue adapters to
adaptees. In ZCA terms, providing such glue is termed providing
&lt;em&gt;configuration&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Why was the ZCA created? The Zope community had been building
pluggable web applications for a long time and we noticed our
components became overly complex and were hard to glue together and
override. The ZCA is one answer to this problem.&lt;/p&gt;
&lt;p&gt;The ZCA is implemented by &lt;a class=&quot;reference&quot; href=&quot;http://pypi.python.org/pypi/zope.component&quot;&gt;zope.component&lt;/a&gt;. It's a library for
gluing. It's built on top of &lt;a class=&quot;reference&quot; href=&quot;http://pypi.python.org/pypi/zope.interface&quot;&gt;zope.interface&lt;/a&gt;, a library that helps
one define the bits that are being glued.&lt;/p&gt;
&lt;p&gt;What advantage does such gluing bring?&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;many, perhaps all, larger applications contain glue. The ZCA makes
the glue explicit and uniform.&lt;/li&gt;
&lt;li&gt;ZCA glue can be overridden explicitly.&lt;/li&gt;
&lt;li&gt;you can extend existing systems by gluing in new things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One place where the ZCA is helpful is when you want to write a library
that offers a few plugin points to configure it for a particular
environment. For instance when I wrote &lt;a class=&quot;reference&quot; href=&quot;http://pypi.python.org/pypi/hurry.resource&quot;&gt;hurry.resource&lt;/a&gt;, a library
for handling javascript and other resources, I included a few plugin
points in it that allow it to be plugged into a particular web
framework. Then to allow it to be used with Zope Toolkit-based
frameworks such as Grok, I wrote &lt;a class=&quot;reference&quot; href=&quot;http://pypi.python.org/pypi/hurry.zoperesource&quot;&gt;hurry.zoperesource&lt;/a&gt; to provide the
knowledge about that.&lt;/p&gt;
&lt;p&gt;This way, hurry.resource doesn't need to know anything in particular
about URL generation or requests; its plugins can take care of
this. This allowed me to write and test hurry.resource without
worrying too much about the larger Zope Toolkit framework, knowing I
could plug it in later, and now the library becomes more useful for a
broader group of people.&lt;/p&gt;
&lt;p&gt;The ZCA doesn't just allow one to glue one thing to another, but also
to override the glue in specific cases. A common example of overriding
glue occurs with views. Zope Toolkit applications follow a view/model
approach, where the view is looked up on the model dependent on its
class (or interface). It happens frequently enough in an application
that I want many models to share a particular view, but override one
model with a more specialized view. This is much like the way
inheritance works in plain Python: I implement a method on a base
class shared completely by some subclasses, but for one subclass I'd
like to override it.&lt;/p&gt;
&lt;p&gt;What I described just now is overriding for particular subclasses. The
ZCA also allows other ways of overriding based on the
&lt;a class=&quot;reference&quot; href=&quot;http://pypi.python.org/pypi/zope.configuration&quot;&gt;zope.configuration&lt;/a&gt; library, overriding one glue registration with
another one. I myself find myself using this kind of override less
frequently, but it's still very useful in the 1 percent of cases where
other options would be very ugly.&lt;/p&gt;
&lt;p&gt;The question is sometimes asked why not just modify code dynamically
for overrides? Why not &lt;em&gt;monkey patch&lt;/em&gt; it? (or &amp;quot;open the class&amp;quot;, or
whatever other terminology one would like to use).&lt;/p&gt;
&lt;p&gt;Brandon Rhodes at PyCon 2008 gave &lt;a class=&quot;reference&quot; href=&quot;http://rhodesmill.org/brandon/adapters/&quot;&gt;a great presentation&lt;/a&gt; explaining
why the ZCA approach can be superior to monkey-patching and some other
approaches. The point he makes is that the ZCA is the most composable
and maintainable approach of the alternatives (subclassing, mixins,
monkey-patching, adaptation). I recommend everyone interested in this
topic to read his slides.&lt;/p&gt;
&lt;p&gt;Of course as with everything in programming, everything depends on the
trade-offs. In many circumstances the ZCA is overkill. The ZCA can be
misused. But I also maintain that in many circumstances the ZCA is
very useful.&lt;/p&gt;
&lt;p&gt;Component approaches have become quite popular with web
frameworks. Many popular ones adopt elements of it, but often in a
somewhat limited way. For instance, one very popular &lt;em&gt;interface&lt;/em&gt; is
the WSGI interface, and one popular form of &lt;em&gt;adaptation&lt;/em&gt; of this WSGI
interface is to use WSGI middleware and framework components. With
WSGI we see that &lt;em&gt;just one&lt;/em&gt; well-defined, consensus interface has
become an amazing source of creativity and pluggability within web
development. With the ZCA we are able to define &lt;em&gt;more than one&lt;/em&gt;
interface in our applications, and potentially create ecosystems of
creativity around those. Not that this is easy, but at least we have a
mechanism and method to do so.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
&lt;h1&gt;&lt;a id=&quot;the-zca-is-successful&quot; name=&quot;the-zca-is-successful&quot;&gt;The ZCA is successful&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Why do I say the Zope Component Architecture (ZCA) is successful? It's
successful as it's &lt;em&gt;being used&lt;/em&gt;, by many people, for many years
now. Of course you can say it's only used by that weird Zope
community, and a bit by weird Twisted people as well perhaps. That's
fine, but realize that the wider Zope community is &lt;em&gt;big&lt;/em&gt; and is made
of many parts: Plone, Silva, Zope 2, Zope Toolkit, Grok. I'll also
count BFG as part of the wider Zope community.&lt;/p&gt;
&lt;p&gt;The ZCA is successful for &lt;em&gt;me&lt;/em&gt;. Without it, I'd have to invent
something very much like it. It comes back in much code that I've
written. I'm able to do all kinds of small, cool things in my
applications and libraries on a daily basis, and I'm creating more
reusable code as a result.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
&lt;h1&gt;&lt;a id=&quot;frustration-with-the-zca&quot; name=&quot;frustration-with-the-zca&quot;&gt;Frustration with the ZCA&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The ZCA isn't perfect. Humans aren't perfect, either. It's not easy to
create good reusable interfaces, or to build pluggable frameworks and
applications. It's easy to overdo the pluggability. It's easy to
create the wrong pluggability points. It can get overly complex and
overwhelming.&lt;/p&gt;
&lt;p&gt;Writing XML configuration files to glue things together can be
cumbersome and lead to repeating yourself, though his last issue has
been overcome for some time now by the Grok project and its reusable
solution (&lt;a class=&quot;reference&quot; href=&quot;http://pypi.python.org/pypi/grokcore.component&quot;&gt;grokcore.component&lt;/a&gt;) is available to everybody.&lt;/p&gt;
&lt;p&gt;It's easy to let the pain of the mistakes in the use of the ZCA, and
the pain of complex applications in which it is used in general,
overshadow the many successes of the ZCA: in a large part thanks to to
the ZCA's ability to glue things together people are able to use Zope
Toolkit libraries within a Zope 2 or Plone context. Grok was able to
remix the Zope Toolkit in part because we could easily modify and
extend the framework. I think the web frameworks that use the ZCA
offer pluggability and flexibility unrivaled by the competition.&lt;/p&gt;
&lt;p&gt;We generally don't say that the problems and complexities in our large
libraries and applications are due to the Python programming
language. While Python isn't perfect, we tend to think overall it
helps. I also tend to think that the ZCA helps.&lt;/p&gt;
&lt;p&gt;Are there alternatives to the ZCA? Certainly: any library or
application specific pluggability system is an alternative. Sometimes
a specific approach is better than a generic one. It can be easier
to understand it's smaller.&lt;/p&gt;
&lt;p&gt;Usually I'd say it's the other way around. Each custom pluggability
system is another one to learn, and has its own limitations. I've
found multiple times that I can make a far more powerful pluggability
system for a library in a shorter time if I build it on top of the
ZCA.&lt;/p&gt;
&lt;p&gt;There are also more general approaches where there's at least some
overlap with the ZCA: setuptools entry points, WSGI middleware, and
PEAK-Rules. To use any of them for pluggability and overriding one
needs to have a notion of an interface one can implement and plug
into, a notion that the ZCA makes explicit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
&lt;h1&gt;&lt;a id=&quot;conclusions&quot; name=&quot;conclusions&quot;&gt;Conclusions&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The ZCA is useful. The ZCA is powerful. The ZCA is successful. The ZCA
is imperfect. When I've run into its imperfections I've helped build
solutions on top of it, such as Grok's in-python gluing
approach. Sometimes I've considered its use overkill and gone for some
other approach. I think it's useful to step back and consider
alternative approaches.  But let's consider them in the light of the
success of the ZCA as much as in the light of its flaws.&lt;/p&gt;
&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-06T20:33:52+00:00</dc:date>
</item>
<item rdf:about="http://pyre.third-bit.com/blog/archives/3142.html">
	<title>Greg Wilson: Misa Sakamoto on DB2 Technology Explorer</title>
	<link>http://pyre.third-bit.com/blog/archives/3142.html</link>
	<content:encoded>&lt;p&gt;One of our PEY students, Misa Sakamoto, has an article up on DeveloperWorks about &lt;a href=&quot;http://www.ibm.com/developerworks/data/library/techarticle/dm-0911techexplorerdb2auth/index.html&quot;&gt;the stuff she&amp;#8217;s doing at IBM&lt;/a&gt; &amp;#8212; yay!&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-06T19:31:00+00:00</dc:date>
</item>
<item rdf:about="http://jcalderone.livejournal.com/53074.html">
	<title>Jean-Paul Calderone: Twisted Web in 60 seconds: HTTP authentication</title>
	<link>http://jcalderone.livejournal.com/53074.html</link>
	<content:encoded>&lt;p&gt;
Welcome to the 14th installment of &quot;Twisted Web in 60 seconds&quot;. In many of the previous installments, I've demonstrated how to serve content by using existing resource classes or implementing new ones. In this installment, I'll demonstrate how you can use Twisted Web's basic or digest HTTP authentication to control access to these resources.
&lt;/p&gt; &lt;p&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/documents/current/api/twisted.web.guard.html&quot;&gt;Guard&lt;/a&gt;, the Twisted Web module which provides most of the APIs which will be used in this example, helps you to add &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Authentication&quot;&gt;authentication&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Authorization&quot;&gt;authorization&lt;/a&gt; to a resource hierarchy. It does this by providing a resource which implements &lt;code&gt;getChild&lt;/code&gt; to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jcalderone.livejournal.com/48953.html&quot;&gt;return a dynamically selected resource&lt;/a&gt;. The selection is based on the authentication headers in the request. If those headers indicate the request is made on behalf of Alice, then Alice's resource will be returned. If they indicate it was made on behalf of Bob, his will be returned. If the headers contain invalid credentials, an error resource is returned. Whatever happens, once this resource is returned, URL traversal continues as normal from that resource.
&lt;/p&gt; &lt;p&gt;
The resource which implements this is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/documents/current/api/twisted.web.guard.HTTPAuthSessionWrapper.html&quot;&gt;HTTPAuthSessionWrapper&lt;/a&gt;, though it is directly is directly responsible for very little of the process. It will extract headers from the request and hand them off to a credentials factory to parse them according to the appropriate standards (eg &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://tools.ietf.org/html/rfc2617&quot;&gt;HTTP Authentication: Basic and Digest Access Authentication&lt;/a&gt;) and then it hands the resulting credentials object off to a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/documents/current/api/twisted.cred.portal.Portal.html&quot;&gt;portal&lt;/a&gt;, the core of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/projects/core/documentation/howto/cred.html&quot;&gt;Twisted Cred&lt;/a&gt;, a system for uniform handling of authentication and authorization. I am not going to discuss Twisted Cred in much depth here. To make use of it with Twisted Web, the only thing you really need to know is how to implement a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/documents/current/api/twisted.cred.portal.IRealm.html&quot;&gt;realm&lt;/a&gt;.
&lt;/p&gt; &lt;p&gt;
You need to implement a realm because the realm is the object which actually decides which resources are used for which users. This can be as complex or as simple as it suitable for your application. For this example, I'll keep it very simple: each user will have a resource which is a static file listing of the &lt;code&gt;public_html&lt;/code&gt; directory in their UNIX home directory. First, I need to import &lt;code&gt;implements&lt;/code&gt; from &lt;code&gt;zope.interface&lt;/code&gt; and &lt;code&gt;IRealm&lt;/code&gt; from &lt;code&gt;twisted.cred.portal&lt;/code&gt;. Together these will let me mark this class as a realm (this is mostly - but notentirely - a documentation thing). I'll also need &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/documents/current/api/twisted.web.static.File.html&quot;&gt;File&lt;/a&gt; for the actual implementation later.
&lt;/p&gt; &lt;pre&gt; &amp;nbsp;from zope.interface import implements&lt;br /&gt;&lt;br /&gt; &amp;nbsp;from twisted.cred.portal import IRealm&lt;br /&gt; &amp;nbsp;from twisted.web.static import File&lt;br /&gt;&lt;br /&gt; &amp;nbsp;class PublicHTMLRealm(object):&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;implements(IRealm)&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;
A realm only needs to implement one method, &lt;code&gt;requestAvatar&lt;/code&gt;. This is called after any successful authentication attempt (ie, Alice supplied the right password). Its job is to return the &lt;em&gt;avatar&lt;/em&gt; for the user who succeeded in authenticating. An &lt;em&gt;avatar&lt;/em&gt; is just an object that represents a user. In this case, it will be a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/documents/current/api/twisted.web.static.File.html&quot;&gt;File&lt;/a&gt;. In general, with Guard, the avatar must be a resource of some sort.
&lt;/p&gt; &lt;pre&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;def requestAvatar(self, avatarId, mind, *interfaces):&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if IResource in interfaces:&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (IResource, File(&quot;/home/%s/public_html&quot; % (avatarId,)), lambda: None)&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;raise NotImplementedError()&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;
A few notes on this method:
&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The avatarId parameter is essentially the username. It's the job of some other code to extract the username from the request headers and make sure it gets passed here.&lt;/li&gt; &lt;li&gt;The mind is always &lt;code&gt;None&lt;/code&gt; when writing a realm to be used with Guard. You can ignore it until you want to write a realm for something else.&lt;/li&gt; &lt;li&gt;Guard always passed &lt;code&gt;IResource&lt;/code&gt; for the &lt;code&gt;interfaces&lt;/code&gt; parameter. If &lt;code&gt;interfaces&lt;/code&gt; only contains interfaces your code doesn't understand, raising &lt;code&gt;NotImplementedError&lt;/code&gt; is the thing to do, as above. You'll only need to worry about getting a different interface when you write a realm for something other than Guard.&lt;/li&gt; &lt;li&gt;If you want to track when a user &lt;em&gt;logs out&lt;/em&gt;, that's what the last element of the returned tuple is for. It will be called when this avatar logs out. &lt;code&gt;lambda: None&lt;/code&gt; is the idiomatic no-op logout function.&lt;/li&gt; &lt;li&gt;Notice that I have written the path handling code in this example very poorly. This example may be vulnerable to certain unintentional information disclosure attacks. This sort of problem is exactly the reason &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twistedmatrix.com/documents/current/api/twisted.python.filepath.FilePath.html&quot;&gt;FilePath&lt;/a&gt; exists. However, that's an example for another day...
&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;
We're almost ready to set up the resource for this example. To create an &lt;code&gt;HTTPAuthSessionWrapper&lt;/code&gt;, though, we need two things. First, a portal, which requires the realm above, plus at least one credentials checker:
&lt;/p&gt; &lt;pre&gt; &amp;nbsp;from twisted.cred.portal import Portal&lt;br /&gt; &amp;nbsp;from twisted.cred.checkers import FilePasswordDB&lt;br /&gt;&lt;br /&gt; &amp;nbsp;portal = Portal(PublicHTMLRealm(), [FilePasswordDB('httpd.password')])&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;
&lt;code&gt;FilePasswordDB&lt;/code&gt; is that credentials checker I mentioned. It knows how to read passwd(5)-style (loosely) files to check credentials against. It is responsible for the &lt;em&gt;authentication&lt;/em&gt; work after &lt;code&gt;HTTPAuthSessionWrapper&lt;/code&gt; extracts the credentials from the request.
&lt;/p&gt; &lt;p&gt;
Next we need either &lt;code&gt;BasicCredentialFactory&lt;/code&gt; or &lt;code&gt;DigestCredentialFactory&lt;/code&gt;. The former knows how to challenge HTTP clients to do basic authentication; the latter, digest authentication. I'll use digest here:
&lt;/p&gt; &lt;pre&gt; &amp;nbsp;from twisted.web.guard import DigestCredentialFactory&lt;br /&gt;&lt;br /&gt; &amp;nbsp;credentialFactory = DigestCredentialFactory(&quot;md5&quot;, &quot;example.org&quot;)&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;
The two parameters to this constructor are the &lt;em&gt;hash algorithm&lt;/em&gt; and the &lt;em&gt;http authentication realm&lt;/em&gt; which will be used. The only other valid hash algorithm is &lt;code&gt;&quot;sha&quot;&lt;/code&gt; (but be careful, MD5 is more widely supported than SHA). The http authentication realm is mostly just a string that is presented to the user to let them know why they're authenticating (you can read more about this in the RFC).
&lt;/p&gt; &lt;p&gt;
With those things created, we can finally instantiate &lt;code&gt;HTTPAuthSessionWrapper&lt;/code&gt;:
&lt;/p&gt; &lt;pre&gt; &amp;nbsp;from twisted.web.guard import HTTPAuthSessionWrapper&lt;br /&gt;&lt;br /&gt; &amp;nbsp;resource = HTTPAuthSessionWrapper(portal, [credentialFactory])&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;
There's just one last thing that needs to be done here. When I introduced &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jcalderone.livejournal.com/50056.html&quot;&gt;rpy scripts&lt;/a&gt;, I mentioned that they're evaluated in an unusual context. This is the first example which actually needs to take this into account. It so happens that &lt;code&gt;DigestCredentialFactory&lt;/code&gt; instances are actually stateful. Authentication will only succeed if the same instance is used to generate challenges and examine the responses to those challenges. However, the normal mode of operation for an rpy script is for it to be re-executed for every request. This leads to a new &lt;code&gt;DigestCredentialFactory&lt;/code&gt; being created for every request, preventing any authentication attempt from ever succeeding.
&lt;/p&gt; &lt;p&gt;
There are two ways to deal with this. First, the better of the two ways, I could move almost all of the code into a real Python module, including the code which instantiates the &lt;code&gt;DigestCredentialFactory&lt;/code&gt;. This would make ensure the same instance was used for every request. Second, the easier of the two ways, I could add a call to &lt;code&gt;cache&lt;/code&gt; to the beginning of the rpy script:
&lt;/p&gt; &lt;pre&gt; &amp;nbsp;cache()&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;
&lt;code&gt;cache&lt;/code&gt; is part of the globals of any rpy script, so you don't need to import it (it's okay to be cringing at this point). Calling &lt;code&gt;cache&lt;/code&gt; makes Twisted re-use the result of the first evaluation of the rpy script for subsequent requests too. Just what I want in this case.
&lt;/p&gt; &lt;p&gt;
Here's the complete example (with imports re-arranged to the more conventional style):
&lt;/p&gt; &lt;pre&gt;cache()&lt;br /&gt;&lt;br /&gt;from zope.interface import implements&lt;br /&gt;&lt;br /&gt;from twisted.cred.portal import IRealm, Portal&lt;br /&gt;from twisted.cred.checkers import FilePasswordDB&lt;br /&gt;from twisted.web.static import File&lt;br /&gt;from twisted.web.resource import IResource&lt;br /&gt;from twisted.web.guard import HTTPAuthSessionWrapper, DigestCredentialFactory&lt;br /&gt;&lt;br /&gt;class PublicHTMLRealm(object):&lt;br /&gt; &amp;nbsp; &amp;nbsp;implements(IRealm)&lt;br /&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;def requestAvatar(self, avatarId, mind, *interfaces):&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if IResource in interfaces:&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (IResource, File(&quot;/home/%s/public_html&quot; % (avatarId,)), lambda: None)&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;raise NotImplementedError()&lt;br /&gt;&lt;br /&gt;portal = Portal(PublicHTMLRealm(), [FilePasswordDB('httpd.password')])&lt;br /&gt;&lt;br /&gt;credentialFactory = DigestCredentialFactory(&quot;md5&quot;, &quot;localhost:8080&quot;)&lt;br /&gt;resource = HTTPAuthSessionWrapper(portal, [credentialFactory])&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;
And voila, a password-protected per-user Twisted Web server.
&lt;/p&gt; &lt;p&gt;
I've gotten several requests to write something about sessions, so there's a good chance that's what you'll find in the next installment.
&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-06T15:08:26+00:00</dc:date>
</item>
<item rdf:about="http://pkaudio.blogspot.com/2009/11/interesting-thread-problem.html">
	<title>Patrick Stinson: An interesting thread problem</title>
	<link>http://pkaudio.blogspot.com/2009/11/interesting-thread-problem.html</link>
	<content:encoded>&lt;span&gt;Interesting problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I am trying to flesh out the thread locking for our embedded python interpreter. A user can write scripts for our application, and if a script defines a callback it can respond to events from the application (like a midi note or musical clock tick).&lt;br /&gt;&lt;br /&gt;As it stands, we are not using process migration to allow for true multiprocessing, but instead are just hamming a single lock from multiple threads to protect the CPython library. This is good enough for now - it works quite well at relatively low latencies.&lt;br /&gt;&lt;br /&gt;I compiled python without thread management to avoid an incredible number of 'NULL tstate' errors caused by unpredictable thread management by sequencing host applications. The app is solid, but now I want to integrate a simple stack frame mechanism to allow scripts to behave a little better when calling other scripts. Short intro, but the details don't matter anyway...&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Here's the deal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have one audio engine per thread, and several scripts per engine. The currently executing script is stored as a pointer on the engine object using my function setActiveScript(), and when a new script is called it is swapped with the current one, much like PyThreadState_Swap(). This in effect creates a stack of scripts in the engine, where when execution returns to the original script NULL is passed to setActiveScript().&lt;br /&gt;&lt;br /&gt;This works great, but when there is more than one engine (and so more than one thread), I need to acquire a critical section lock and swap the engine for another one, while maintaining the current script on that engine. The script pointer is stored in the engine, but where to enter and exit the critical section is tough. Hairy.&lt;br /&gt;&lt;br /&gt;The function looks like this:&lt;br /&gt;&lt;br /&gt;Script *ScriptingApplication::instance()-&gt;setActiveScript(Script *)&lt;br /&gt;&lt;br /&gt;I haven't written much complex code in the last while, so lining out the algorithm and thread locks is kind of clunky at best. it doesn't help that Ableton Live (a host that loads our audio plugin) suddenly doesn't want to be debugged.&lt;br /&gt;&lt;br /&gt;*crash*. uggh.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/130402213334709639-3282047014695827839?l=pkaudio.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-06T12:55:14+00:00</dc:date>
</item>
<item rdf:about="http://simonwillison.net/2009/Nov/6/neopythonic/">
	<title>Simon Willison: Python in the Scientific World</title>
	<link>http://simonwillison.net/2009/Nov/6/neopythonic/</link>
	<content:encoded>&lt;div class=&quot;blogmark segment&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://neopythonic.blogspot.com/2009/11/python-in-scientific-world.html&quot;&gt;Python in the Scientific World&lt;/a&gt;. Python continues to make strides in the scientific world—and the Hubble Space Telescope team have been using it for 10 years!&lt;/p&gt;
&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-06T11:04:04+00:00</dc:date>
</item>
<item rdf:about="http://slott-softwarearchitect.blogspot.com/2009/11/bbedit-configuration.html">
	<title>S. Lott: BBEdit Configuration</title>
	<link>http://slott-softwarearchitect.blogspot.com/2009/11/bbedit-configuration.html</link>
	<content:encoded>After installing Python 2.6 in Mac OS X, I had problems with BBEdit not finding the right version of Python.  It kept running an old 2.5 version.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I finally tracked down the BBEdit documentation, http://pine.barebones.com/manual/BBEdit_9_User_Manual.pdf.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Found this:  &quot;BBEdit expects to find Python in &lt;span class=&quot;Apple-style-span&quot;&gt;/usr/bin&lt;/span&gt;, &lt;span class=&quot;Apple-style-span&quot;&gt;/usr/local/bin&lt;/span&gt;, or &lt;span class=&quot;Apple-style-span&quot;&gt;/sw/bin&lt;/span&gt;. If you have installed Python elsewhere, you must create a symbolic link in &lt;span class=&quot;Apple-style-span&quot;&gt;/usr/local/bin&lt;/span&gt; pointing to your copy of Python in order to use pydoc and the Python debugger.&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Checked in &lt;span class=&quot;Apple-style-span&quot;&gt;/usr/bin&lt;/span&gt; and found an old Python there.  I think Fink did that.  Removed it and BBEdit is much happier.  As is Komodo Edit.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/684183198890094283-8590203215247302804?l=slott-softwarearchitect.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-06T10:07:37+00:00</dc:date>
</item>
<item rdf:about="http://thomas.apestaart.org/log/?p=1061">
	<title>Thomas Vander Stichele: Dedicated separate Firefox windows</title>
	<link>http://thomas.apestaart.org/log/?p=1061</link>
	<content:encoded>&lt;p&gt;Dear intarweb,&lt;/p&gt;
&lt;p&gt;here&amp;#8217;s what I&amp;#8217;d like to be able to do.  I would like to start a completely separate Firefox window, in a separate process, with a given webpage.  This process should be completely separate from my regular browsing, not take new links in its window when I click links somewhere else (usually they go to the most recently opened window), not crash when the regular firefox process crashes, and not bog down because my regular firefox goes to 100% CPU and beyond.&lt;/p&gt;
&lt;p&gt;It seems to be hard to google for this idea; is it possible ?&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-06T09:59:59+00:00</dc:date>
</item>
<item rdf:about="http://lericson.blogg.se/code/2009/november/multitouch-on-unibody-macbooks.html">
	<title>Ludvig Ericson: Multitouch on Unibody MacBooks</title>
	<link>http://lericson.blogg.se/code/2009/november/multitouch-on-unibody-macbooks.html</link>
	<content:encoded>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;A little known fact about the unibody touchpad is that it can distinguish between up to eleven touch points - i.e., fingers.&lt;/p&gt;
&lt;p&gt;Another little known fact is that the sensor knows about the contact surface area (in terms of ellipsoids).&lt;/p&gt;
&lt;p&gt;Another yet less known fact is that &lt;a href=&quot;http://johan-nordberg.com/&quot;&gt;Johan Nordberg&lt;/a&gt; didn't sleep much last night, and wrote a neat OS X application which simply plots what the trackpad (or Magic Mouse!) is saying about touches.&lt;p&gt;
&lt;p&gt;Download &lt;a href=&quot;http://xn--bl-wia.se/FingerMgmt.zip&quot;&gt;blä.se/FingerMgmt.zip&lt;/a&gt; to try it out.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://bsg.lericson.se/jing/d1f2324eba.png&quot; /&gt;&lt;/p&gt;
&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;http://delicious.com/save?url=http://lericson.blogg.se/http://lericson.blogg.se/code/2009/november/multitouch-on-unibody-macbooks.html&amp;title=Multitouch on Unibody MacBooks&quot;&gt;&lt;img src=&quot;http://static.delicious.com/img/delicious.small.gif&quot; height=&quot;10&quot; width=&quot;10&quot; alt=&quot;Save on Delicious&quot; /&gt; delicious.com&lt;/a&gt;&lt;/p&gt;


&lt;img src=&quot;http://stats.blogg.se/?id=1395964&quot; border=&quot;0&quot; width=&quot;0&quot; height=&quot;0&quot; alt=&quot;&quot; /&gt;</content:encoded>
	<dc:date>2009-11-06T09:56:18+00:00</dc:date>
</item>
<item rdf:about="http://slott-softwarearchitect.blogspot.com/2009/11/parsing-html-from-microsoft-products.html">
	<title>S. Lott: Parsing HTML from Microsoft Products (Like Front Page, etc.)</title>
	<link>http://slott-softwarearchitect.blogspot.com/2009/11/parsing-html-from-microsoft-products.html</link>
	<content:encoded>Ugh.  When you try to parse MS-generated HTML, you find some extension syntax that is completely befuddling.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've tried a few things in the past, none were particularly good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In reading a file recently, I found that even &lt;a href=&quot;http://www.crummy.com/software/BeautifulSoup/&quot;&gt;Beautiful Soup&lt;/a&gt; was unable to prettify or parse it.&lt;/div&gt;&lt;div&gt;The document was filled with &lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;lt;!--[if...]&amp;gt;...&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;/span&gt; constructs that looked vaguely directive or comment-like, but still managed to stump the parser.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The BeautifulSoup parser has a &lt;span class=&quot;Apple-style-span&quot;&gt;markupMassage&lt;/span&gt; parameter that applies a sequence of regexps to the source document to cleanup things that are baffling.  Some things, however, are too complex for simple regexp's.  Specifically, these nested comment-like things were totally confusing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's what I did.  I wrote a simple generator which emitted the text that was unguarded by these things.  The resulting sequence of text blocks could be assembled into a document that BeautifulSoup could parse.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;def clean_directives( page ):&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;Stupid Microsoft &quot;Directive&quot;-like comments!&lt;br /&gt;Must remove all &amp;lt;!--[if...]&amp;gt;...&amp;lt;![endif]--&amp;gt; sequences.  Which can be nested.&lt;br /&gt;Must remove all &amp;lt;![if...]&amp;gt;...&amp;lt;![endif]&amp;gt; sequences.  Which appear to be the nested version.&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;if_endif_pat= re.compile(  r&quot;(\&amp;lt;!-*\[if .*?\]\&amp;gt;)|(&amp;lt;!\[endif\]-*\&amp;gt;)&quot; )&lt;br /&gt;context= []&lt;br /&gt;start= 0&lt;br /&gt;for m in if_endif_pat.finditer( page ):&lt;br /&gt;   if &quot;[if&quot; in m.group(0):&lt;br /&gt;       if start is not None:&lt;br /&gt;           yield page[start:m.start()]&lt;br /&gt;       context.append(m)&lt;br /&gt;       start= None&lt;br /&gt;   elif &quot;[endif&quot; in m.group(0):&lt;br /&gt;       context.pop(-1)&lt;br /&gt;       if len(context) == 0:&lt;br /&gt;           start= m.end()+1&lt;br /&gt;if start is not None:&lt;br /&gt;   yield page[start:]&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/684183198890094283-24164141902509361?l=slott-softwarearchitect.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-06T09:53:15+00:00</dc:date>
</item>
<item rdf:about="http://thomas.apestaart.org/log/?p=1059">
	<title>Thomas Vander Stichele: Best post-sale screen ever</title>
	<link>http://thomas.apestaart.org/log/?p=1059</link>
	<content:encoded>&lt;p&gt;Just gave in to the geeky side of the force this morning and bought a DVD documentary about BBS&amp;#8217;s.  (the version I bought comes with a DVD full with BBS text files, ANSI art, and random crap.)&lt;/p&gt;
&lt;p&gt;After buying, this is the screen I got:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://thomas.apestaart.org/download/tmp/screenshot-order.png&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t think I ever got a chuckle out of what happened right *after* I forked over cash.  Here&amp;#8217;s to you, Bob!&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-06T09:24:09+00:00</dc:date>
</item>
<item rdf:about="http://nedbatchelder.com/blog/200911/continuous_integration_for_python_with_hudson.html">
	<title>Ned Batchelder's blog: Continuous integration for Python with Hudson</title>
	<link>http://nedbatchelder.com/blog/200911/continuous_integration_for_python_with_hudson.html</link>
	<content:encoded>&lt;p&gt;Continuous integration is a great idea: you configure a server to periodically
pull your source code, build it, run the tests, run lint, measure coverage, and
so on.  Then it graphs everything, stores the results for examination, and so on.
&lt;/p&gt;&lt;p&gt;I'd been trying to figure out how to use the
&lt;a href=&quot;https://hudson.dev.java.net/&quot;&gt;Hudson&lt;/a&gt; CI server with Python, and the
few times I tried to get my mind around it, it just wasn't clicking. I happened
to mention my mental block to Joe Heck, and a few days later, he produced
&lt;a class=&quot;offsite&quot; href=&quot;http://www.rhonabwy.com/wp/2009/11/04/setting-up-a-python-ci-server-with-hudson/&quot;&gt;Setting up a python CI server with Hudson&lt;/a&gt;.
It's a great step-by-step how-to covering everything you need to get Hudson
going for a Python project.
&lt;/p&gt;&lt;p&gt;Running through his guide finally cleared the last misconception for me:
continuous integration isn't a build tool or a test runner.  You don't run
Hudson on your development machine.  Sounds silly, but something needed to clear
it up, and this was it.&lt;/p&gt;&lt;p&gt;Thanks, Joe!&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-06T02:26:32+00:00</dc:date>
</item>
<item rdf:about="http://feedproxy.google.com/~r/PyPyStatusBlog/~3/LNqtYWN8_ng/dusseldorf-sprint-started.html">
	<title>PyPy Development: Düsseldorf Sprint Started</title>
	<link>http://feedproxy.google.com/~r/PyPyStatusBlog/~3/LNqtYWN8_ng/dusseldorf-sprint-started.html</link>
	<content:encoded>The Düsseldorf sprint starts today. Only Samuele and me are there so far, but that should change over the course of the day. We will mostly work on the JIT during this sprint, trying to make it a lot more practical. For that we need to decrease its memory requirements some more and to make it use less aggressive inlining. We will post more as the sprint progresses.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3971202189709462152-7608527610228870250?l=morepypy.blogspot.com&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/PyPyStatusBlog/~4/LNqtYWN8_ng&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2009-11-06T01:25:48+00:00</dc:date>
</item>
<item rdf:about="http://blog.dscpl.com.au/2009/09/roadmap-for-python-wsgi-specification.html">
	<title>Graham Dumpleton: A roadmap for the Python WSGI specification.</title>
	<link>http://blog.dscpl.com.au/2009/09/roadmap-for-python-wsgi-specification.html</link>
	<content:encoded>EDIT: Note that the discussion around this on the Python WEB-SIG went round in many circles and died. Thus nothing much here came into being and thus should be viewed merely for amusement value and not taken as being any indicator of any sort of reality.The discussion on the Python WEB-SIG about what to do about WSGI and Python 3.X has been going round and round in circles for some time now</content:encoded>
	<dc:date>2009-11-06T00:43:34+00:00</dc:date>
</item>
<item rdf:about="http://ericholscher.com/blog/2009/nov/5/adding-testing-pip/">
	<title>Eric Holscher: Adding testing to pip</title>
	<link>http://ericholscher.com/blog/2009/nov/5/adding-testing-pip/</link>
	<content:encoded>&lt;p&gt;Python packaging has been in a bit of a state of disarray for as long as I've been using it. Pip has come along to make installing python packages easier. It has a lot of features that are useful, but they have been talked about in many other blog posts.
&lt;/p&gt;
&lt;p&gt;Today I want to talk about adding testing to pip. If you are familiar with the Perl community, then you probably know about &lt;a href=&quot;http://cpan.org/&quot;&gt;CPAN&lt;/a&gt;. It is basically Pypi for Perl. They have a command, called cpan, which allows you to install packages in a similar way to pip.
&lt;/p&gt;
&lt;p&gt;One of the steps that a package goes through before being installed on your system is that the tests are run. This allows you to know if the package that you have installed is actually going to work on your system. It may be broken on your platform, or you may be missing a library that it thought you had. Currently, pip has no way to test packages when they are being installed. I went looking for a way to make that happen.
&lt;/p&gt;
&lt;p&gt;It should be noted that pip is based on setuptools. Setuptools is what parses and understands most of the logic inside of your setup() function in the setup.py for your project (which you have, right?). Setuptools has an option called &lt;code&gt;test_suite&lt;/code&gt;, which allows you to run &lt;a href=&quot;http://peak.telecommunity.com/DevCenter/setuptools#test-build-package-and-run-a-unittest-suite&quot;&gt;setup.py test&lt;/a&gt; on your package, and have it run the unit tests. This is done by calling whatever python function is defined in &lt;code&gt;test_suite&lt;/code&gt;. 
&lt;/p&gt;
&lt;p&gt;I added the ability for pip to run &lt;code&gt;setup.py test&lt;/code&gt; on a package that it is installing. It is executed by running &lt;code&gt;pip install --test &amp;lt;package&amp;gt;&lt;/code&gt;. The implementation is on a &lt;a href=&quot;http://bitbucket.org/ianb/pip/issue/11/allow-tests-to-be-run-upon-install&quot;&gt;ticket&lt;/a&gt; on bitbucket, and in a &lt;a href=&quot;http://github.com/ericholscher/pip/tree/test_command&quot;&gt;repository&lt;/a&gt; on github.
&lt;/p&gt;
&lt;p&gt;If you want to check it out, go ahead and clone my repo and check out the test_command branch. Then you can simply run
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python pip.py install --test wsgiref
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;for an example package. If a package doesn't have a &lt;code&gt;test_suite&lt;/code&gt;, then it simply doesn't run anything.
&lt;/p&gt;
&lt;p&gt;Note that if the tests fail, it doesn't impact the installation of the package. The python community's tests aren't quite good enough,and almost any Django package you try this on will not have any tests. I wrote about how to &lt;a href=&quot;http://ericholscher.com/blog/2009/jun/29/enable-setuppy-test-your-django-apps/&quot;&gt;add testing to your django package&lt;/a&gt;, but the process is long and involved. I'm working to improve the situation for Django and hopefully having the ability to run tests in the package management tool will spur people to add testing ability to their setup scripts!
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://somethingaboutorange.com/mrl/projects/nose/0.11.1/&quot;&gt;Nose&lt;/a&gt; makes this really easy, by simply adding &lt;code&gt;test_suite = 'nose.collector'&lt;/code&gt; to your setup.py, nose will run your tests correctly. This is the level of support that I am hoping to implement for Django. 
&lt;/p&gt;
&lt;p&gt;On a side node, I talked to &lt;a href=&quot;http://blog.ianbicking.org/&quot;&gt;Ian Bicking&lt;/a&gt; about this, and he suggested writing the test command as a separate command, so you would be able to do &lt;code&gt;pip test wsgiref&lt;/code&gt;, if it was installed. This has some other problems, which I will talk about after I have implemented this functionality.
&lt;/p&gt;
&lt;p&gt;I would love to hear feedback, or if anyone has ideas for improving testing in the python and django communities. I have lots of ideas, and I will be writing more of them up over the following weeks.
&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-06T00:38:04+00:00</dc:date>
</item>
<item rdf:about="http://www.python.org/news/index.html#Thu5Nov2009184600-0500">
	<title>Python News: SciPy India Call for Papers</title>
	<link>http://www.python.org/news/index.html#Thu5Nov2009184600-0500</link>
	<content:encoded>&lt;!--utf-8--&gt;&lt;!--0.5--&gt;




&lt;p&gt;SciPy India 2009 -- Call for Presentations The first &lt;a class=&quot;reference external&quot; href=&quot;http://scipy.in&quot;&gt;Scientific Computing with Python conference in India&lt;/a&gt; has announced its &lt;a class=&quot;reference external&quot; href=&quot;http://scipy.in/talks-cfp/&quot;&gt;Call for Presentations&lt;/a&gt;.  The conference will be held at the &lt;a class=&quot;reference external&quot; href=&quot;http://www.technopark.org/&quot;&gt;Technopark&lt;/a&gt; in Trivandrum, Kerala, India from December 12th to 17th, 2009.&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-05T23:46:00+00:00</dc:date>
</item>
<item rdf:about="http://mockit.blogspot.com/2009/11/emperors-new-clothes.html">
	<title>Malthe Borch: Emperor's new clothes</title>
	<link>http://mockit.blogspot.com/2009/11/emperors-new-clothes.html</link>
	<content:encoded>The &lt;a href=&quot;http://wiki.zope.org/zope3/ComponentArchitectureOverview&quot;&gt;Zope Component Architecture&lt;/a&gt; is often touted for letting you override so-called components which have already been registered elsewhere (by a library, out of your immediate control).&lt;br /&gt;&lt;br /&gt;It's &lt;span&gt;wrong&lt;/span&gt; (edit: to clarify, using the overriding facility of the ZCA is wrong, and by extension, to use the ZCA &lt;span&gt;because&lt;/span&gt; you can override components, is wrong too; I do not mean to suggest that the use of ZCA is misguided in general).&lt;br /&gt;&lt;br /&gt;Shrink-wrap software is a circumstance. If you must change it from outside (instead of &lt;a href=&quot;http://mockit.blogspot.com/2009/08/singing-and-branching.html&quot;&gt;branching&lt;/a&gt;, which is a fine approach in many cases), just go ahead and update the functions or classes in question using the &lt;a href=&quot;http://mail.python.org/pipermail/edu-sig/2007-February/007787.html&quot;&gt;reload approach&lt;/a&gt; (object identity changes should be avoided at all costs).&lt;br /&gt;&lt;br /&gt;There's nothing wrong with ZCA; it's in my view a misunderstanding to employ it for web application development at large. Rather, it's applicable for deployments that require live software component introspection. I don't know that web applications need this in general. What happens is that frameworks like &lt;a href=&quot;http://docs.zope.org/zopetoolkit/&quot;&gt;Zope Toolkit&lt;/a&gt; and &lt;a href=&quot;http://www.plone.org/&quot;&gt;Plone&lt;/a&gt; use these introspection features to map requests to code. That's a bit like using &lt;a href=&quot;http://en.wikipedia.org/wiki/Radio-frequency_identification&quot;&gt;RDIF&lt;/a&gt; tags for consumption tracking (hint: require credit card payment or identity-based rebate instead).&lt;br /&gt;&lt;br /&gt;Most software is misunderstood. How to use it, when to use it. Sometimes it's worth the while to retrace your steps to learn why you ended up using a particular software.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8212254010436871241-4433996884499631327?l=mockit.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-05T23:29:00+00:00</dc:date>
</item>
<item rdf:about="http://lazypython.blogspot.com/2009/11/pycon-program-committee-and-my-pycon.html">
	<title>Alex Gaynor: The Pycon Program Committee and my PyCon Talk</title>
	<link>http://lazypython.blogspot.com/2009/11/pycon-program-committee-and-my-pycon.html</link>
	<content:encoded>Last year I presented at a conference for the first time in my life at PyCon, I moderated a panel on ORMs and I enjoyed it a ton (and based on the feedback I've gotten at least a few people enjoyed attending it).  Above and beyond that the two PyCons I've attended have both been amazing conferences, tons of awesome talks, great people to hang out with, and an awesome environment for maximizing both.  For both of the last two years I've hung around the PyCon organizers mailing list since the conference was in Chicago and I lived there, however this year I really wanted to increase my contributions to such a great conference.  Therefore, I joined the Pycon program committee.  This committee is responsible for reviewing all talk submissions and selecting the talks that will ultimately appear at PyCon.&lt;br /&gt;&lt;br /&gt;This year the PyCon programming committee had a really gargantuan task.  There were more talks submitted then ever before, more than 170 of them, for only 90 or so slots.  Unfortunately this meant that we had to reject some really good talks, which always sucks.  There's been a fair bit of discussion about the process this year and what can be done to improve it.  As a reviewer the one thing I wish I'd known going in was that the votes left on talks were just a first round, and ultimately didn't count for a huge amount.  Had I known this I would have been less tepid in giving positive reviews to talks which merely looked interesting.&lt;br /&gt;&lt;br /&gt;Another hot topic in the aftermath is whether or not the speaker's identity should factor into a reviewer's decision.  My position is that it should wherein the speaker has a reputation, be it good or bad.  If I know a speaker is awesome I'm way more likely to give them the +1, likewise if I see a speaker has a history of poor talks I'm more likely to give them a -1.  That being said I don't think new speakers, or slightly inexperienced ones should be penalized for that, I was a brand new speaker last time and I'm grateful I was given the chance to present.&lt;br /&gt;&lt;br /&gt;To give an example of this one of the talks I'm really looking forward to is Mark Ramm's, &quot;To relate or not to relate, that is the question&quot;.  Mark and I spoke about this topic for quite a while at PyOhio, and every talk from Mark I've ever seen has been excellent.  Therefore I was more than willing to +1 it.  However, had I not known the speaker it would still have been a good proposal, and an interesting topic, I just would not have gotten immediately excited about going to see the talk.&lt;br /&gt;&lt;br /&gt;As an attendee one of the things I've always found is that speakers who are very passionate about their topics almost always give talks I really enjoy.  Thinking back to my first PyCon Maciej Fijalkowski managed to get me excited and interested in PyPy in just 30 minutes, because he was so passionate in speaking about the topic.&lt;br /&gt;&lt;br /&gt;All that being said I wanted to share a short list of the talks I'm excited about this year, before I dive into what my own talk will be about:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Optimizations And Micro-Optimizations In CPython&lt;/li&gt;&lt;li&gt;Unladen Swallow: fewer coconuts, faster Python&lt;/li&gt;&lt;li&gt;Managing the world's oldest Django project&lt;/li&gt;&lt;li&gt;Understanding the Python GIL&lt;/li&gt;&lt;li&gt;The speed of PyPy&lt;/li&gt;&lt;li&gt;Teaching compilers with python&lt;/li&gt;&lt;li&gt;To relate or not to relate, that is the question&lt;/li&gt;&lt;li&gt;Modern version control: Mercurial internals&lt;/li&gt;&lt;li&gt;Eventlet: Asynchronous I/O with a synchronous interface&lt;/li&gt;&lt;li&gt;Hg and Git : Can't we all just get along?&lt;/li&gt;&lt;li&gt;Mastering Team Play: Four powerful examples of composing Python tools&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;It's a bit of a long list, but compared to the size of the list of accepted talks I'm sure there are quite a few gems I've missed.&lt;br /&gt;&lt;br /&gt;The talk I'm going to be giving this year is about the real time web, also known as HTTP push, Comet, or reverse Ajax.  All of those are basically synonyms for the server being able to push data to the browser, rather than having the browser constantly poll the server for data.  Specifically I'm going to be looking at my experience building three different things, LeafyChat, DjangoDose's DjangoCon stream, and Hurricane.&lt;br /&gt;&lt;br /&gt;Leafychat is an IRC client built for the DjangoDash by myself, Leah Culver, and Chris Wanstrath.  The DjangoDose DjangoCon stream was a live stream of all the Twitter items about DjangoCon that Eric Florenzano and I built in the week leading up to DjangoCon.  Finally, Hurricane is the library Eric Florenzano and I have been working on in order to abstract the lessons learned from our experience building &quot;real time&quot; applications in Python.&lt;br /&gt;&lt;br /&gt;In the talk I'm going to try to zero in on what we did for each of these projects, what worked, what didn't, and what I'm taking away from the experience.  Finally, Eric Florenzano and I are working to put together a new updated, better version of the DjangoCon stream for PyCon.  I'm going to discuss what we do with that project, and why we do it that way in light of the lessons of previous projects.&lt;br /&gt;&lt;br /&gt;I'm hoping both my talk, and all of them will be awesome.  One thing's for sure, I'm already looking forward to PyCon 2010.  Tomorrow I'm going to be writing about my thoughts on a more ideal template tag definition syntax for Django, and hopefully sharing some code if I have time to start working on it.  See you then (and in Atlanta ;))!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7176062489626496619-5486694113588267806?l=lazypython.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-05T23:09:02+00:00</dc:date>
</item>
<item rdf:about="http://renesd.blogspot.com/2009/11/rakarrack-is-decent-effects-rack-for.html">
	<title>Rene Dudfield: rakarrack is a decent effects rack for linux</title>
	<link>http://renesd.blogspot.com/2009/11/rakarrack-is-decent-effects-rack-for.html</link>
	<content:encoded>&lt;a href=&quot;http://rakarrack.sourceforge.net/&quot;&gt;rakarrack&lt;/a&gt; is a decent effects rack for linux.  &lt;br /&gt;&lt;br /&gt;It's not packaged for ubuntu(of course), but is fairly easy to compile.  I've been using the cvs version (yes, people are still quite happily using cvs it seems).&lt;br /&gt;&lt;br /&gt;Once you get it set up you have access to 80 presets of realtime guitar effects(2-40ms depending on your computer sound card setup).&lt;br /&gt;&lt;br /&gt;It works with the jack audio system, so you can route audio into it, and route its audio out to other programs easily enough.  You can also control it with midi(alsa, or jack).  Meaning you can hook it up to a midi controller of some sort.  I've been using it with an maudio axiom 25 controller, and with python scripts via pygame.midi.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://renesd.blogspot.com/2009/11/rakarrack-is-decent-effects-rack-for.html&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_eJJgehXCsQ4/SvNGJ6HUP3I/AAAAAAAAAEs/XSY-5Aaro68/s400/rackarrack.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5400737514180067186&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It even has a very nice help manual integrated into the program... I wish more programs had a good help section.  It details the 17 different effects that come with the program.&lt;br /&gt;&lt;br /&gt;One thing which is a bit funny is that it doesn't use &lt;a href=&quot;http://www.ladspa.org/&quot;&gt;LADSPA&lt;/a&gt; or &lt;a href=&quot;http://lv2plug.in/&quot;&gt;lv2&lt;/a&gt; plugins.  You can of course still use these other plugins through other jack programs if you want.  However the ones it comes with are all fairly good quality from my tinkering.  There is a lot you can do with the various plugins in different orders with different settings in each one.  The 80 presets show a good variations of sounds you can get out of it.&lt;br /&gt;&lt;br /&gt;I've been using it in conjunction with the &lt;a href=&quot;http://www.mixxx.org/&quot;&gt;mixxx&lt;/a&gt; mixing program and the &lt;a href=&quot;http://www.hydrogen-music.org/&quot;&gt;hydrogen&lt;/a&gt; drum machine.  So you don't need to use it just with guitars... any program or audio input will do.&lt;br /&gt;&lt;br /&gt;If you are using guitars it also has a tuner which might come in handy... if you've never quite got the hang of playing that song called Tuning that you hear at the start of every gig.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/10678074-2583167037261338039?l=renesd.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-05T22:01:30+00:00</dc:date>
</item>
<item rdf:about="http://pkaudio.blogspot.com/2009/11/pure-art.html">
	<title>Patrick Stinson: Pure Art</title>
	<link>http://pkaudio.blogspot.com/2009/11/pure-art.html</link>
	<content:encoded>There comes a point when a piece of art is so refined that the products, byproducts, and even messiest and most defiled anty-products of that piece of art look good. The old rule that the back of the cross-stich should look as nice as the front applies throughout all kinds of art, whether it's computer programming, music, or athletic prowess.&lt;br /&gt;&lt;br /&gt;You've got your face deep down in the last algorithm that will finish your crowning achievement of the last nine months of work. The goal is met, the task is complete, but the project is a mess.&lt;br /&gt;&lt;br /&gt;Now its done, and you start polishing and packaging it up, writing API docs, making CD art, distributing re-usable instrument tracks for the rest of the world to see - the piece is packaged and ready to ship.&lt;br /&gt;&lt;br /&gt;Ableton live is one of those pieces of fine art, where the purity of the design lends itself to producing beautiful musical sets, even among some of the crappiest work you've done. The layout of the clips, the coloring and grouping of the built-in tools, everything can end up being a work of art in it's own, not just the final audio dump that you'll stick on your new album.&lt;br /&gt;&lt;br /&gt;Go download the &lt;a href=&quot;http://cdn1.ableton.com/download/8736a17660353a4e1fad57724182aecd/AbleTen_Mum.zip&quot;&gt;free Múm set&lt;/a&gt; on Ableton's site and check out the work that they've done. If you don't have Live just download the free demo.&lt;br /&gt;&lt;br /&gt;First off, everything sounds amazing. Any clip sounds good with any clip. Even a monkey could play a nice sounding song here. This is the meaning of the back of the cross-stitch work. The loops are clean, refined, polished, done.&lt;br /&gt;&lt;br /&gt;They also spelled their name with inactive tracks down at the bottom of the set, and spelled their name again in midi notes in each of those tracks. I know this is poking at nerdy details, but this set just emanates the very cleanliness and artistic presentation that such a flexible tool makes possible. It's just a feeling I get, man.&lt;br /&gt;&lt;br /&gt;This software &lt;span&gt;makes&lt;/span&gt; me want to be creative, whether I like it or not. Not only that, but it plainly shows the way to easy and readily available creativity, without having to wade through the much of documentation and technical cribby-crap.&lt;br /&gt;&lt;br /&gt;Ableton have nailed the solution to the music problem. They have nailed it, and then shown us what we didn't know we wanted to do in the first place. They've redefined the industry. While people preach this crap all the time, you almost never really see it.&lt;br /&gt;&lt;br /&gt;Because of this, Ableton Live is the best piece of software out there.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/130402213334709639-4709054541894079059?l=pkaudio.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-05T21:38:31+00:00</dc:date>
</item>
<item rdf:about="http://slott-softwarearchitect.blogspot.com/2009/11/stored-procedures-and-ad-hominem.html">
	<title>S. Lott: Stored Procedures and Ad Hominem Arguments</title>
	<link>http://slott-softwarearchitect.blogspot.com/2009/11/stored-procedures-and-ad-hominem.html</link>
	<content:encoded>The question of &quot;Stored Procedures and Triggers&quot; comes up fairly frequently.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Over the years (since the 90's, when stored procedures were introduced to Oracle) I've learned precisely how awful a mistake this technology is.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've seen numerous problems that have stored procedures as their root cause.  I'll identify just a few.   These are not &quot;biases&quot; or &quot;opinions&quot;.  These are experience.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;The &quot;DBA as Bottleneck&quot; problem.  In short, the DBA's take projects hostage while the development team waits for stored procedures to be written, corrected, performance tuned or maintained.&lt;/li&gt;&lt;li&gt;The &quot;Data Cartel&quot; problem.  The DBA's own parts of the business process.  They refuse (or complicate) changes to fundamental business rules for obscure database reasons.&lt;/li&gt;&lt;li&gt;The &quot;Unmaintainability&quot; problem.  The stored procedures (and triggers) have reached a level of confusion and complexity that means that it's easier to drop the application and install a new one.&lt;/li&gt;&lt;li&gt;The &quot;Doesn't Break the License&quot; problem.  For some reason, the interpreted and source-code nature of stored procedures makes them the first candidate for customization of purchased applications.  Worse, the feeling is that doing so doesn't (or won't) impair the support agreements.  &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;When I bring these up, I wind up subject to weird &lt;i&gt;ad hominem&lt;/i&gt; attacks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been told (more than once) that I'm not being &quot;balanced&quot; and that stored procedures have &quot;There are pros and cons on both sides&quot;.  This is bunk.  I have plenty of facts.  Stored procedures create a mess.  I've never seen any good come from stored procedures.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't use GOTO's haphazardly.  I don't write procedural spaghetti code.  No one says that I should be more &quot;balanced.&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't create random database structures with 1NF, 2NF and 3NF violations in random places.  No one says I should be more &quot;balanced&quot;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Indeed, asking me to examine my bias is an ad hominem argument.  My fact-based experience with stored procedures is entirely negative.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But when it comes to stored procedures, there's a level of defensiveness that defies my understanding.  I assume Oracle, IBM and Microsoft are paying kickbacks to DBA's to support stored procedures and PL/SQL over the more sensible alternatives.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/684183198890094283-2237607397047546604?l=slott-softwarearchitect.blogspot.com&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2009-11-05T21:07:14+00:00</dc:date>
</item>
<item rdf:about="http://freshfoo.com/blog/disqus">
	<title>Menno's Musings: Why I chose Disqus Comments</title>
	<link>http://freshfoo.com/blog/disqus</link>
	<content:encoded>&lt;p&gt;I recently moved my blog comments away the &lt;a class=&quot;reference external&quot; href=&quot;http://pyblosxom.sourceforge.net/&quot;&gt;PyBlosxom&lt;/a&gt; &lt;a class=&quot;reference external&quot; href=&quot;http://pyblosxom.sourceforge.net/registry/input/comments/comments.html&quot;&gt;comments&lt;/a&gt; plugin
to a hosted system. The main driver was the ability for people to
subscribe to comments for an article using email or RSS. It's a pain
for people to have to check back to the site to see if someone has
replied to their comments. I was also keen on
user-experience-enhancing features such as integration with external
systems like OpenID, Twitter and Yahoo.&lt;/p&gt;
&lt;p&gt;My criteria were:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;email subscription, RSS a bonus&lt;/li&gt;
&lt;li&gt;support for pre-formatted text sections in comments (essential for
code samples)&lt;/li&gt;
&lt;li&gt;an import mechanism for existing comments&lt;/li&gt;
&lt;li&gt;threading of comments to allow commenters to respond to each other
sensibly&lt;/li&gt;
&lt;li&gt;clean look with some ability to customise&lt;/li&gt;
&lt;li&gt;support for a variety of authentication/profile systems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are a number of hosted comment systems out there. The most
popular options seem to be &lt;a class=&quot;reference external&quot; href=&quot;http://disqus.com/&quot;&gt;Disqus&lt;/a&gt;, &lt;a class=&quot;reference external&quot; href=&quot;http://js-kit.com/&quot;&gt;JS-Kit Echo&lt;/a&gt; and
&lt;a class=&quot;reference external&quot; href=&quot;http://www.intensedebate.com/&quot;&gt;IntenseDebate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;IntenseDebate was eliminated first because it doesn't seem to provide
an import mechanism for custom websites. Import only seems to be
supported for well known blog platforms such as Wordpress. There's no
comment API either. The approach seems to be to leave your old comment
system in place and just have new comments go into IntenseDebate. Not
good enough, I wanted to completely replace the existing comments
system.&lt;/p&gt;
&lt;p&gt;After some deliberation I decided on JS-Kit Echo for one tiny reason:
it supports the &amp;lt;pre&amp;gt; tag. The closest Disqus supported was the
&amp;lt;code&amp;gt; tag which doesn't preserve white-space (useless for Python code
samples).&lt;/p&gt;
&lt;p&gt;So I paid my US$12 (it's the only service that doesn't have a free
option) and started looking at how to import my existing comments
using their API ... and quickly found that it sucks. Comments can be
submitted but you can't specify a timestamp so they are dated with the
import date. Far from ideal. Then there's the API for retrieving
comments: it returns the data as JavaScript code (no not JSON)! It's
pretty clear that the API is what they use with the JavaScript for
Echo itself and geared for that use only. They've just thrown it out
there and documented it, warts and all.&lt;/p&gt;
&lt;p&gt;Back to the drawing board.&lt;/p&gt;
&lt;p&gt;The only showstopper for Disqus was the lack of &amp;lt;pre&amp;gt;. Everything else
about it was great: it met all my requirements and the API was clean
and comprehensive. If only there was a way to have properly formatted
source code in the comments.&lt;/p&gt;
&lt;p&gt;Light bulb moment: use a CSS hack to make &amp;lt;code&amp;gt; in comments behave
like &amp;lt;pre&amp;gt;. The trick is to turn code into a block element and change
how white-space is handled. The CSS snippet looks like:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;.dsq-comment-message code {
  display:block;
  white-space:pre;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Works great.&lt;/p&gt;
&lt;p&gt;With the only blocker gone, I wrote a Python script with the help of
Ian Lewis' excellent &lt;a class=&quot;reference external&quot; href=&quot;http://code.google.com/p/disqus-python-client/&quot;&gt;disqus-python-client&lt;/a&gt; package to pull in the
existing comments from the old system. Within an hour or so it was
ready to go.&lt;/p&gt;
&lt;p&gt;Hopefully this article saves someone else some time if they decide to
use one of these systems. Getting things running chewed up a lot more
time then I had expected.&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-05T19:49:00+00:00</dc:date>
</item>

</rdf:RDF>
