<?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="urn:lj:livejournal.com:atom1:william_os4y:8622" />
			<rdf:li rdf:resource="http://ruslanspivak.com/?p=1481" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-1922011022782208121.post-5850828297757600369" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6509482405829300009.post-4321186264014236225" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-1267458971896358542.post-155583094429900030" />
			<rdf:li rdf:resource="http://threebean.wordpress.com/?p=476" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-11802292.post-3828476244816561432" />
			<rdf:li rdf:resource="http://blog.vrplumber.com/index.php?/archives/2558-guid.html" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-5440028356946346379.post-7557804773166326462" />
			<rdf:li rdf:resource="http://blaag.haard.se/Why-Python-is-important-for-you" />
			<rdf:li rdf:resource="http://tomerfiliba.com/blog/Dialog-Toolkit" />
			<rdf:li rdf:resource="http://www.pythondiary.com/blog/Feb.10,2012/tutorials-section-having-issues.html" />
			<rdf:li rdf:resource="http://wxPython.org/blog/?p=96" />
			<rdf:li rdf:resource="http://lucumr.pocoo.org/2012/2/11/appreciating-design" />
			<rdf:li rdf:resource="http://lateral.netmanagers.com.ar/weblog/posts/BB990.html" />
			<rdf:li rdf:resource="http://blog.vrplumber.com/index.php?/archives/2557-guid.html" />
			<rdf:li rdf:resource="http://inventwithpython.com/blog/?p=554" />
			<rdf:li rdf:resource="http://tarekziade.wordpress.com/?p=2338" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-11638628.post-8036558524543417029" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3971202189709462152.post-5386281283454207551" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3971202189709462152.post-7266036404915945090" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-11638628.post-5650980066651779230" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6946125878559207247.post-3329896253329994281" />
			<rdf:li rdf:resource="http://douglatornell.ca/blog/category/python/feed/b'WUPeeI0uL1FcUOvi5z14kt_OpQ4='" />
			<rdf:li rdf:resource="http://emptysquare.net/blog/?p=303" />
		</rdf:Seq>
	</items>
</channel>

<item rdf:about="http://william-os4y.livejournal.com/8622.html">
	<title>William's Journal: Fapws3-0.10 is out</title>
	<link>http://william-os4y.livejournal.com/8622.html</link>
	<content:encoded>Despite lot of progress on the python3 branch, I propose a new release&lt;br /&gt;of Fapws3 for python2.x.&lt;br /&gt;&lt;br /&gt;Indeed, since 1 year (date of the last stable release), lot of new&lt;br /&gt;features have been added into Fapws :-).&lt;br /&gt;And several are coming from, you, the community !!! Thus, I first&lt;br /&gt;thank all contributors (code, tests, ...).&lt;br /&gt;This is a great achievement.&lt;br /&gt;More specifically, I will thank Stiletto, Liu Qishuai and Keith for&lt;br /&gt;their active contributions.&lt;br /&gt;&lt;br /&gt;To make it short, this release comes with the following new features:&lt;br /&gt;- support of tuple for callback output.&lt;br /&gt;- support of socket. Thanks to this, Fapws3 is serving webpages via a&lt;br /&gt;socket instead of a port.&lt;br /&gt;- better support for OSX&lt;br /&gt;&lt;br /&gt;You can download the tarfile from the github website:&lt;br /&gt;&lt;a href=&quot;https://github.com/william-os4y/fapws3&quot; rel=&quot;nofollow&quot;&gt;https://github.com/william-os4y/fapws3&lt;/a&gt;&lt;br /&gt;Or directly via the following link:&lt;br /&gt;&lt;a href=&quot;https://github.com/william-os4y/fapws3/tarball/v0.10&quot; rel=&quot;nofollow&quot;&gt;https://github.com/william-os4y/fapws3/tarball/v0.10&lt;/a&gt;&lt;br /&gt;Pypi users can grab it there too: pip install fapws3&lt;br /&gt;&lt;br /&gt;As said in the &lt;a href=&quot;http://groups.google.com/group/fapws&quot; rel=&quot;nofollow&quot;&gt;mailinglist&lt;/a&gt;, the python3 version of Fapws3 is nearly&lt;br /&gt;out (this release will be backward compatible with python2.7).&lt;br /&gt;Thus I plan to have 2 parallel branches so that there is a need for&lt;br /&gt;python2.5 or 2.6.&lt;br /&gt;This will change in the following months, but currently Fapws3 for&lt;br /&gt;python2.x is in the master branch.</content:encoded>
	<dc:date>2012-02-12T11:41:33+00:00</dc:date>
</item>
<item rdf:about="http://ruslanspivak.com/2012/02/12/crammit-yet-another-asset-packaging-library/">
	<title>Ruslan Spivak: Crammit &amp;#8211; Yet Another Asset Packaging Library</title>
	<link>http://ruslanspivak.com/2012/02/12/crammit-yet-another-asset-packaging-library/</link>
	<content:encoded>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/rspivak/crammit&quot;&gt;Crammit&lt;/a&gt; is really simple. It&amp;#8217;s a small tool that uses YAML for configuration and other libraries to do the heavy lifting.&lt;/p&gt;
&lt;p&gt;Here is a config file &lt;strong&gt;assets.yaml&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;
output: assets    # directory path relative to  current directory
fingerprint: true # add sha1 hash to the output file name

javascript:
  # 'common' is a bundle name
  # output file will have prefix 'common'
  common:
    - static/js/application.js
    - static/js/vendor/*.js
  utils:
    # paths are relative to the current directory
    - static/js/utils.js

css:
  base:
    # you can use Unix shell-style wildcards in file names
    - static/css/*.css
&lt;/pre&gt;
&lt;p&gt;Let&amp;#8217;s put it through its paces:&lt;/p&gt;
&lt;pre class=&quot;brush: bash; title: ; notranslate&quot;&gt;
$ crammit -c assets.yaml
&lt;/pre&gt;
&lt;p&gt;In addition to generated asset bundles it outputs an information file that sums up all what&amp;#8217;s been done.&lt;/p&gt;
&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;
css:
  base:
    fingerprint: 71fe4cba05a1a51023c6af4c4abf9c47ab21e357
    output:
      gz: base-71fe4cba05a1a51023c6af4c4abf9c47ab21e357.min.css.gz
      min: base-71fe4cba05a1a51023c6af4c4abf9c47ab21e357.min.css
      raw: base-71fe4cba05a1a51023c6af4c4abf9c47ab21e357.css
    size:
      gz: 108
      min: 235
      raw: 277
javascript:
  common:
    fingerprint: 6493b619c73c49ce1f4dfe2c31d41902e98acaee
    output:
      gz: common-6493b619c73c49ce1f4dfe2c31d41902e98acaee.min.js.gz
      min: common-6493b619c73c49ce1f4dfe2c31d41902e98acaee.min.js
      raw: common-6493b619c73c49ce1f4dfe2c31d41902e98acaee.js
    size:
      gz: 56
      min: 41
      raw: 50
  utils:
    fingerprint: c3ef63280b954d99e8b13fc11ea3031caee77f1a
    output:
      gz: utils-c3ef63280b954d99e8b13fc11ea3031caee77f1a.min.js.gz
      min: utils-c3ef63280b954d99e8b13fc11ea3031caee77f1a.min.js
      raw: utils-c3ef63280b954d99e8b13fc11ea3031caee77f1a.js
    size:
      gz: 42
      min: 22
      raw: 24
&lt;/pre&gt;
&lt;p&gt;Check it out &lt;a href=&quot;https://github.com/rspivak/crammit&quot;&gt;here&lt;/a&gt; for more information.&lt;/p&gt;</content:encoded>
	<dc:date>2012-02-12T07:34:56+00:00</dc:date>
</item>
<item rdf:about="http://blog.godson.in/2012/02/whitney-houston-and-python.html">
	<title>Godson Gera: Whitney Houston and Python!</title>
	<link>http://blog.godson.in/2012/02/whitney-houston-and-python.html</link>
	<content:encoded>&lt;div dir=&quot;ltr&quot;&gt;Back in 2004 or 05 (can't remember exactly) I have used &quot;Heart break hotel&quot; song of Whitney to test out the small mp3&amp;nbsp;music player I have built using Python (&lt;a href=&quot;http://legacy.godson.in/downloads/index.htm&quot; target=&quot;_blank&quot;&gt;g2Dlite&amp;nbsp;and NeverHeard&lt;/a&gt;). During testing this song was played out countless times to add features and fix bugs in my program. Apart from this I have never really listened to any of her songs. I was saddened to learn about her death this morning,&amp;nbsp;news reminded me of those special days. &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/1922011022782208121-5850828297757600369?l=blog.godson.in&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-12T02:12:36+00:00</dc:date>
</item>
<item rdf:about="http://feedproxy.google.com/~r/cormoran-project/~3/_-uN61t-iYk/cormoran-01-roadmap.html">
	<title>Cormoran Project: Cormoran 0.1 Roadmap</title>
	<link>http://feedproxy.google.com/~r/cormoran-project/~3/_-uN61t-iYk/cormoran-01-roadmap.html</link>
	<content:encoded>This week &lt;a href=&quot;https://github.com/jaimegildesagredo/cormoran/commits/master&quot;&gt;we had been working&lt;/a&gt; very hard to have as soon as possible an usable&amp;nbsp; version of Cormoran.&lt;span class=&quot;short_text&quot; id=&quot;result_box&quot; lang=&quot;en&quot;&gt;&lt;span class=&quot;hps&quot;&gt; There are only a few pending issues to release next version. &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;short_text&quot; id=&quot;result_box&quot; lang=&quot;en&quot;&gt;&lt;span class=&quot;hps&quot;&gt;You can find&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;the roadmap&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;&lt;a href=&quot;https://github.com/jaimegildesagredo/cormoran/issues?milestone=1&amp;state=open&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;short_text&quot; id=&quot;result_box&quot; lang=&quot;en&quot;&gt;&lt;span class=&quot;hps&quot;&gt;Hopefully next week we will announce the Cormoran 0.1 release :) &lt;/span&gt;&lt;/span&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/6509482405829300009-4321186264014236225?l=cormoran-project.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/tCdjv4X57vJnU8Xk6ELf5bAgdEU/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/tCdjv4X57vJnU8Xk6ELf5bAgdEU/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/tCdjv4X57vJnU8Xk6ELf5bAgdEU/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/tCdjv4X57vJnU8Xk6ELf5bAgdEU/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/cormoran-project/~4/_-uN61t-iYk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2012-02-11T19:19:21+00:00</dc:date>
</item>
<item rdf:about="http://feedproxy.google.com/~r/TwistedMatrixLaboratories/~3/5eVwTELVBdw/announcing-twisted-120.html">
	<title>Twisted Matrix Labs: Announcing Twisted 12.0</title>
	<link>http://feedproxy.google.com/~r/TwistedMatrixLaboratories/~3/5eVwTELVBdw/announcing-twisted-120.html</link>
	<content:encoded>Thanks to Thomas Hervé, we are proud to announce the release of Twisted 12.0.&lt;br /&gt;
&lt;br /&gt;

47 tickets are closed by this release, among them:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;A fix to the GTK2 reactor preventing unnecessary wake-ups&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Preliminary support of IPV6 on the server side&lt;/li&gt;
&lt;li&gt; Several fixes to the new protocol-based TLS implementation&lt;/li&gt;
&lt;li&gt;Improved core documentation's &lt;a href=&quot;http://twistedmatrix.com/documents/current/core/howto/index.html&quot;&gt;main page&amp;nbsp;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Twisted no longer supports Python 2.4, the latest supported version is 2.5.&lt;br /&gt;
&lt;br /&gt;
For more information, see the NEWS file here:

  &lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://twistedmatrix.com/Releases/Twisted/12.0/NEWS.txt&quot;&gt;http://twistedmatrix.com/Releases/Twisted/12.0/NEWS.txt&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;

Download it now from:&lt;br /&gt;
&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://pypi.python.org/packages/source/T/Twisted/Twisted-12.0.0.tar.bz2&quot;&gt;http://pypi.python.org/packages/source/T/Twisted/Twisted-12.0.0.tar.bz2&lt;/a&gt; or&lt;br /&gt;
&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://pypi.python.org/packages/2.5/T/Twisted/Twisted-12.0.0.win32-py2.5.msi&quot;&gt;http://pypi.python.org/packages/2.5/T/Twisted/Twisted-12.0.0.win32-py2.5.msi&lt;/a&gt; 
or&lt;br /&gt;
&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://pypi.python.org/packages/2.6/T/Twisted/Twisted-12.0.0.win32-py2.6.msi&quot;&gt;http://pypi.python.org/packages/2.6/T/Twisted/Twisted-12.0.0.win32-py2.6.msi&lt;/a&gt; 
or&lt;br /&gt;
&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.0.0.win32-py2.7.msi&quot;&gt;http://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.0.0.win32-py2.7.msi&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Thanks to the supporters of Twisted via the Software Freedom Conservancy and to the 
many contributors for this release.
&lt;br /&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/1267458971896358542-155583094429900030?l=labs.twistedmatrix.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/TwistedMatrixLaboratories/~4/5eVwTELVBdw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2012-02-11T17:58:37+00:00</dc:date>
</item>
<item rdf:about="">
	<title>Ralph Bean: Hacking tw2 resource injection (in pyramid)</title>
	<link></link>
	<content:encoded>In #toscawidgets this morning, zykes- was asking about how to do the jquery removal hack I wrote about a month back but in Pyramid instead of TurboGears2. First I&amp;#8217;ll summarize the problem, then show you our solution. toscawidgets2 tw2.* provides lots of handy web ui widgets including a wrapper around jquery-ui, jqgrid, and lots of [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=threebean.wordpress.com&amp;blog=8850237&amp;post=476&amp;subd=threebean&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2012-02-11T14:58:10+00:00</dc:date>
</item>
<item rdf:about="http://catherinedevlin.blogspot.com/2012/02/htsql-powered-flask.html">
	<title>Catherine Devlin: HTSQL-powered Flask</title>
	<link>http://catherinedevlin.blogspot.com/2012/02/htsql-powered-flask.html</link>
	<content:encoded>With seven lines of code, you can plug &lt;a href=&quot;http://htsql.org/&quot;&gt;HTSQL&lt;/a&gt; into a web application platform like &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask&lt;/a&gt;.  Yes, I know that you know SQLAlchemy already; the point is that then your Flask apps can support HTSQL's rich in-the-URL filtering language.&lt;br /&gt;&lt;br /&gt;For instance, this app serves reports from HTSQL's sample &quot;University&quot; database.  Each report can run as-is&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  http://localhost:5000/hardcourses&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;or can accept arbitrary HTSQL filters&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  http://localhost:5000/hardcourses?title~'ogy'&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;The advantage over plain HTSQL is that you can use full Flask power.  In this case, the reports come through a template that includes functioning links in each row, so it's a drill-down report:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;a href=&quot;/departments?code='{{ row.department_code }}'&quot;&amp;gt;&lt;br /&gt;        {{ row.dept }}&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;        &lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-ZJHbkIn-wvY/TzboDHv6P7I/AAAAAAAAAJA/543AO1PZFak/s1600/htsqlflask.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/-ZJHbkIn-wvY/TzboDHv6P7I/AAAAAAAAAJA/543AO1PZFak/s320/htsqlflask.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5708004718055931826&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Here are the magic seven lines:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;htsql = HTSQL('pgsql:uni')   # customize me&lt;br /&gt;&lt;br /&gt;def data(qry):&lt;br /&gt;    filters = flask.request.url.replace(flask.request.base_url, '', 1)&lt;br /&gt;    if filters and ('?' in qry):    # this can be fooled by a filtered subquery&lt;br /&gt;        filters = '&amp;amp;%s' % filters.strip()[1:]&lt;br /&gt;    qry = '%s%s' % (qry, filters or '')&lt;br /&gt;    return htsql.produce(qry)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;    &lt;br /&gt;Now each of your report pages asks for data in the form of an HTSQL query, and the ``data`` function appends any user-supplied filters to that:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    return flask.render_template('departments.html', data=data(qry))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;a href=&quot;http://catherinedevlincode.blogspot.com/2012/02/flaskhtsql-code.html&quot;&gt;full code for the sample app&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/11802292-3828476244816561432?l=catherinedevlin.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-11T14:14:59+00:00</dc:date>
</item>
<item rdf:about="http://blog.vrplumber.com/index.php?/archives/2558-Planning-to-use-Numpy-Structured-Data-Types.html">
	<title>Mike C. Fletcher: Planning to use Numpy Structured Data Types</title>
	<link>http://blog.vrplumber.com/index.php?/archives/2558-Planning-to-use-Numpy-Structured-Data-Types.html</link>
	<content:encoded>&lt;p&gt;One of the things I'd like to have for a revised OpenGLContext/scenegraph API is a nice, efficient, friendly, mechanism for processing buffer data.  I currently tend to follow VRML97's OpenGL 1.1-style array model, which is very dated these days. Each component of a vertex is separated out into position, normal, and textureCoordinate arrays and the drawing operation indexes into those arrays in lock-step.  Modern OpenGL (shaders) pretty much work best when you have &amp;quot;interleaved&amp;quot; data-types for your vertices, that is, you pack (position, normal, textureCoordinate1, textureCoordinate2, someOtherValue) into a single VBO and then just use offsets into the VBO for the actual rendering.&lt;/p&gt;&lt;p&gt;The rendering loop (the part most likely to be coded in C/Cython/C++ eventually) doesn't really have to &amp;quot;deal with&amp;quot; the arrays other than as opaque blobs, as it is the shader which interprets what is inside them.  So, only the &amp;quot;client&amp;quot; side needs to model them.  Numpy structured data-types should provide a very nice way to do the modelling:&lt;/p&gt;&lt;pre&gt;dtype=[&lt;br /&gt;    ('position', [('x','1f'),('y','1f'),('z','1f')]),&lt;br /&gt;    ('normal', [('x','1f'),('y','1f'),('z','1f')]),&lt;br /&gt;    ('texCoord',[('s','1f'),('t','1f')])&lt;br /&gt;]&lt;/pre&gt;&lt;p&gt;should create a VBO compatible friendly interface to N data-points, so that a['position'] is an N*3 array of 3-float vectors and a['texCoord'] is an N*2 array of 2-float vectors, while a['position']['x'] is a simple linear array of x coordinates.  At that point I can just stop worrying about array representations.  I can use numpy's fast array manipulation routines (which I already do in OpenGLContext).&lt;/p&gt;&lt;p&gt;The only real downside (assuming it all works as expected) IMO is the large dependency (does anyone care about this anymore), and having the numpy implementation detail &amp;quot;leak&amp;quot; into my code-base (mostly an annoyance when I look at porting to Javascript, and really, one way or another there needs to be an interface, that interface &lt;strong&gt;will&lt;/strong&gt; leak into the code using it).&lt;/p&gt;&lt;p&gt;Another approach would be to use a custom-coded C-ish extension providing just the basics of a Vertex object (with configurable fields), some dot and cross product operations and some other basic math... I would control the API, sure, but that doesn't really convince me it would be worthwhile.  Similarly, I could pick up a 3D math-focused library and use that, but then I'm still using someone else' API, so why not use the &amp;quot;standard&amp;quot; python one.&lt;/p&gt;</content:encoded>
	<dc:date>2012-02-11T13:18:06+00:00</dc:date>
</item>
<item rdf:about="http://blog.doughellmann.com/2012/02/rst2blogger-10.html">
	<title>Doug Hellmann: rst2blogger 1.0</title>
	<link>http://blog.doughellmann.com/2012/02/rst2blogger-10.html</link>
	<content:encoded>&lt;div class=&quot;document&quot; id=&quot;rst2blogger-1-0&quot;&gt;&lt;p&gt;rst2blogger is a command line program for converting &lt;a class=&quot;reference external&quot; href=&quot;http://docutils.sourceforge.net/rst.html&quot;&gt;reStructuredText&lt;/a&gt;&lt;br /&gt;documents to HTML suitable for posting to blogger.com.  It takes as&lt;br /&gt;input a single filename and an optional blog title. The input file is&lt;br /&gt;parsed with &lt;a class=&quot;reference external&quot; href=&quot;http://docutils.sourceforge.net/&quot;&gt;docutils&lt;/a&gt; to create HTML, and the HTML is uploaded as a&lt;br /&gt;draft to the specified blog.  If the blogger account only has one&lt;br /&gt;blog, the name does not need to be specified.&lt;/p&gt;&lt;p&gt;See &lt;a class=&quot;reference external&quot; href=&quot;http://www.doughellmann.com/docs/rst2blogger/&quot;&gt;the project documentation&lt;/a&gt; for installation and setup instructions.&lt;/p&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/5440028356946346379-7557804773166326462?l=blog.doughellmann.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-11T12:42:47+00:00</dc:date>
</item>
<item rdf:about="http://blaag.haard.se/Why-Python-is-important-for-you">
	<title>Fredrik Håård's Blaag: Why Python is important for you</title>
	<link>http://blaag.haard.se/Why-Python-is-important-for-you</link>
	<content:encoded>&lt;div class=&quot;document&quot; id=&quot;why-python-is-important-for-you&quot;&gt;
&lt;h1 class=&quot;title&quot;&gt;Why Python is important for you&lt;/h1&gt;
&lt;p&gt;I believe that Python is important for software development. While
there are more powerful languages (e.g. Lisp), faster languages
(e.g. C), more used languages (e.g. Java), and weirder languages
(e.g. Haskell), Python gets a lot of different things &lt;em&gt;right&lt;/em&gt;, and
right in a combination that no other language I know of has done so
far.&lt;/p&gt;
&lt;p&gt;It recognises that you’ll spend a lot more time reading code than
writing it, and focuses on guiding developers to write readable
code. It’s possible to write obfuscated code in Python, but the
easiest way to write the code (assuming you know Python) is almost
always a way that is reasonable terse, and more importantly: code that
clearly signals intent. If you know Python, you can work with almost
any Python with little effort. Even libraries that add “magic”
functionality can be written in perfectly readable Python (compare
this to understanding the implementation of a framework such as Spring
in Java).&lt;/p&gt;
&lt;p&gt;Python also acknowledges that speed of development is
important. Readable and terse code is part of this, and so is access
to powerful constructs that avoid tedious repetition of
code. Maintainability also ties into this - LoC may be a all but
useless metric, but it does say something about how much code you have
to scan, read and/or understand to troubleshoot problems or tweak
behaviours.&lt;/p&gt;
&lt;p&gt;This speed of development, the ease with which a programmer of other
languages can pick up basic Python skills, and the huge standard
library is key to another area where Python excels - toolmaking. Any
project of size will have tasks to automate, and automating them in
Python is in my experience orders of magnitude faster than using more
mainstream languages - in fact, that was how I started out with
Python, creating a tool to automate configuring Rational Purify for a
project where it before was such a chore that it was never run (and
memory leaks were not fixed). I’ve since created tools to extract
information from ticket systems and presenting them in a way useful to
the team, tools to check poms in a Maven project, Trac integration,
custom monitoring tools... and a whole lot more. All of those tools
have been quick to implement, saved a lot of time, and several of them
has later been patched and updated by people &lt;em&gt;with no Python
background&lt;/em&gt; - without breaking.&lt;/p&gt;
&lt;p&gt;That building custom tools is easy hints at another strength -
building and maintaining custom software is easy, period. This is why,
while the quite huge &lt;a class=&quot;reference external&quot; href=&quot;http://djangoproject.com&quot;&gt;Django&lt;/a&gt; framework might be the most famous Python
web framework, there is also a host of successful small and
micro-frameworks. When working in a powerful programming language with
a wide array of standard and third-party libraries, you often don’t
&lt;em&gt;need&lt;/em&gt; to accept the trade-offs that are necessary when using any
large off-the-shelf framework. This means that you can build &lt;em&gt;exactly&lt;/em&gt;
the software your customers want, rather than telling them that &lt;em&gt;”this
is how it’s done, sorry”&lt;/em&gt;. To me, this is a huge difference. I feel
&lt;strong&gt;ashamed&lt;/strong&gt; when I have to tell a customer that no, sorry, this
&lt;em&gt;seems&lt;/em&gt; like a simple requirement, but the framework we use makes it
impossible or prohibitively expensive to implement. Whenever this
happens, you have failed. Writing software that fits into the
customer’s model rather than into a framework is &lt;em&gt;important&lt;/em&gt;, and I
for one feel that a lot of developers today has lost sight of that
simple fact. A lot of programmers now spend more time being
configurators of frameworks and makíng excuses for their shortcomings,
rather than actual programming.&lt;/p&gt;
&lt;p&gt;Finally, if you’re a boss-wo/man or general manager, using Python has a final benefit - Python programmers run into less frustration*, which makes them happier, and even more productive!&lt;/p&gt;
&lt;p&gt;(*may not be true when installing source-distributed C extensions on
Windows)&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-11T10:26:03+00:00</dc:date>
</item>
<item rdf:about="http://tomerfiliba.com/blog/Dialog-Toolkit">
	<title>Tomer Filiba: Wizard Dialog Toolkit</title>
	<link>http://tomerfiliba.com/blog/Dialog-Toolkit</link>
	<content:encoded>&lt;p&gt;Following my &lt;a href=&quot;http://tomerfiliba.com/blog/Deducible-UI&quot;&gt;Deducible UI post&lt;/a&gt;, and following some of the
criticism it had received, I'd like to share something I've been working on (read: &lt;em&gt;experimenting with&lt;/em&gt;)
at my work place. You see, we have some &quot;interactive wizards&quot; that storage admins use to connect
storage arrays to their hosts (say, a DB server). These wizards prompt you with questions like your
what's your username, the name of the pool/volume, whether it's an iSCSI or a Fiber Channel
connection, etc., and then they go and perform what you've asked for.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://tomerfiliba.com/static/res/2012-02-11-gandalf.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These wizards operate in a terminal environment, but we've had thoughts to make GUI/web versions
of them. This would be a considerable effort with the current design. Another issue they currently
have is the mixing of &quot;business logic&quot; and presentation together. For instance, the code that scans the
devices attached to your host also prints ANSI-colored messages or reports its progress. All in
all it works fine, but there's lots of room for improvement.&lt;/p&gt;

&lt;p&gt;I began to investigate this corner a month or two ago. The initial observation was that such wizards
have a pretty rigid and repetitive structure, thus we can find some abstraction or a &quot;toolkit&quot; for
&quot;expressing&quot; wizards more compactly. This has also led to the realization that once the business
logic and presentation are separate, there's no reason to limit ourselves to terminal-based interaction:
our wizard-toolkit could do the plumbing and work with terminals, ncurses, GUIs, web-browsers, etc.
The business logic would remain oblivious, and we could have a nice GUI at zero-cost!&lt;/p&gt;

&lt;p&gt;There was also a second issue of &lt;em&gt;styling&lt;/em&gt;, i.e., printing text in color, that I wanted to get r
id of. This part was easy: I thought, why not employ the model of HTML and CSS? Let's separate the
structure (semantics) of the text from its styling. Instead of printing a banner for titles,
we'll display a &lt;code&gt;Title&lt;/code&gt; object, whose exact appearance is determined by a &quot;style sheet&quot; (a class,
of course, not actually a text document).&lt;/p&gt;

&lt;p&gt;For instance, when we're using a color-enabled terminal, the title would be printed in bold and
followed by an empty line; but if our terminal is color-blind, we'll render the text centered and
surrounded by &lt;code&gt;=&lt;/code&gt; marks. Another example is error-handling: instead of printing error message
in red every time, we'll display an &lt;code&gt;Error&lt;/code&gt; object; on a terminal, this would be rendered as
red text, but when running in a GUI, rendering this object would pop up a message box.
I'm going to ignore this for the rest of this post, as this is really a side issue.&lt;/p&gt;

&lt;p&gt;Now let's get to expressing wizards, or more generally, &lt;em&gt;dialogs&lt;/em&gt;. Following some earlier iterations,
I came to the model where a dialog is a &quot;container object&quot; that's made of &lt;em&gt;dialog elements&lt;/em&gt;. These
elements can be output-only (such as a welcome message), or input-output (such as a message
telling you to choose one of the available options). A dialog is &quot;executed&quot; by a &lt;code&gt;DialogRunner&lt;/code&gt; that
renders it and returns the results gotten from the user. It's quite important to note that dialog
elements within a single dialog cannot be interdependent -- that is, if you want to ask the user
for his name and then show &lt;code&gt;&quot;Hi there %s&quot;&lt;/code&gt; with the user's name, this has to be done as two,
serial dialogs.&lt;/p&gt;

&lt;p&gt;That was quite a lot of babble -- let's see this in action:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WizardApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;iscsi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;iSCSI&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;FC&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dialog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;hello world&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;un&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;Username&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;pw&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;Password&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Choice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;conf&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;What do you want to configure?&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iscsi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ui&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;conf&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config_fc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config_iscsi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;--gtk&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;MyApp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GtkDialogRunner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;My App&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;MyApp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TerminalDialogRunner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ANSIRenderer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;It's a short and incomplete snippet of course, as I'm only going to cover the big picture. The
&lt;code&gt;main&lt;/code&gt; function creates a dialog object &lt;code&gt;d&lt;/code&gt; and passes it to &lt;code&gt;ui.run&lt;/code&gt;, which &quot;runs&quot; the dialog
and returns the results, as a dictionary. Notice that the dialog elements &lt;code&gt;Input&lt;/code&gt;, &lt;code&gt;Password&lt;/code&gt;
and &lt;code&gt;Choice&lt;/code&gt; all take a first parameter -- this is the key under which the result would be placed
in the returned dictionary, e.g., &lt;code&gt;res[&quot;un&quot;]&lt;/code&gt; would hold the user-provided user name, and
&lt;code&gt;res[&quot;pw&quot;]&lt;/code&gt; would hold the password. &lt;code&gt;Text&lt;/code&gt;, on the other hand, is an output-only element,
so it doesn't return anything and doesn't take a key. Long story short, we're asking the user
to enter some information and choose one of two options, and then continue processing based on the
selected option. At the bottom, we determine how to run the application based on a command-line
switch: if &lt;code&gt;--gtk&lt;/code&gt; is given, we'll run the dialogs through the &lt;code&gt;GtkDialogRunner&lt;/code&gt;; otherwise,
we'll use the &lt;code&gt;TerminalDialogRunner&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And how does it look like? When running on a terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://tomerfiliba.com/static/res/2012-02-11-wizard-terminal.png&quot;&gt;
&lt;img src=&quot;http://tomerfiliba.com/static/res/2012-02-11-wizard-terminal.png&quot; title=&quot;Running in a terminal&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And with a single command-line switch, we run as a GTK application:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://tomerfiliba.com/static/res/2012-02-11-wizard-gtk.png&quot;&gt;
&lt;img src=&quot;http://tomerfiliba.com/static/res/2012-02-11-wizard-gtk.png&quot; title=&quot;Running as a GTK application&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So of course it's far from perfect, but then again, it's a small research project I've only put
~15 hours into. It suffers from some of the problems I've listed in the deducible UI post, for
instance, the GUI hangs when the business logic performs blocking tasks. This could be solved
by moving to a reactor-based model, but I've tried to keep the existing wizard code in tact as
much as possible. A hanging GUI is not nice, but it's not the end of the world either, and
there are numerous ways to overcome this.&lt;/p&gt;

&lt;p&gt;Another benefit this design brings along is the ability to automate testing by using &lt;em&gt;mock dialog
runners&lt;/em&gt;. Since our business logic is only exposed to the returned dictionary, we can use a
dialog runner that actually displays nothing and returns a scripted scenario each time. We can even
go further: because our business logic &quot;talks&quot; in high-level primitives like &lt;code&gt;Choice&lt;/code&gt;, we can compute
the Cartesian product of all choices and run through each of them. We can show that we've covered
all paths! And we can do this automatically... without people hitting buttons and keeping logs of
their progress.&lt;/p&gt;

&lt;p&gt;Anyway, I just wanted to show that it's feasible. I'm not releasing any code as this project is
currently in very early stages, and it's something I do at work. Perhaps we'll open-source it in
the future, if it proves useful enough.&lt;/p&gt;</content:encoded>
	<dc:date>2012-02-11T08:00:00+00:00</dc:date>
</item>
<item rdf:about="http://www.pythondiary.com/blog/Feb.10,2012/tutorials-section-having-issues.html">
	<title>Python Diary: Tutorials section having issues</title>
	<link>http://www.pythondiary.com/blog/Feb.10,2012/tutorials-section-having-issues.html</link>
	<content:encoded>&lt;p&gt;The &lt;a href=&quot;http://www.pythondiary.com/tutorials/&quot;&gt;Tutorials&lt;/a&gt; section is having some technical difficulties, as I have previously added 2 more tutorials.  The tutorials are not showing up despite the published date being set correctly.  I find this odd as the other 2 tutorials work just fine, it's just these 2 new ones which are very reluctant to show up and be accessible.&lt;/p&gt;
&lt;p&gt;I altered the publishing date to today, so hopefully they show up this time.  If not, I will need to dive into the Python source code to find out why they are not showing up.&lt;/p&gt;
&lt;p&gt;Overall, I am rather happy with the rest of the sites sections, although the template needs to be redone.  I plan on looking for another similar template, but one which scrolls better to support multiple screen sizes.  A mobile template is also planned for those out there who read the site on a mobile device.  I assume most of my subscribers are using the provided Atom feeds, as it contains the entire posting, and should be compatible with most popular news readers.&lt;/p&gt;
&lt;p&gt;The &lt;b&gt;Reviews&lt;/b&gt; section will be built shortly, as this is one section I hope will bring plenty of traffic.  The review section is a bit ambitious, as it will differ from other sites which mostly do comparisons between packages.  It will be formatted something like a &lt;a href=&quot;http://reviews.cnet.com/accounting-and-finance/turbotax-deluxe-2008-federal/4505-6405_7-33362013.html?tag=mncol;lst&quot;&gt;CNet review&lt;/a&gt;.  It will have the same general information, such as the &lt;b&gt;The Good&lt;/b&gt;, &lt;b&gt;The Bad&lt;/b&gt;, and &lt;b&gt;The Bottom Line&lt;/b&gt;.  The Review will also list any dependencies the package would require.  The dependency system will be similar to how the Tutorials section dependencies work, a simple clickable link to each dependency, full with description and project website.&lt;/p&gt;
&lt;p&gt;What are your thoughts on this type of review system for Python packages?  Reviews will take time, as I will need to spend a good amount of time working with the package and it's various features to determine it's ability to deliver.  I've seen both great and not so great python packages out in the wild.  The not so great ones are very difficult to use in existing projects, and some have issues with subclassing, or don't properly support it.  Integration into existing projects is a valuable resource for any Python package.  If it cannot be easily integrated into your existing project, then why use it in the first place?  The time it would take you to integrate it, you could have built a similar package from scratch that is more fine tuned to your projects specific needs.&lt;/p&gt;</content:encoded>
	<dc:date>2012-02-11T06:40:38+00:00</dc:date>
</item>
<item rdf:about="http://wxPython.org/blog/2012/02/10/os-x-lion-was-my-idea/">
	<title>Robin Dunn: OS X Lion Was My Idea</title>
	<link>http://wxPython.org/blog/2012/02/10/os-x-lion-was-my-idea/</link>
	<content:encoded>&lt;p&gt;Several months ago Microsoft had an ad campaign where they would have an average Joe or Jane talk about some cool wizbang feature of Windows 7 and how it was all their idea.  It was one of Microsoft's better ad campaigns, and was actually understandable by the average person without requiring the viewer to know industry inside jokes, or to understand Jerry Seinfeld, to be able to &quot;get&quot; the gist of the commercial.  It also employed some cute gimmicks, such as when the person was remembering back to how they thought up the wonderful new idea the directors used a different actor who was younger, thinner, cuter, handsomer, and had way better hair than the real person.&lt;/p&gt;
&lt;p&gt;A few weeks ago I realized that I had the same experience with Mac OS X Lion.  Way back in 2007 I wrote a &lt;a href=&quot;http://wxpython.org/blog/2007/11/20/my-mac-gripes/&quot;&gt;post&lt;/a&gt; in this blog about some of the things that annoyed me about OSX.  Two of them were finally fixed in Lion, and it only took 4 years!  Here is the first one.&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;Can only resize from 1 corner&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;It bugs me that I can only resize windows from the lower right corner. I often find myself wishing that I could resize from any edge or corner as I've been doing for nearly 20 years on every Windows, OS/2 and X-Windows system I've ever used.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;We can now grab any corner or side of most windows and resize the window by dragging the mouse cursor.  Yay!  For you non-Mac users out there, until you're not able to do that you may not actually realize how much you do it.  For example, if you have a window that you would like to make wider and have it grow to the left, then on Macs running an earlier version of the OS you would first have to move the window to the left, and then you would have to move the mouse cursor down to the bottom right corner and drag to the right.  That's lots more effort than it should require, and now, thanks to me, you don't have to go through all of that! &amp;lt;wink!&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;Can't change mouse cursor&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;You'd think that with how important the visual appeal of the OS seems to be with Apple that they would not have let something this ugly slide through their QA department for so long. Since I usually have multiple computers with multiple screens active at once, I like to increase the size of the mouse cursor a bit, or replace it with alternate cursors that are more easily visible. I've tried options for things like giving the cursor a comet trail of fading arrows behind it, or what not, and I hate them all after a few minutes. For me, just increasing the size and/or using a colored arrow that is easily visible does the job and doesn't get in the way of my work. However on Mac OS X you can't use custom cursors and all you can do is scale the image up in the Universal Access section of System Preferences. And being Apple you might assume that it would be a nice scaled up anti-aliased rendering of a vector image, but NO! They simply take the original 16x16 pixel image and stretch it to fit the new 64x64 or whatever size. Anyone who has used a photo editing application more than a few times knows you can't take a small image and enlarge it very much without it looking like crap! It &lt;strong&gt;embarrasses&lt;/strong&gt; me too much to run a Mac with a cursor stretched up to a monstrosity like that, so I suffer with the itty-bitty one that occasionally gets lost among the dozens of windows on my desktops.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Next up is the lack of ability to have a nice looking mouse cursor that is larger than normal.  At least that's the way it was prior to Lion.  Now when you change the cursor size it scales up very nicely, probably because they are using some scalable image format now instead of a small 16x16 bitmap image.  Unfortunately if an application uses some non-standard cursor images they are still poorly scaled up into a jagged edged ugly blob.  Also unfortunately I haven't been able to find a screenshot program yet that will capture the new enlarged cursor so I can show you the difference.  They all end up with the small default cursor in the screenshot instead.  Weird.  Anyway, I'm no longer embarrassed to have a larger than normal cursor on my Macs because they are no longer so dang ugly.  Thanks to me you can also have a purdee big cursor too! &amp;lt;wink!&amp;gt;&lt;/p&gt;
&lt;p&gt;Now the only question remaining is who should Apple get to play the younger/fitter/handsomer version of me while filming the flashback parts of my &quot;OS X Lion Was &lt;em&gt;My&lt;/em&gt; Idea&quot; commercial, what do you think?&lt;/p&gt;</content:encoded>
	<dc:date>2012-02-11T00:35:38+00:00</dc:date>
</item>
<item rdf:about="http://lucumr.pocoo.org/2012/2/11/appreciating-design">
	<title>Armin Ronacher: Appreciating Design</title>
	<link>http://lucumr.pocoo.org/2012/2/11/appreciating-design</link>
	<content:encoded>&lt;p&gt;I think no piece of software had a bigger impact on my work than
&lt;a class=&quot;reference external&quot; href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt;.  Nowadays people often look down on
Trac for various different reasons but if you keep in mind how bug
management and revision control web interfaces in the open source world
looked before Trac you can see why it initially had that much hype around
it.&lt;/p&gt;
&lt;div class=&quot;section&quot; id=&quot;learning-from-trac&quot;&gt;
&lt;h2&gt;Learning from Trac&lt;/h2&gt;
&lt;p&gt;When Trac was released tons of Open Source projects used it.  It had a
slick design and did the few things it provided quite well.  The wiki was
not great but useable, the integrated subversion support was very well
implemented and the bug Tracker was simple but friendly.  It was the first
bug Tracker that I had used that by default could have been presented to a
non technical user without having to tweak it.&lt;/p&gt;
&lt;p&gt;Trac had a reasonable user interface design compared to the competition.
But the beauty of Trac has always been the code that runs it.  For the
German ubuntu community I deployed a phpBB installation a few years prior
to when I used Trac first.  One of the great features of phpBB was that
people wrote extensions for it that provided extra functionality to the
base bulletin board system.  The way these plugins worked however was by
actually modifying the code.  Called “mods” they came with long
installation instructions that showed the specific places where you had to
copy/paste code in.  Not even diff files were provided in those days but
it still sortof worked because people took the time to hand patch their
installations.&lt;/p&gt;
&lt;p&gt;Trac on the other hand always had a real plugin system.  The base system
was littered with interfaces and hook points that plugins could utilize to
add extra functionality.  Trac's code taught me proper software and API
design.  Now it seems obvious that this is how you create libraries and
applications but the perfection that Trac had in that regard is still
largely unmatched.  At least in the Python world.&lt;/p&gt;
&lt;p&gt;For instance Trac always supported running more than one Trac instance per
Python interpreter.  It was from the ground up designed for that.  Django
as a framework still does not do that.  Which is especially sad
considering that Django is a framework and not an application.  You could
not reimplement Trac in Django without losing this functionality.  Trac
also had the concept of an instance folder where the instance specific
files are dropped (design, static files, uploads, configuration, the
sqlite db if used, per instance plugins etc.) which more people should
consider.&lt;/p&gt;
&lt;p&gt;Trac also explicitly did not adopt hyped technologies if they went against
their design principles.  They wanted to use a template engine that was
extensible and built on XML to properly support XHTML (which was hip and
cool at the time) but Kid did not serve that purpose.  It did not scale
properly to the large pages that were generated and it did some funky
things with the Python import systems.  Christopher Lenz wrote Genshi
as a result of that which was a reimplementation of the Kid principles but
with a largely improved implementation.  Genshi is still (from the design
perspective) the coolest piece of template engine you can get in Python
land.  It's also the reason why I no longer hate XML all that much because
properly used it's actually very clever.&lt;/p&gt;
&lt;p&gt;However all of that is completely irrelevant because Trac and Genshi
failed in other areas.  They were amazingly well written but all that came
at huge costs.  Trac was a memory hog and some early design mistakes that
everybody relied on were only slowly phased out.  For instance before Trac
had Genshi they used a template engine called quicksilver.  It was
implemented in C and used a special syntax similar to JSON to specify the
template context.  When that was replaced with Genshi it broke existing
plugins and provided users with a good excuse to switch from Trac to
alternatives that had the functionality they required built in.  Trac was
also built around the subversion idea of having one huge repository for
everything.  This became a problem when decentralized version control
systems popularized the concept of having more than one repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;users-don-t-care-or-do-they&quot;&gt;
&lt;h2&gt;Users don't care, or do they?&lt;/h2&gt;
&lt;p&gt;Ultimately all of that would have been great however if the users would
have appreciated the elegance of the design.  But that's not how it seems
to work.  A user expects his software to work and the internals don't
matter at all.  And this is not just true for Trac.  Battlefield 3, which
I &lt;a class=&quot;reference external&quot; href=&quot;http://lucumr.pocoo.org/2011/11/15/modern-web-applications-are-here/&quot;&gt;wrote about last year&lt;/a&gt;, moved the main
menu into a browser.  There are a bunch of reasons why the whole concept
in generally is technically amazing, but for the user it was not
understandable why it was cool or useful.&lt;/p&gt;
&lt;p&gt;It's not that users are dumb and would not understand it, but it was never
communicated in the first place.  I don't know if it's because the
developers did not take their pride far enough in showing everybody how
cool it actually is or if they think users would not understand it.&lt;/p&gt;
&lt;p&gt;Let's compare this to cars for a moment.  If I look around for a car, the
design is only half the reason.  I look for the technical details when I
shell out that much money.  I want to know why it's cool, I was to see
images of the engine and internals.  I want to read about the design ideas
that went into every part of the product.  True, there will be some people
that just want a car, but those are not selling your car anyways.  If a
friend of mine shows up with a brand new BMW I can promise you he will
start telling me about the cool details, he wants me to actually try it
and ultimately he wants me to get this car.&lt;/p&gt;
&lt;p&gt;Apple seems to be doing very much the same.  Many Apple computer users
are as loyal to their product as buyers of cars.  They will point how
cool the case design is, how nicely the lid closes, how cute the machine
looks when the sleep light is “breathing” or how few problems they have
with it.  I know many flaws in my Macs but that does not stop me from
continue supporting the company and getting their products.  That's
because I appreciate the work that went into every part of it.&lt;/p&gt;
&lt;p&gt;Head over to the Apple website and you see the product in the center like
you see a car.  Apple not only sells you the product there, they also
provide videos of the assembling process.  They let designers share their
thoughts that went into every aspect of the product and they show you that
they love what they created.&lt;/p&gt;
&lt;p&gt;Why don't we do that about software products?  Trac probably would not
have become better by itself just because users would know what goes on
behind the scenes, but I can almost promise you that more developers would
have had a look at the internals if they were communicated properly and
that might have helped improving it.  As it stands right now, only a small
community remains around Trac and only one active developer remains.&lt;/p&gt;
&lt;p&gt;With Battlefield 3 it's very similar.  The advert said “the easiest way to
play with friends” but it did not say why Battlelog (their online
community and also main menu) was cool.  Why it's better for the user than
the main menu being in the game.  Combined with the fact that the game did
not deliver in some other parts (such as missing VOIP support) people
suddenly start blaming battlelog for parts it does not have anything to do
with it.  And an unhappy fanbase is the very last you want to have when it
comes to multiplayer games because those games are sold in a very similar
way: if my friends play I want to play it too.  Selling technical
excellence to computer gamers would not have been hard either because they
take pride in “knowing more” about computers and game then their console
playing friends.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;make-them-appreciate-it&quot;&gt;
&lt;h2&gt;Make them appreciate it&lt;/h2&gt;
&lt;p&gt;I guess to a large degree the idea of “the best design is the one you
don't notice” plays into that but that does not mean it wouldn't be great
to point it out nonetheless.  And by that I don't mean putting a red arrow
on the product saying “this is a cool design element” but by providing a
nicely designed website or folder that shows the thought process that went
into it.&lt;/p&gt;
&lt;p&gt;I know nothing about cars but damn do I love looking at brochures and
reading about them.&lt;/p&gt;
&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-11T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://lateral.netmanagers.com.ar/weblog/posts/BB990.html">
	<title>Roberto Alsina: PyQt Quickie: Don't Get Garbage Collected</title>
	<link>http://lateral.netmanagers.com.ar/weblog/posts/BB990.html</link>
	<content:encoded>&lt;p&gt;There is one area where Qt and Python (and in consequence PyQt) have major disagreements. That area is memory management.&lt;/p&gt;
&lt;p&gt;While Qt has its own mechanisms to handle object allocation and disposal (the hierarchical QObject trees, smart pointers, etc.), PyQt runs on Python, so it has garbage collection.&lt;/p&gt;
&lt;p&gt;Let's consider a simple example:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre&gt;&lt;span&gt;from&lt;/span&gt; &lt;span&gt;PyQt4&lt;/span&gt; &lt;span&gt;import&lt;/span&gt; QtCore

&lt;span&gt;def&lt;/span&gt; &lt;span&gt;finished&lt;/span&gt;():
    &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;The process is done!&amp;quot;&lt;/span&gt;
    &lt;span&gt;# Quit the app&lt;/span&gt;
    QtCore&lt;span&gt;.&lt;/span&gt;QCoreApplication&lt;span&gt;.&lt;/span&gt;instance()&lt;span&gt;.&lt;/span&gt;quit()

&lt;span&gt;def&lt;/span&gt; &lt;span&gt;launch_process&lt;/span&gt;():
    &lt;span&gt;# Do something asynchronously&lt;/span&gt;
    proc &lt;span&gt;=&lt;/span&gt; QtCore&lt;span&gt;.&lt;/span&gt;QProcess()
    proc&lt;span&gt;.&lt;/span&gt;start(&lt;span&gt;&amp;quot;/bin/sleep 3&amp;quot;&lt;/span&gt;)
    &lt;span&gt;# After it finishes, call finished&lt;/span&gt;
    proc&lt;span&gt;.&lt;/span&gt;finished&lt;span&gt;.&lt;/span&gt;connect(finished)

&lt;span&gt;def&lt;/span&gt; &lt;span&gt;main&lt;/span&gt;():
    app &lt;span&gt;=&lt;/span&gt; QtCore&lt;span&gt;.&lt;/span&gt;QCoreApplication([])
    &lt;span&gt;# Launch the process&lt;/span&gt;
    launch_process()
    app&lt;span&gt;.&lt;/span&gt;exec_()

main()
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you run this, this is what will happen:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
QProcess: Destroyed while process is still running.
The process is done!
&lt;/pre&gt;
&lt;p&gt;Plus, the script never ends. Fun! The problem is that &lt;tt class=&quot;docutils literal&quot;&gt;proc&lt;/tt&gt; is being deleted at the end of &lt;tt class=&quot;docutils literal&quot;&gt;launch_process&lt;/tt&gt; because there are no more references to it.&lt;/p&gt;
&lt;p&gt;Here is a better way to do it:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre&gt;&lt;span&gt;from&lt;/span&gt; &lt;span&gt;PyQt4&lt;/span&gt; &lt;span&gt;import&lt;/span&gt; QtCore

processes &lt;span&gt;=&lt;/span&gt; &lt;span&gt;set&lt;/span&gt;([])

&lt;span&gt;def&lt;/span&gt; &lt;span&gt;finished&lt;/span&gt;():
    &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;The process is done!&amp;quot;&lt;/span&gt;
    &lt;span&gt;# Quit the app&lt;/span&gt;
    QtCore&lt;span&gt;.&lt;/span&gt;QCoreApplication&lt;span&gt;.&lt;/span&gt;instance()&lt;span&gt;.&lt;/span&gt;quit()

&lt;span&gt;def&lt;/span&gt; &lt;span&gt;launch_process&lt;/span&gt;():
    &lt;span&gt;# Do something asynchronously&lt;/span&gt;
    proc &lt;span&gt;=&lt;/span&gt; QtCore&lt;span&gt;.&lt;/span&gt;QProcess()
    processes&lt;span&gt;.&lt;/span&gt;add(proc)
    proc&lt;span&gt;.&lt;/span&gt;start(&lt;span&gt;&amp;quot;/bin/sleep 3&amp;quot;&lt;/span&gt;)
    &lt;span&gt;# After it finishes, call finished&lt;/span&gt;
    proc&lt;span&gt;.&lt;/span&gt;finished&lt;span&gt;.&lt;/span&gt;connect(finished)

&lt;span&gt;def&lt;/span&gt; &lt;span&gt;main&lt;/span&gt;():
    app &lt;span&gt;=&lt;/span&gt; QtCore&lt;span&gt;.&lt;/span&gt;QCoreApplication([])
    &lt;span&gt;# Launch the process&lt;/span&gt;
    launch_process()
    app&lt;span&gt;.&lt;/span&gt;exec_()

main()
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, we add a global &lt;tt class=&quot;docutils literal&quot;&gt;processes&lt;/tt&gt; set and add &lt;tt class=&quot;docutils literal&quot;&gt;proc&lt;/tt&gt; there so we always keep a reference to it. Now, the program works as intended. However, it still has an issue: we are leaking &lt;tt class=&quot;docutils literal&quot;&gt;QProcess&lt;/tt&gt; objects.&lt;/p&gt;
&lt;p&gt;While in this case the leak is very short-lived, since we are ending the program right after the process ends, in a real program this is not a good idea.&lt;/p&gt;
&lt;p&gt;So, we would need to add a way to remove &lt;tt class=&quot;docutils literal&quot;&gt;proc&lt;/tt&gt; from &lt;tt class=&quot;docutils literal&quot;&gt;processes&lt;/tt&gt; in &lt;tt class=&quot;docutils literal&quot;&gt;finished&lt;/tt&gt;. This is not as easy as it may seem. Here is an idea that will not work as you expect:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre&gt;&lt;span&gt;def&lt;/span&gt; &lt;span&gt;launch_process&lt;/span&gt;():
    &lt;span&gt;# Do something asynchronously&lt;/span&gt;
    proc &lt;span&gt;=&lt;/span&gt; QtCore&lt;span&gt;.&lt;/span&gt;QProcess()
    processes&lt;span&gt;.&lt;/span&gt;add(proc)
    proc&lt;span&gt;.&lt;/span&gt;start(&lt;span&gt;&amp;quot;/bin/sleep 3&amp;quot;&lt;/span&gt;)
    &lt;span&gt;# Remove the process from the global set when done&lt;/span&gt;
    proc&lt;span&gt;.&lt;/span&gt;finished&lt;span&gt;.&lt;/span&gt;connect(&lt;span&gt;lambda&lt;/span&gt;: processes&lt;span&gt;.&lt;/span&gt;remove(proc))
    &lt;span&gt;# After it finishes, call finished&lt;/span&gt;
    proc&lt;span&gt;.&lt;/span&gt;finished&lt;span&gt;.&lt;/span&gt;connect(finished)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this version, we will still leak &lt;tt class=&quot;docutils literal&quot;&gt;proc&lt;/tt&gt;, even though &lt;tt class=&quot;docutils literal&quot;&gt;processes&lt;/tt&gt; is empty! Why? Because we are keeping a reference to &lt;tt class=&quot;docutils literal&quot;&gt;proc&lt;/tt&gt; in the &lt;tt class=&quot;docutils literal&quot;&gt;lambda&lt;/tt&gt;!&lt;/p&gt;
&lt;p&gt;I don't really have a good answer for that that doesn't involve turning everything into members of a &lt;tt class=&quot;docutils literal&quot;&gt;QObject&lt;/tt&gt; and using &lt;tt class=&quot;docutils literal&quot;&gt;sender&lt;/tt&gt; to figure out what process is ending, or using &lt;tt class=&quot;docutils literal&quot;&gt;QSignalMapper&lt;/tt&gt;. That version is left as an exercise.&lt;/p&gt;</content:encoded>
	<dc:date>2012-02-10T22:57:35+00:00</dc:date>
</item>
<item rdf:about="http://blog.vrplumber.com/index.php?/archives/2557-Phenomenal-Enterprise-Grade-Messaging-Itty-Bitty-Message-Size.html">
	<title>Mike C. Fletcher: Phenomenal Enterprise-Grade Messaging: Itty Bitty Message Size</title>
	<link>http://blog.vrplumber.com/index.php?/archives/2557-Phenomenal-Enterprise-Grade-Messaging-Itty-Bitty-Message-Size.html</link>
	<content:encoded>(Read that in Robin Williams' Genie Voice) A project I used to work on has been informed by certain rabbit-mq types that they should not send messages &amp;gt; 15KB on a RabbitMQ server because it would &amp;quot;chew up all the subscription threads and limit throughput&amp;quot;... which... wow, dropped off a robustness/scalability/credibility cliff there.&lt;br /&gt;</content:encoded>
	<dc:date>2012-02-10T21:35:37+00:00</dc:date>
</item>
<item rdf:about="http://inventwithpython.com/blog/2012/02/10/new-book-making-games-with-python-pygame/">
	<title>Invent with Python: New Book: &amp;#8220;Making Games with Python &amp;amp; Pygame&amp;#8221;</title>
	<link>http://inventwithpython.com/blog/2012/02/10/new-book-making-games-with-python-pygame/</link>
	<content:encoded>&lt;p&gt;&lt;a href=&quot;http://inventwithpython.com/pygame&quot;&gt;&lt;img src=&quot;http://inventwithpython.com/images/cover_makinggames_thumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve completed my next book, which focuses on the Pygame library and making graphical games in Python. It assumes you have a little bit of Python programming knowledge. The book is free to read online from &lt;a href=&quot;http://inventwithpython.com/pygame&quot;&gt;http://inventwithpython.com/pygame&lt;/a&gt; and can also be &lt;a href=&quot;http://www.amazon.com/Making-Games-Python-Pygame-Sweigart/dp/1469901730?ie=UTF8&amp;tag=playwithpyth-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0982106017&quot;&gt;bought on Amazon.com for $25&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to everyone who helped me out with this book over the last year and a half.&lt;/p&gt;</content:encoded>
	<dc:date>2012-02-10T21:13:03+00:00</dc:date>
</item>
<item rdf:about="http://tarekziade.wordpress.com/2012/02/10/defining-a-wsgi-app-deployment-standard/">
	<title>Tarek Ziade: Defining a wsgi app deployment standard</title>
	<link>http://tarekziade.wordpress.com/2012/02/10/defining-a-wsgi-app-deployment-standard/</link>
	<content:encoded>&lt;p&gt;Next month at Pycon, we&amp;#8217;ll have a web summit and I&amp;#8217;m invited there to talk about how I deploy web applications. This is not a new topic, as it was already discussed a bit last year &amp;#8212; &lt;a href=&quot;http://blog.ianbicking.org/2011/03/31/python-webapp-package/&quot;&gt;see Ian Bicking&amp;#8217;s thought on the topic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My presentation at the summit will be in two parts. I want to 1/ explain how I organized our Python deployments at Mozilla (using RPMs)  2/ make an initial proposal for a deployment standard that would work for the community at large &amp;#8211; I intend to work on this during Pycon and later on the dedicated SIG.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s an overview of the deployment standard idea&amp;#8230;&lt;/p&gt;
&lt;h3&gt;How we deploy usually&lt;/h3&gt;
&lt;p&gt;If I want to roughly summarize how people deploy their web applications these days, from my knowledge I&amp;#8217;d say that there are two main categories.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deployments that need to be done in the context of an existing packaging system &amp;#8212; like RPM or DPKG&lt;/li&gt;
&lt;li&gt;Deployments that are done in no particular context, where we want it to &lt;em&gt;just work&lt;/em&gt;. &amp;#8212; like a directory containing a virtualenv and all the dependencies needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In both cases, preparing a deployment usually consists of fetching Python packages at PyPI and maybe compile some of them. These steps are usually done using tools like &lt;em&gt;zc.buildout&lt;/em&gt; or &lt;em&gt;virtualenv + pip&lt;/em&gt;, and in the case of Mozilla Services, a custom tool that transforms all dependencies into RPMs.&lt;/p&gt;
&lt;p&gt;In one case we end up with a directory filled with everything needed to run the application, except the system dependencies, and in the other case with a collection of RPMs that can be deployed on the target system.&lt;/p&gt;
&lt;p&gt;But in both cases, we end up using the same thing: &lt;strong&gt;a complete list of Python dependencies&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The trick with using tools like zc.buildout or pip is that from an initial list of dependencies, you end up pulling indirect dependencies. For instance, the &lt;em&gt;Pyramid&lt;/em&gt; package will pull the &lt;em&gt;Mako&lt;/em&gt; package and so on.  A good practice is to have them listed in a single place and to pin each package to a specific version before releasing the app. Both pip and zc.buildout have tools to do this.&lt;/p&gt;
&lt;p&gt;Deployments practices I have seen so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a collection of rpms/debian packages/etc are built using tools like bdist_rpms etc.&lt;/li&gt;
&lt;li&gt;a virtualenv-based directory is created in-place in production or as a pre-build binary release that&amp;#8217;s archived and copied in production&lt;/li&gt;
&lt;li&gt;a zc-buildout-based directory is created in-place in production or as a pre-build binary release that&amp;#8217;s archived and copied in production&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The part that&amp;#8217;s still fuzzy for everyone that is not using RPMs or Debian packages is how to list system-level dependencies. We introduced in PEP 345 the notion of &lt;em&gt;hint&lt;/em&gt; where you can define system level dependencies which name may not be the actual name on the target system. So if you say you need &lt;em&gt;&lt;strong&gt;libxml-dev&lt;/strong&gt;&lt;/em&gt;, which is valid under Debian, people that deploy your system will know they&amp;#8217;ll need &lt;em&gt;&lt;strong&gt;libxml-devel&lt;/strong&gt;&lt;/em&gt; under Fedora. Yeah no magic here, it&amp;#8217;s a tough issue. &lt;a href=&quot;http://www.python.org/dev/peps/pep-0345/#requires-external-multiple-use&quot;&gt;see Requires-External&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The Standard&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;EDIT : Ian has a much more rich standard proposal &lt;a href=&quot;https://github.com/ianb/pywebapp/blob/master/docs/spec.txt&quot;&gt;here&lt;/a&gt;. (see the comments)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The standard I have in mind is a very lightweight standard that could be useful in all our deployment practices &amp;#8211; it&amp;#8217;s a thin layer on the top of the WSGIstandard.&lt;/p&gt;
&lt;p&gt;A wsgi application is a directory containing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a text file located in the directory at &lt;em&gt;&lt;strong&gt;dependencies.txt&lt;/strong&gt;&lt;/em&gt;,  listing all dependencies &amp;#8211; possibly reusing Pip&amp;#8217;s requirements format&lt;/li&gt;
&lt;li&gt;a text file located in the directory at &lt;strong&gt;&lt;em&gt;external&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;-dependencies.txt&lt;/strong&gt;&lt;/em&gt;,  listing all system dependencies &amp;#8211; possibly reusing PEP 345 format&lt;/li&gt;
&lt;li&gt;a Python script located it the directory at &lt;strong&gt;&lt;em&gt;bin/wsgiapp&lt;/em&gt;&lt;/strong&gt; with an  &amp;#8220;application&amp;#8221; variable. The shebang line of the Python script might also point to a local Python interpreter (a virtualenv version)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From there we have all kind of possible scenarios where the application can be built and/or run with the usual set of tools&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s one example of a deployment from scratch :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The repository of the project is cloned&lt;/li&gt;
&lt;li&gt;A virtualenv is created in the repository clone&lt;/li&gt;
&lt;li&gt;pip, which gets installed with virtualenv, is used to install all dependencies describes in&lt;em&gt;&lt;strong&gt; dependencies.txt&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;gunicorn is used to run the app locally using &amp;#8220;cd bin; gunicorn wsgiapp:application&amp;#8221;&lt;/li&gt;
&lt;li&gt;the directory is zipped and sent in production&lt;/li&gt;
&lt;li&gt;the directory is unzipped&lt;/li&gt;
&lt;li&gt;virtualenv is run again in the directory&lt;/li&gt;
&lt;li&gt;the app is hooked to Apache+mod_wsgi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another scenario I&amp;#8217;d use in our RPM environment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The repository of the project is cloned&lt;/li&gt;
&lt;li&gt;a RPM is built for each package in &lt;em&gt;&lt;strong&gt;dependencies.txt&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;if possible, &lt;em&gt;&lt;strong&gt;external-dependencies.txt&lt;/strong&gt;&lt;/em&gt; is used to feed a spec file.&lt;/li&gt;
&lt;li&gt;the app is deployed using the RPM collection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;#8217;s the idea, roughly &amp;#8212; a light standard to point a wsgi app and a list of dependencies.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://tarekziade.wordpress.com/category/mozilla/&quot;&gt;mozilla&lt;/a&gt;, &lt;a href=&quot;http://tarekziade.wordpress.com/category/python/&quot;&gt;python&lt;/a&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/tarekziade.wordpress.com/2338/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/tarekziade.wordpress.com/2338/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/tarekziade.wordpress.com/2338/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/tarekziade.wordpress.com/2338/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/tarekziade.wordpress.com/2338/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/tarekziade.wordpress.com/2338/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/tarekziade.wordpress.com/2338/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/tarekziade.wordpress.com/2338/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/tarekziade.wordpress.com/2338/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/tarekziade.wordpress.com/2338/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/tarekziade.wordpress.com/2338/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/tarekziade.wordpress.com/2338/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/tarekziade.wordpress.com/2338/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/tarekziade.wordpress.com/2338/&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=2338&amp;subd=tarekziade&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2012-02-10T19:28:48+00:00</dc:date>
</item>
<item rdf:about="http://pycon.blogspot.com/2012/02/interview-with-pycon-speaker-brian.html">
	<title>PyCon: Interview with PyCon speaker Brian Jones</title>
	<link>http://pycon.blogspot.com/2012/02/interview-with-pycon-speaker-brian.html</link>
	<content:encoded>&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;After a &lt;a href=&quot;http://us.pycon.org/2011/schedule/presentations/274/&quot; target=&quot;_blank&quot;&gt;successful tutorial&lt;/a&gt; session in 2011, &lt;a href=&quot;http://www.protocolostomy.com/&quot; target=&quot;_blank&quot;&gt;Brian Jones&lt;/a&gt; is back this year with a talk on a booming topic: mocking. Testing has always been fairly popular in the Python community, but it seems like more developers than ever are really on board with testing. The difference between unit testing and functional testing is getting more coverage. Test-driven development is becoming a more popular methodology. Continuous integration is getting easier to setup and use. It seems like every corner of the testing world is improving at a nice pace. Mocking in particular has been blowing up with more widespread use and more options than ever. Brian's talk, &lt;a href=&quot;https://us.pycon.org/2012/schedule/presentation/336/&quot; target=&quot;_blank&quot;&gt;Fake It Til You Make It: Unit Testing Patterns With Mocks and Fakes&lt;/a&gt;, aims to help developers get to the next level of testing by sharing best practices in the test design.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;While Brian has long been a fan of mocking, the last several years have seen enough mocking libraries produced to get him to switch from his home-grown tools to try what the community has to offer. Although he’s a former user of the &lt;a href=&quot;http://code.google.com/p/pymox/&quot; target=&quot;_blank&quot;&gt;Mox&lt;/a&gt; project, the choice of library for this talk will be the aptly named &lt;a href=&quot;http://www.voidspace.org.uk/python/mock/&quot; target=&quot;_blank&quot;&gt;Mock&lt;/a&gt;. However, the choice of Mock is less about the library and more about being able to easily convey ideas behind mocking. &quot;I suspect that Mock's 'action-&amp;gt;assertion' approach to mocking will be more intuitive to pick up 'on the fly', in the course of a talk, than the 'record-&amp;gt;replay' approach taken by other modules,&quot; says Brian.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&quot;I want people to think of testing as being more like a fun little puzzle than...calculus,&quot; he said when asked what caused him to submit the proposal for this talk. Mocking, he feels, is a huge help in getting testing to fit inside the minds of newcomers to the arena. With the talk he hopes to introduce the techniques and the tools, then put it all together in practice. The 45-minute session includes several types of example applications, from a datetime abstraction library to a command shell program, to show how Brian’s best practices with test design and mocking can be used.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Speaking is just one of the fun parts of PyCon for Brian. In his second year on PyCon's program committee, he helped review a record number of talk proposals. Sometimes meeting two times a day, the program committee had a busy fall between online reviews and voting, then the various IRC-based discussions on later rounds of reviews. Being a part of the program committee for a second year allowed him to &quot;further [his] conviction that the Python community is the most welcoming, open and inclusive group [he's] ever had the pleasure of being involved with.&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;When it comes to getting on-site at the conference, last year Brian volunteered some of his time to help out around the event. The evenings may be one of his favorite parts: he's a huge fan of the BoFs, or &lt;a href=&quot;http://en.wikipedia.org/wiki/Birds_of_a_feather_(computing)&quot; target=&quot;_blank&quot;&gt;Birds of a Feather&lt;/a&gt; meetings. “I've been to conferences where I'm really just not that interested in *any* of the BoF sessions, but at PyCon '11 I actually had conflicts: I wanted to attend multiple BoFs in the same time slot,&quot; he says.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;One of the best benefits he says of the conference is the ability meet up with the people he had been interacting with online for years. Now that he’s been to a PyCon in the past, meeting up with those same friends and meeting many more in 2012 is an incredible experience. In closing, he remarked that &quot;The community around Python is unbelievable, and attending PyCon is a great way to be bombarded by that fact on a continual basis for a few days, which is good for the soul.&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Be sure to check out Brian's talk on Friday March 9 at 2:55!&lt;/span&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/11638628-8036558524543417029?l=pycon.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-10T11:11:02+00:00</dc:date>
</item>
<item rdf:about="http://feedproxy.google.com/~r/PyPyStatusBlog/~3/muRV-bfxqw4/introductionary-article-about-rpython.html">
	<title>PyPy Development: Introductory Article About RPython</title>
	<link>http://feedproxy.google.com/~r/PyPyStatusBlog/~3/muRV-bfxqw4/introductionary-article-about-rpython.html</link>
	<content:encoded>&lt;a href=&quot;http://tratt.net/laurie&quot;&gt;Laurence Tratt&lt;/a&gt; from King's College London has written a long and detailed introduction to the &lt;a href=&quot;http://tratt.net/laurie/tech_articles/articles/fast_enough_vms_in_fast_enough_time&quot;&gt;goals and significance of RPython&lt;/a&gt; over on &lt;a href=&quot;http://tratt.net/laurie/tech_articles/&quot;&gt;his blog&lt;/a&gt;. Laurie has been implementing his &lt;a href=&quot;http://convergepl.org/&quot;&gt;Converge Language&lt;/a&gt; in RPython in the last months. He is one of the first people external to the PyPy team who have pushed a sizeable RPython-based VM quite far, adding and tuning JIT hints. The post describes some of that work and his impressions of RPython and PyPy.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&quot;RPython, to my mind, is an astonishing project. It has, almost single-handedly, opened up an entirely new approach to VM implementation. As my experience shows, creating a decent RPython VM is not a huge amount of work (despite some frustrations). In short: never again do new languages need come with unusably slow VMs. That the the PyPy / RPython team have shown that these ideas scale up to a fast implementation of a large, real-world language (Python) is another feather in their cap.&quot;&amp;nbsp; &lt;/blockquote&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/3971202189709462152-5386281283454207551?l=morepypy.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/PyPyStatusBlog/~4/muRV-bfxqw4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2012-02-10T11:06:38+00:00</dc:date>
</item>
<item rdf:about="http://feedproxy.google.com/~r/PyPyStatusBlog/~3/GYFROVnMQjg/pypy-18-business-as-usual.html">
	<title>PyPy Development: PyPy 1.8 - business as usual</title>
	<link>http://feedproxy.google.com/~r/PyPyStatusBlog/~3/GYFROVnMQjg/pypy-18-business-as-usual.html</link>
	<content:encoded>&lt;p&gt;We're pleased to announce the 1.8 release of PyPy. As habitual this
release brings a lot of bugfixes, together with performance and memory
improvements over the 1.7 release. The main highlight of the release
is the introduction of &lt;a class=&quot;reference external&quot; href=&quot;http://morepypy.blogspot.com/2011/10/more-compact-lists-with-list-strategies.html&quot;&gt;list strategies&lt;/a&gt; which makes homogenous lists
more efficient both in terms of performance and memory. This release
also upgrades us from Python 2.7.1 compatibility to 2.7.2. Otherwise
it's &amp;quot;business as usual&amp;quot; in the sense that performance improved
roughly 10% on average since the previous release.&lt;/p&gt;
&lt;p&gt;you can download the PyPy 1.8 release here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;a class=&quot;reference external&quot; href=&quot;http://pypy.org/download.html&quot;&gt;http://pypy.org/download.html&lt;/a&gt;&lt;/blockquote&gt;
&lt;div class=&quot;section&quot; id=&quot;what-is-pypy&quot;&gt;
&lt;h3&gt;What is PyPy?&lt;/h3&gt;
&lt;p&gt;PyPy is a very compliant Python interpreter, almost a drop-in replacement for
CPython 2.7. It's fast (&lt;a class=&quot;reference external&quot; href=&quot;http://speed.pypy.org&quot;&gt;pypy 1.8 and cpython 2.7.1&lt;/a&gt; performance comparison)
due to its integrated tracing JIT compiler.&lt;/p&gt;
&lt;p&gt;This release supports x86 machines running Linux 32/64, Mac OS X 32/64 or
Windows 32. Windows 64 work has been stalled, we would welcome a volunteer
to handle that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;highlights&quot;&gt;
&lt;h3&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;List strategies. Now lists that contain only ints or only floats should
be as efficient as storing them in a binary-packed array. It also improves
the JIT performance in places that use such lists. There are also special
strategies for unicode and string lists.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;As usual, numerous performance improvements. There are many examples
of python constructs that now should be faster; too many to list them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Bugfixes and compatibility fixes with CPython.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Windows fixes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;NumPy effort progress; for the exact list of things that have been done,
consult the &lt;a class=&quot;reference external&quot; href=&quot;http://buildbot.pypy.org/numpy-status/latest.html&quot;&gt;numpy status page&lt;/a&gt;. A tentative list of things that has
been done:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;multi dimensional arrays&lt;/li&gt;
&lt;li&gt;various sizes of dtypes&lt;/li&gt;
&lt;li&gt;a lot of ufuncs&lt;/li&gt;
&lt;li&gt;a lot of other minor changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Right now the &lt;cite&gt;numpy&lt;/cite&gt; module is available under both &lt;cite&gt;numpy&lt;/cite&gt; and &lt;cite&gt;numpypy&lt;/cite&gt;
names. However, because it's incomplete, you have to &lt;cite&gt;import numpypy&lt;/cite&gt; first
before doing any imports from &lt;cite&gt;numpy&lt;/cite&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;New JIT hooks that allow you to hook into the JIT process from your python
program. There is a &lt;a class=&quot;reference external&quot; href=&quot;http://doc.pypy.org/en/latest/jit-hooks.html&quot;&gt;brief overview&lt;/a&gt; of what they offer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Standard library upgrade from 2.7.1 to 2.7.2.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;ongoing-work&quot;&gt;
&lt;h3&gt;Ongoing work&lt;/h3&gt;
&lt;p&gt;As usual, there is quite a bit of ongoing work that either didn't make it to
the release or is not ready yet. Highlights include:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;Non-x86 backends for the JIT: ARMv7 (almost ready) and PPC64 (in progress)&lt;/li&gt;
&lt;li&gt;Specialized type instances - allocate instances as efficient as C structs,
including type specialization&lt;/li&gt;
&lt;li&gt;More numpy work&lt;/li&gt;
&lt;li&gt;Since the last release there was a significant breakthrough in PyPy's
fundraising. We now have enough funds to work on first stages of &lt;a class=&quot;reference external&quot; href=&quot;http://pypy.org/numpydonate.html&quot;&gt;numpypy&lt;/a&gt;
and &lt;a class=&quot;reference external&quot; href=&quot;http://pypy.org/py3donate.html&quot;&gt;py3k&lt;/a&gt;. We would like to thank again to everyone who donated.&lt;/li&gt;
&lt;li&gt;It's also probably worth noting, we're considering donations for the
Software Transactional Memory project. You can read more about &lt;a class=&quot;reference external&quot; href=&quot;http://morepypy.blogspot.com/2012/01/transactional-memory-ii.html&quot;&gt;our plans&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
The PyPy Team&lt;/p&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/3971202189709462152-7266036404915945090?l=morepypy.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/PyPyStatusBlog/~4/GYFROVnMQjg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2012-02-10T10:43:24+00:00</dc:date>
</item>
<item rdf:about="http://pycon.blogspot.com/2012/02/sign-up-for-pycon-5k-today.html">
	<title>PyCon: Sign up for the PyCon 5K today!</title>
	<link>http://pycon.blogspot.com/2012/02/sign-up-for-pycon-5k-today.html</link>
	<content:encoded>&lt;span&gt;&lt;span&gt;If you &lt;a href=&quot;http://pycon20125k.eventbrite.com/&quot; target=&quot;_blank&quot;&gt;sign up&lt;/a&gt; by Monday with at least a $20 ticket, you'll get an awesome shirt &lt;a href=&quot;http://gazit.me/2012/02/01/iterations.html&quot; target=&quot;_blank&quot;&gt;designed by Idan Gazit&lt;/a&gt;. On top of being one of PyCon's great designers, he's giving &lt;a href=&quot;https://us.pycon.org/2012/schedule/presentation/249/&quot; target=&quot;_blank&quot;&gt;two&lt;/a&gt; &lt;a href=&quot;https://us.pycon.org/2012/schedule/presentation/301/&quot; target=&quot;_blank&quot;&gt;talks&lt;/a&gt; at the conference!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://i.imgur.com/xwRUf.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://i.imgur.com/xwRUf.png&quot; width=&quot;153&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;The inaugural race kicks off at 7 AM on Saturday March 10, right before the day's festivities begin. From marathon runners to casual runners to walkers - everyone is invited. &lt;a href=&quot;http://pycon20125k.eventbrite.com/&quot; target=&quot;_blank&quot;&gt;Registration&lt;/a&gt; for the race is being handled by conference sponsor &lt;a href=&quot;http://www.eventbrite.com/&quot; target=&quot;_blank&quot;&gt;Eventbrite&lt;/a&gt;, but note that this is separate from your conference registration.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;For payment we're using the &quot;pay what you want&quot; model. If you want to run, simply sign up - it can cost you as low as $0. If you choose the $20 registration (by Monday!) you’ll get a really nice shirt.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;The best part of the race is that &lt;b&gt;it's for charity&lt;/b&gt;. Feel free to use the &quot;pay what you want&quot; option to help us help a number of great charities.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://www.autismspeaks.org/&quot; target=&quot;_blank&quot;&gt;Autism Speaks&lt;/a&gt; - Autism affects 1 in 110 children, 1 in 70 boys. Autism Speaks has grown into the nation's largest autism science and advocacy organization, dedicated to funding research into the causes, prevention, treatments and a cure for autism; increasing awareness of autism spectrum disorders; and advocating for the needs of individuals with autism and their families.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://cancer.org/&quot; target=&quot;_blank&quot;&gt;American Cancer Society&lt;/a&gt; - The American Cancer Society is a nationwide, community-based voluntary health organization dedicated to eliminating cancer as a major health problem. Headquartered in Atlanta, Georgia, the ACS has 12 chartered Divisions, more than 900 local offices nationwide, and a presence in more than 5,100 communities.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://www.epilepsyfoundation.org/&quot; target=&quot;_blank&quot;&gt;Epilepsy Foundation&lt;/a&gt; - The Epilepsy Foundation of America® is the national voluntary agency dedicated solely to the welfare of the almost 3 million people with epilepsy in the U.S. and their families. The organization works to ensure that people with seizures are able to participate in all life experiences; to improve how people with epilepsy are perceived, accepted and valued in society; and to promote research for a cure.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;For more information, see &lt;a href=&quot;https://us.pycon.org/2012/5k/&quot;&gt;https://us.pycon.org/2012/5k/&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Be sure to sign up and help us help some great organizations. Lace up your shoes - we'll see you at the starting line.&lt;/span&gt;&lt;br /&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/11638628-5650980066651779230?l=pycon.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-10T10:23:50+00:00</dc:date>
</item>
<item rdf:about="http://davywybiral.blogspot.com/2012/02/astro-physcom.html">
	<title>Davy Wybiral: Astro-Phys.com</title>
	<link>http://davywybiral.blogspot.com/2012/02/astro-physcom.html</link>
	<content:encoded>Today, Astro-Phys got a new JSON API for querying ephemerides. Enjoy!&lt;br /&gt;&lt;a href=&quot;http://www.astro-phys.com/api&quot;&gt;http://www.astro-phys.com/api&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Can now return planetary states in various units of measure and coefficients as either chebyshev or polynomial (also in various units).&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/6946125878559207247-3329896253329994281?l=davywybiral.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-10T09:31:29+00:00</dc:date>
</item>
<item rdf:about="http://douglatornell.ca/blog/2012/02/09/csv-downloads-from-pylons">
	<title>Doug Latornell: CSV Downloads from Web Apps</title>
	<link>http://douglatornell.ca/blog/2012/02/09/csv-downloads-from-pylons</link>
	<content:encoded>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;One of the users of an intranet app I maintain was using copy/paste to
put data from the app into Excel. She asked if there was a better
way. The pages she was copying from have tables of datastore objects,
so adding a CSV download feature was an obvious solution. Providing
that feature turned out to be pretty easy with the help of the
&lt;a class=&quot;reference external&quot; href=&quot;http://docs.python.org/library/stringio.html&quot;&gt;StringIO&lt;/a&gt; and &lt;a class=&quot;reference external&quot; href=&quot;http://docs.python.org/library/csv.html&quot;&gt;csv&lt;/a&gt; modules in the standard library.&lt;/p&gt;
&lt;p&gt;While the code below is from a Pylons controller class, I can't see it
being difficult to implement this in Django, Pyramid, or other web
framework stacks.&lt;/p&gt;
&lt;p&gt;The request handler for the CSV download looks like:&lt;/p&gt;


&lt;div class=&quot;pygments_default&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cString&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;csv&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;csv_download&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;csv_buffer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cStringIO&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StringIO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;csv_writer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csv_buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;header&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_build&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csv_header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;csv_writer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;writerow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;query_result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_data_for_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query_result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_build_csv_row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;csv_writer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;writerow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csv_buffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getvalue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;csv_buffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;content_type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'text/csv; charset=utf-8'&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;content_disposition&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;'attachment; filename=&amp;quot;your_file.csv&amp;quot;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;content&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This method uses &lt;tt class=&quot;docutils literal&quot;&gt;StringIO&lt;/tt&gt; to set up a file-like memory buffer, and
instantiates a default CSV writer to write to the buffer. Next we
build the header row and write it to the buffer. Then we get an
iterator for the content that we want to write the the CSV file from
the datastore, and format and write it to the buffer, one line at a
time. Finally we get the CSV data from the buffer, set the response
headers appropriately, and return the CSV data for download.&lt;/p&gt;
&lt;p&gt;One thing I'm uncertain about: Is it necessary to explicitly call
&lt;tt class=&quot;docutils literal&quot;&gt;close&lt;/tt&gt; method on a &lt;tt class=&quot;docutils literal&quot;&gt;StringIO&lt;/tt&gt; instance, or could I just do:&lt;/p&gt;


&lt;div class=&quot;pygments_default&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csv_buffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getvalue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and let garbage collection take care of releasing the memory allocated
for &lt;tt class=&quot;docutils literal&quot;&gt;csv_buffer&lt;/tt&gt;?&lt;/p&gt;
&lt;p&gt;To get Excel to play nice with UTF-8 encoded data it's necessary to
include 3 specific bytes as a Byte Order Mark (BOM) at the beginning
of the file. I did that by prepending them to the heading string for
the first column:&lt;/p&gt;


&lt;div class=&quot;pygments_default&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_build_csv_header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;UTF_8_BOM&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\xef\xbb\xbf&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;header&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;UTF_8_BOM&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Column 1 Heading'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;header&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Building the content for each row of the CSV file is just a matter of
formatting each query result into an array of strings. Fields
containing non-ASCII characters stored as Unicode need to be encoded
to UTF-8:&lt;/p&gt;


&lt;div class=&quot;pygments_default&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_build_csv_row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;column_1_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;'{:%Y-%m-&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;some_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unicode_value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'utf-8'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;row&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I had an additional complication to deal with. The data for one of the
CSV columns is stored in the database as HTML fragments that may
contain non-ASCII characters. That data had to be rendered to Unicode
before it could be added to the CSV row (encoded as UTF-8). It turns
out that the Python standard library provides a fairly painless way of
handling that complication too, but I'll leave that for another post.&lt;/p&gt;
&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-10T05:34:51+00:00</dc:date>
</item>
<item rdf:about="http://emptysquare.net/blog/slides-from-my-talk-on-asynchronous-web-frameworks-python-and-mongodb/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=slides-from-my-talk-on-asynchronous-web-frameworks-python-and-mongodb">
	<title>EmptysquarePython: Slides from my talk on asynchronous web frameworks, Python, and MongoDB</title>
	<link>http://emptysquare.net/blog/slides-from-my-talk-on-asynchronous-web-frameworks-python-and-mongodb/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=slides-from-my-talk-on-asynchronous-web-frameworks-python-and-mongodb</link>
	<content:encoded>&lt;p&gt;Here&amp;#8217;s the slides for the talk I gave at the NYC Python Meetup tonight, on asynchronous web frameworks, Python, and MongoDB.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.slideshare.net/emptysquare/python-async-web-frameworks-and-mongodb&quot;&gt;Direct link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Embedded:&lt;/p&gt;
&lt;div id=&quot;__ss_11507201&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/emptysquare/python-async-web-frameworks-and-mongodb&quot; title=&quot;Python, async web frameworks, and MongoDB&quot;&gt;Python, async web frameworks, and MongoDB&lt;/a&gt;&lt;/strong&gt;
&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/emptysquare&quot;&gt;emptysquare&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;</content:encoded>
	<dc:date>2012-02-10T03:49:22+00:00</dc:date>
</item>

</rdf:RDF>

