<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
      xml:base="http://reinout.vanrees.org/" xml:lang="en">
  <link rel="self"
        href="http://reinout.vanrees.org/weblog/djangofeed.xml" />
  <link href="http://reinout.vanrees.org/weblog/"
        rel="alternate" type="text/html" />

  <div xmlns="http://www.w3.org/1999/xhtml">
    <a href="http://www.atomenabled.org/feedvalidator/check.cgi?url=http%3A%2F%2Freinout.vanrees.org%2Fweblog%2Fdjangofeed.xml">
      <img title="Validate my Atom feed" width="88"
           height="31"
           src="http://www.atomenabled.org/feedvalidator/images/valid-atom.png"
           alt="[Valid Atom]" border="0px" />
    </a>
    <p>
      <span>
        This is an Atom formatted XML site feed. It is intended to be viewed in
        a Newsreader or syndicated to another site. Please visit
      </span>
      <a href="http://www.atomenabled.org/">Atom Enabled</a>
      <span>
        for more info.
      </span>
    </p>
  </div>

  <title type="html">Reinout van Rees' weblog</title>
  <subtitle>Python, grok, books, history, faith, etc.</subtitle>
  <updated>2009-04-04T21:44:00+01:00</updated>
  <id>urn:syndication:a55644db8591c020bd38852775819a9a</id>

  
  <entry>
    <title>Water software and python</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/06/15/water-and-python.html" />
      <id>http://reinout.vanrees.org/weblog/2013/06/15/water-and-python.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-06-15T00:00:00+01:00</published>
      <updated>2013-06-15T01:37:00+01:00</updated>

      
      <category term="python" />
      
      <category term="nelenschuurmans" />
      
      <category term="lizard" />
      
      <category term="django" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>Weird link I got from a colleague this evening: <a class="reference external" href="http://www.nederlandict.nl/index.shtml?id=12854&amp;ch=ICT&amp;refID=10303">some Dutch ICT awards</a>
were awarded this week. The link is in Dutch, but trust me if I say
that the two (to me) relevant awards were awarded to Python (as a
fantastic computer language) and to <a class="reference external" href="http://www.hydrologic.com">hydrologic</a> (a Dutch water+ict company, for their
water software).</p>
<p>For me, the weirdness is three-step process:</p>
<ul class="simple">
<li>Ok, an award for Python is nice! Almost all our (<a class="reference external" href="http://www.nelen-schuurmans.nl">Nelen &amp; Schuurmans</a>) software is written in Python.
And virtually all of it is open source. Just look at github:
<a class="reference external" href="https://github.com/nens/">https://github.com/nens/</a> and especially
<a class="reference external" href="https://github.com/lizardsystem/">https://github.com/lizardsystem/</a> . Lots of Python and Django.</li>
<li>The water software award goes to a closed source Microsoft shop.</li>
<li>We (<a class="reference external" href="http://www.nelen-schuurmans.nl">Nelen &amp; Schuurmans</a>) are the
perfect combination of water software and open source Python.</li>
</ul>
<p>We're a water consultancy company. And a successful one, too. Lots of
great projects. Most of them centered around something called Lizard
(<a class="reference external" href="http://lizard.net">http://lizard.net</a> for the mostly-Dutch business language stuff,
<a class="reference external" href="http://lizard.org">http://lizard.org</a> for the English IT stuff). Lots of partners working
on and with it. It is a real platform with every partner putting in
ideas and expertise. Most of the actual <em>programming</em> happens at our
place, to be fair, at the moment. But... I've now personally been
involved with already three partner companies that have been working
with the Python code.</p>
<p>Ok, <strong>now what's the weird thing?</strong> Well, the things being said in the
other company's award text are actually the things I'd use to describe
the Lizard products :-) The core tenet of Lizard is &quot;combining data&quot;
and that's literally what's in the award text. I have got the videos
and screenshots to prove it. I can show you the lines in lizard-map's
<tt class="docutils literal">models.py</tt> that are the core of our information-combination
structure.</p>
<p>Well, let them have fun. If you're looking for water-related software,
Lizard is the one you want. Combining data, friendly visualization,
big data, flood calculations, a lot. And... most of it is open source.
And <strong>our software combines water with the other award winner:
Python!</strong> Open source Python water software. That's much better than
the current water software award winner: I can hardly find a
screenshot on their webpage. And not a lot of specifics. <em>We</em> have got
all our stuff on github and a bunch of demo videos on
<a class="reference external" href="http://video.nelen-schuurmans.nl/">http://video.nelen-schuurmans.nl/</a>.</p>
<p>I'm very happy working where I work now. Water + open source + python:
it can hardly get better. I notice the same mindset in my colleagues:
we're a big force that's pushing forwards and putting out lots of very
good software. Including source code, screen shots and videos. To me,
that's pretty different from working for a company without open
source, with microsoft-only software and with hardly a screenshot on
their website. (Perhaps weird that I'm hammering on the lack of
screenshots, but I still haven't managed to see one of &quot;their&quot;
websites in real life, so I'm personally (probably unfairly) thinking
about it as brochure-ware instead of as a potential threat...)</p>
<p>Wanna work on great Python water software in Utrecht? Mail us
(provided you speak Dutch, that's pretty much a necessity). A nice
working location dead smack in the center of Utrecht next to the <em>oude
gracht</em>. Especially nice now that the weather is good!</p>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>Non-trusted mercurial .hgrc on a Vagrant virtualbox</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/28/vagrant-mercurial.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/28/vagrant-mercurial.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-28T00:00:00+01:00</published>
      <updated>2013-05-28T13:34:00+01:00</updated>

      
      <category term="apple" />
      
      <category term="python" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>I <a class="reference external" href="http://reinout.vanrees.org/weblog/2012/10/30/vagrant-osx-how.html">use Vagrant and virtualbox</a> for
developing inside ubuntu on OSX. I have a couple of mercurial (hg) checkouts
and they were giving me grief:</p>
<pre class="literal-block">
$ hg up
Not trusting file /some-repo/.hg/hgrc from untrusted user 501, group dialout
</pre>
<p>The <tt class="docutils literal">.hg/hgrc</tt> file contains the remote repo URL, so pulling even won't
work. The problem is apparently the interaction between virtualbox and OSX if
you use NFS to mount part of your OSX's harddisk.</p>
<p>The solution/workaround is quite simple. Tell mercurial to trust that <tt class="docutils literal">501</tt>
user in your <tt class="docutils literal"><span class="pre">~/.hgrc</span></tt>:</p>
<pre class="literal-block">
....
[trusted]
users = 501
</pre>
<p>Now it works!</p>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>Transactions for web developers - Aymeric Augustin</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/transactions-for-web-developers.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/transactions-for-web-developers.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-21T07:43:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>Initially he didn't know a lot about transactions, so he researched them in
depth. A quote by Christophe Pettus: &quot;transaction management tools are often
made to seem like a black art&quot;.</p>
<p>He moves from the database (postgres and sqlite) to the interface (psycopg2
and sqlite3) to the framework (django).</p>
<div class="section" id="database">
<h1>Database</h1>
<p>A definition: an SQL transaction is a sequence of SQL statements that is
<strong>atomic</strong> with respect to recovery. In SQL 92, a transaction begins with a
transaction-initiating statement (almost everything can start a transaction)
and it ends with a commit, an explicit rollback (<tt class="docutils literal">ROLLBACK</tt>) or an
<em>implicit</em> rollback.</p>
<p>SQL 1999 changed this a bit. It has savepoints. After a savepoint, you can
rollback to that savepoint, to a previous savepoint or you can set a new
savepoint. Oh, and there is an explicit transaction start statement (<tt class="docutils literal">START
TRANSACTION</tt>).</p>
<p>Key findings:</p>
<ul class="simple">
<li>Statements always run in transactions.</li>
<li>Transactions are opened automatically.</li>
<li>Transactions are advanced technology.</li>
</ul>
<p>Remember the dreaded &quot;current transaction is aborted, commands ignored until
end of transaction block&quot; postgresql fault? What it actually means is &quot;a
previous statement failed, the application must perform a rollback&quot;. You
cannot let postgres do any auto-recovery, that would break transactional
integrity. It is your application that needs to do it (and it should always do
it).</p>
<p>(I didn't hear what the actual solution is). <strong>Update</strong>: Diederik says <a class="reference external" href="#comment-901094833">in his
comment</a> that the solution is to just switch on
autocommit for postgres in the database settings.</p>
<p>There's also AUTOCOMMIT. Most databases default to it. It commits every single
statement automatically. Normally, you are either in auto-commit mode or
inside transactions.</p>
</div>
<div class="section" id="interface-the-python-client-libraries">
<h1>Interface: the python client libraries</h1>
<p>Psycopg2 and sqlite3 are wrappers around C libraries. They use the DB API 2.0,
<a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">PEP 249</a>. It defines connections
and cursors. Connections implement transactions, cursors do fetching and
setting.</p>
<p>Note: the PEP wants the auto-commit to be off, initially!</p>
<p>Psycopg2 handles it by inserting a BEGIN before every statement, unless
there's already a transaction in progress. Even for SELECTs.</p>
<p>Sqlite3 also inserts <tt class="docutils literal">BEGIN</tt>, but not for a <tt class="docutils literal">SELECT</tt>. All other statements get a
<tt class="docutils literal">COMMIT</tt>. Even a statement like <tt class="docutils literal">SAVEPOINT</tt>: this is broken by design
(&quot;documentation issue&quot;).</p>
<p>Key findings:</p>
<ul class="simple">
<li>The DB API requires the same transactional behaviour as the SQL standard.</li>
<li>Client libraries for databases that always autocommit have to emulate this
behaviour.</li>
<li>But you can turn it off and use autocommit</li>
</ul>
</div>
<div class="section" id="framework-django">
<h1>Framework (django)</h1>
<p>Django 1.5 and earlier runs with an open transaction. For
updates/deletes/saves, django does a commit. More or less auto-commit.</p>
<p>There's transaction middleware. One http request = one transaction. Commit on
success, roll back on exception. It only works for the default database,
though. And depending on the order of your middleware, it may or may not
apply.</p>
<p>Django provides a couple of high-level APIs. <tt class="docutils literal">with
<span class="pre">transaction.autocommit():</span></tt>, <tt class="docutils literal">with <span class="pre">transaction.commit_on_success():</span></tt>, <tt class="docutils literal">with
<span class="pre">transaction.commit_manually():</span></tt>. There is also a low-level API for doing
stuff manually.</p>
<p>Key findings:</p>
<ul class="simple">
<li>OK to forget it, it will change in 1.6.</li>
<li>The middleware is a reasonable idea.</li>
<li>The decorators/context managers don't work well, they often cannot be
nested.</li>
</ul>
<p>Django 1.6 uses database-level autocommit, which is what you'd normally
expect. There are atomic transactions for requests: only for the view
functions. Again. one transaction per http requests.</p>
<p>The high level API is now called <tt class="docutils literal">atomic</tt>. Usable as a decorator and as a
context manager. It <em>can</em> be safely nested.</p>
<p>Key learnings:</p>
<ul class="simple">
<li>django 1.6 will have sane transaction-related functionality.</li>
<li>Read the documentation at
<a class="reference external" href="https://docs.djangoproject.com/en/dev/topics/db/transactions/">https://docs.djangoproject.com/en/dev/topics/db/transactions/</a></li>
</ul>
</div>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>Lightning talks day 3 - Djangocon.eu</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/lighting-talks-day3.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/lighting-talks-day3.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-17T16:32:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      

      <content type="html"><![CDATA[
        <div class="document">
<div class="section" id="html5lib">
<h1>html5lib</h1>
<p>Browsers are terribly forgiving. Python's parsers don't deal with everything,
even valid html5 docs. html5lib was a problem. Google code and so and not
python 3 compatible.</p>
<p>The new html5lib supports python 3. Github, readthedocs, works fine!</p>
<p>See <a class="reference external" href="https://pypi.python.org/pypi/html5lib">https://pypi.python.org/pypi/html5lib</a></p>
</div>
<div class="section" id="real-time-web-aymeric-augustin">
<h1>Real time web - Aymeric Augustin</h1>
<p>He looked at web sockets in django. He played with tulip, Guido's library for
async python. He had 1000 processes calculating a 'game of life' screen and
django connected with them just fine and pushed the result to the browser.</p>
</div>
<div class="section" id="pywaw">
<h1>PyWaw</h1>
<p><a class="reference external" href="http://pywaw.org/">PyWaw</a> is a python community in Warsaw. They have now
had 24 meetings with about 55 attendees. At the last meeting they even had 100
people attending.</p>
<p>They are not alone in Poland, there are other user groups.</p>
<p>So... go back to your cities and start user groups!</p>
</div>
<div class="section" id="scrapy">
<h1>Scrapy</h1>
<p>Screen scraping is when you need to get structured information from the web,
quickly and with no hassle.</p>
<p><a class="reference external" href="http://scrapy.org/">Scrapy</a> takes the hassle out of screen scaping. It
takes away the pain of parsing horrible html.</p>
<p>It has perfect documentation and a helpful community.</p>
<p>You can even scrape from amazon, even including logging in.</p>
<p>What can you do? Convert SVG to VML. Stock checker for a market place. Testing
your own website.</p>
</div>
<div class="section" id="motivating-users-aaron-bassett">
<h1>Motivating users - Aaron Bassett</h1>
<p>How to motivate kids aged 7-17 to learn online. Don't give rewards. If you
give rewards, that means that the task must be really shit. Rewards don't
scale either. After initial success, do you increase the reward?</p>
<p>Everyone is addicted to dopamine, the stuff you get in your head when you
like something. Don't give a reward always, because that turns play (which
kids like) into work.</p>
<p>They did some tests: random rewards <em>do</em> seem to work. So that's something you
can look at.</p>
</div>
<div class="section" id="better-model-inheritance-craig-de-stigter">
<h1>Better model inheritance - Craig de Stigter</h1>
<p>There are three kinds of model inheritance now in Django:</p>
<ul class="simple">
<li>Proxy models.</li>
<li>Abstract models.</li>
<li>Multi-table.</li>
</ul>
<p>None fit exactly with his usecase.</p>
<p>What he made was <a class="reference external" href="https://github.com/craigds/django-typed-models">django-typed-models</a>. A bit like proxy models,
but it does store the type of the object in a type field, so you can figure
out what you actually are.</p>
<p>They even use python magery for re-casting objects as a different type:
<tt class="docutils literal">self.__class__ = NewClass</tt> :-)</p>
</div>
<div class="section" id="django-fluent-cms-diederik-van-der-boor">
<h1>Django-fluent CMS - Diederik van der Boor</h1>
<p>It is a CMS he build for his own CMS. Many CMSs are, in the end, monolythic.</p>
<p>He made a CMS that consists of separate parts. If you just want a tree of
pages, use django-fluent-pages. If you just want an editable main part of a
page, use another app. Etcetera.</p>
<p>See <a class="reference external" href="https://pypi.python.org/pypi/django-fluent-pages/">https://pypi.python.org/pypi/django-fluent-pages/</a>, <a class="reference external" href="https://pypi.python.org/pypi/django-fluent-contents/">https://pypi.python.org/pypi/django-fluent-contents/</a></p>
<p>And you can also use <a class="reference external" href="https://github.com/edoburu/django-fluent-dashboard">django-fluent-dashboard</a>, a more beautiful admin
skin.</p>
<p><strong>Update</strong>: he's got a website now: <a class="reference external" href="http://django-fluent.org/">http://django-fluent.org/</a></p>
</div>
<div class="section" id="adventurer-in-the-land-of-production-environment-maciej-pasternacki">
<h1>Adventurer in the land of production environment - Maciej Pasternacki</h1>
<p>Is your production enviroment up? Use a monitor like <a class="reference external" href="http://pingdom.com">http://pingdom.com</a>.</p>
<p>Django should not run as root. Run it with gunicorn and nginx, for instance.</p>
<p>Get immune to surprise upgrades: <tt class="docutils literal">pip freeze</tt>.</p>
<p>Amulet of life saving: re-spawn when death with supervisord.</p>
<p>Stun immunity: a crontab with <tt class="docutils literal">&#64;reboot</tt>, for instance.</p>
<p>Acquire skill: chef, puppet.</p>
<p>The final battle: the slashdot effect. Gear up: autoscaling, self-healing.</p>
</div>
<div class="section" id="new-core-committer">
<h1>New core committer</h1>
<p>Marc Tamlyn is the new core committer!</p>
</div>
<div class="section" id="invisible-and-intentional-management-darin-swanson">
<h1>Invisible and intentional management - Darin Swanson</h1>
<p>Your project is not code, your project is your people. Make them happy. Make
them do the best they can, no more, no less. Keep them leveling up.</p>
<p>Reward teamwork. It is not about the individual. Don't have individual goals,
have team roles instead. Talk about &quot;we&quot; and &quot;us&quot;. Lead by example. Help the
team. Help everyone do better.</p>
<p>If you're a manager, try to be invisible. You're behind the
scenes. Multiplying your impact behind the scenes. Don't take credit, the
credit is for the team.</p>
<p>Move people to autonomy. Stay away from command and control. Set degrees of
freedom and let people grow.</p>
<p>There's an implicit contract between you and your teammember: I'll give you
freedom, you'll share status and information with me.</p>
<p><strong>Discard what doesn't work, double down on what does</strong>. Especially regarding
teamwork.</p>
<p>Do try to become better yourself, too. Find a mentor, read books, talk with others.</p>
</div>
<div class="section" id="relationships-daniele-procida">
<h1>Relationships - Daniele Procida</h1>
<p>There are 7E9 people in the world. Is your relationship really the best
choice? Mathemetically not. Don't worry. Instead, commit to what you have
already chosen and make it the best relation for you.</p>
<p>Same with web frameworks. There are so many... Stop worrying about making the
wrong choice, stick with the one you have already chosen and make it the best
for you.</p>
<p>Another subject: he wrote <a class="reference external" href="https://github.com/evildmp/django-inspector">https://github.com/evildmp/django-inspector</a> to
report on all sorts of pages that his uses have added to his system. Status
codes and so.</p>
</div>
<div class="section" id="arduino-loal">
<h1>Arduino.loal</h1>
<p>He hacked his landlord's garage door opener. They only had one and there were
multiple people that needed to use it. So hack the opener, add an arduino and
a webserver to control the garage door. They also added django-social-auth.</p>
<p>An enterprise level garage door opener!</p>
</div>
<div class="section" id="spdy-emanuele-palazetti">
<h1>SPDY - Emanuele Palazetti</h1>
<p>How to deploy Django over SPDY. How to get that to work? Run django inside
jython and thus inside java and SPDY push actually works.</p>
</div>
<div class="section" id="simple-ways-to-make-your-side-load-faster-filip-wasilewski">
<h1>3 simple ways to make your side load faster - Filip Wasilewski</h1>
<ul class="simple">
<li>Database connection pooling. Creating a connection can take quite some
time. Connection pooling will come in django core 1.6.</li>
<li>Cache templates. Especially if you use something lik django-crispy-forms
that uses lots of small templates. You only need to enable a template cacher
in <tt class="docutils literal">TEMPLATE_LOADERS</tt> in your settings.</li>
<li>pjax. Push state ajax. That helps a lot.</li>
</ul>
</div>
<div class="section" id="salt-stack-chris-reeves">
<h1>Salt stack - Chris Reeves</h1>
<p>He used to use Puppet, but didn't like the DSL. It was quite slow and wanted
something better, stronger, faster.</p>
<p>They came accros Salt. Written in Python. Very fast. It is explicit, you
control everything from the master, the clients don't call home themselves.</p>
<p>In your configuration templates you can use jinja2 for loops and so.</p>
<p>See <a class="reference external" href="http://docs.saltstack.com/">http://docs.saltstack.com/</a></p>
<p>His verdict: <strong>it is consise and clean.</strong></p>
</div>
<div class="section" id="your-webpages-are-too-big">
<h1>Your webpages are too big</h1>
<p>Why should you care?</p>
<ul class="simple">
<li>Less developed countries.</li>
<li>Mobile users.</li>
<li>Overloaded wifi at django conferences.</li>
</ul>
<p>What can you do?</p>
<ul class="simple">
<li>gzip compression on the server.</li>
<li>django-htmlmin for html minification. It is still young and quite buggy at
the moment.</li>
<li>css/js minification. Look at django-pipeline.</li>
<li>Do you need the full jquery? jquip has 90% of the functionality and 10% of
the size. If you need the full version, use a CDN.</li>
<li>Bootstrap css: don't hit &quot;download&quot; go to &quot;customize&quot; and make yourself a
smaller version.</li>
<li><a class="reference external" href="https://github.com/samastur/image-diet">https://github.com/samastur/image-diet</a> to optimize your images. Works out of
the box with easy-thumbnails.</li>
</ul>
</div>
<div class="section" id="being-a-community-member-mark-steadman">
<h1>Being a community member - Mark Steadman</h1>
<p>He sucks at people stuff. Small groups are OK, but bigger groups are a
problem. So that's hard when trying to integrate in a community, also the
django community.</p>
<p>He works now on <a class="reference external" href="https://pypi.python.org/pypi/bambu-tools/">bambu-tools</a>, a
huge collection of small useful tools and components. But it needs work and
fixes to make it useful for everyone.</p>
<p>Which is, see the first paragraph, hard for him. He'll be at the sprints and
he'll do his best!</p>
</div>
<div class="section" id="django-and-vagrant-and-pycharm">
<h1>Django and vagrant and PyCharm</h1>
<p>Three kinds of magic:</p>
<ul class="simple">
<li>Django is beautiful. There's magic inside, but it is beautiful magic.</li>
<li>Vagrant is non-understandable magic.</li>
<li>PyCharm was already magic in 2010 and it is even better now.</li>
</ul>
<p>He now has something even better than magic. He has a miracle.  He showed
vagrant workin inside PyCharm. Looks quite nice. The debugger even works when
the code runs inside the virtual machine.</p>
</div>
<div class="section" id="jukebox-loci">
<h1>Jukebox - loci</h1>
<p>What to do when different people have different music styles, for instance at
a party? Time for democracy. A website running locally on your laptop allows
you to log in and vote for numbers. The highest-voted songs will be played
first :-)</p>
<p>See <a class="reference external" href="https://github.com/lociii/jukebox">https://github.com/lociii/jukebox</a></p>
</div>
<div class="section" id="classy-class-based-views">
<h1>Classy class based views</h1>
<p>Very handy when working with Django's class based views: <a class="reference external" href="http://ccbv.co.uk">http://ccbv.co.uk</a></p>
<p>(Note: I already used a link here in my summary of Russell's <a class="reference external" href="http://reinout.vanrees.org/weblog/2013/05/17/class-based-views.html">class based
views talk</a>. See
<a class="reference external" href="http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/UpdateView/">http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/UpdateView/</a> )</p>
</div>
<div class="section" id="ideas-don-t-solve-problems-lukasc-balcerzak">
<h1>Ideas don't solve problems - Lukasc Balcerzak</h1>
<p>His first computer came with <a class="reference external" href="https://en.wikipedia.org/wiki/Logo_%28programming_language%29">logo</a>, you could
move the cursor with it to draw lines. Infinite possibilities, so no goal.</p>
<p>There are a lot of open source projects. Does it reinvent the wheel? Does it
solve a relative simple problem? Those are two ways to rate projects on.</p>
<p>Example one:</p>
<ul class="simple">
<li>Just try reading a URL with Python. Which built-in library to use? Hard.</li>
<li>The &quot;requests&quot; library is a small library that solves one relatively simple problem.</li>
</ul>
<p>Example two:</p>
<ul class="simple">
<li>Django-guardian extends Django's auth and has shortcuts for basic stuff. Much
simpler.</li>
<li>Django's auth itself is quite elaborate and hard.</li>
</ul>
</div>
<div class="section" id="testing-class-based-views-benoit-chesneau">
<h1>Testing class based views - Benoît Chesneau</h1>
<p>You can use <tt class="docutils literal">django.test.client</tt>, but that is an integration test. All the
middleware and so is used.</p>
<p>For unittests, you can use a request factory. You still test the system, the
callable.</p>
<p>We can also do <strong>focused unittesting</strong>. We can mimic <tt class="docutils literal">as_view()</tt>:</p>
<pre class="literal-block">
view.request = request
view.args = args
views.kwargs = kwargs
</pre>
<p>With this, you can test your code much more focused. And you gain speed!</p>
<p>Further reading: <a class="reference external" href="http://tech.novapost.fr/django-unit-test-your-views-en.html">http://tech.novapost.fr/django-unit-test-your-views-en.html</a></p>
</div>
<div class="section" id="django-client-certificates-deni-bertovic">
<h1>Django client certificates - Deni Bertovic</h1>
<p>Why would you use client SSL certificates? Isn't user/passwd enough?</p>
<p>The advantage: nginx takes care of authentication.</p>
<p>See <a class="reference external" href="https://github.com/denibertovic/django-client-certificates">https://github.com/denibertovic/django-client-certificates</a></p>
</div>
<div class="section" id="arduino-swift">
<h1>Arduino - Swift</h1>
<p>Normally you have to code in C. But now you can also do it in Python.</p>
<p>See <a class="reference external" href="https://github.com/theycallmeswift/BreakfastSerial">https://github.com/theycallmeswift/BreakfastSerial</a></p>
<p>He demo'ed it. Very nice! Looks useful and usable and simple. Perfect.</p>
</div>
<div class="section" id="next-conference-remco-wendt">
<h1>Next conference - Remco Wendt</h1>
<p>This is now the fifth year. We have a tradition now! High quality conferences
organized for programmers by programmers. Not for profit. Great! And now the
fun factor is there, too.</p>
<p>The fun will stay! Next year it'll be France, on the beach, in the south!
(They don't know the exact city yet).</p>
</div>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>Prehistorical Python: patterns past their prime - Lennart Regebro</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/prehistorical-python.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/prehistorical-python.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-17T14:35:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      

      <content type="html"><![CDATA[
        <div class="document">
<img src="/regebro.png" /><div class="section" id="dicts">
<h1>Dicts</h1>
<p>This works now:</p>
<pre class="literal-block">
&gt;&gt;&gt; from collections import defaultdict
&gt;&gt;&gt; data = defaultdict(list)
&gt;&gt;&gt; data['key'].add(42)
</pre>
<p>It was added in python 2.5. Previously you'd do a manual check whether the key
exists and create it if it misses.</p>
</div>
<div class="section" id="sets">
<h1>Sets</h1>
<p>Sets are very useful. Sets contain unique values. Lookups are fast. Before
you'd use a dictionary:</p>
<blockquote>
<pre class="doctest-block">
&gt;&gt;&gt; d = {}
&gt;&gt;&gt; for each in list_of_things:
...     d[each] = None
&gt;&gt;&gt; list_of_things = d.keys()
</pre>
</blockquote>
<p>Now you'd use:</p>
<blockquote>
<pre class="doctest-block">
&gt;&gt;&gt; list_of_things = set(list_of_things)
</pre>
</blockquote>
</div>
<div class="section" id="sorting">
<h1>Sorting</h1>
<p>You don't need to turn a set into a list before sorting it. This works:</p>
<blockquote>
<pre class="doctest-block">
&gt;&gt;&gt; something = set(...)
&gt;&gt;&gt; nicely_sorted = sorted(something)
</pre>
</blockquote>
<p>Previously you'd do <tt class="docutils literal">some_list.sort()</tt> and then turn it into a set.</p>
</div>
<div class="section" id="sorting-with-cmp">
<h1>Sorting with cmp</h1>
<p>This one is old::</p>
<pre class="literal-block">
&gt;&gt;&gt; def compare(x, y):
...     return cmp(x.something, y.something)
&gt;&gt;&gt; sorted(xxxx, cmp=compare)
</pre>
<p>New is to use a key. That gets you one call per item. The comparison function
takes two items, so you get a whole lot of calls. Here's the new:</p>
<pre class="literal-block">
&gt;&gt;&gt; def get_key(x):
...     return x.something
&gt;&gt;&gt; sorted(xxxx, key=get_key)
</pre>
</div>
<div class="section" id="conditional-expressions">
<h1>Conditional expressions</h1>
<p>This one is very common!</p>
<p>This old one is hard to debug if blank_choice <em>also</em> evaluates to None:</p>
<pre class="literal-block">
&gt;&gt;&gt; first_choice = include_blank and blank_choice or []
</pre>
<p>There's a new syntax for conditional expressions:</p>
<pre class="literal-block">
&gt;&gt;&gt; first_choice = blank_choice if include_blank else []
</pre>
</div>
<div class="section" id="constants-and-loops">
<h1>Constants and loops</h1>
<p>Put constant calculations outside of the loop:</p>
<blockquote>
<pre class="doctest-block">
&gt;&gt;&gt; const = 5 * a_var
&gt;&gt;&gt; result = 0
&gt;&gt;&gt; for each in some_iterable:
...     result += each * const
</pre>
</blockquote>
<p>Someone suggested this as an old-dated pattern. You can put it inside the
loop, python will detect that and work just as fast. He tried it out and it
turns out to depend a lot on the kind of calculation, so just stick with the
above example.</p>
</div>
<div class="section" id="string-concatenation">
<h1>String concatenation</h1>
<p>Which of these is faster:</p>
<pre class="literal-block">
&gt;&gt;&gt; ''.join(['some', 'string'])
&gt;&gt;&gt; 'some' + 'string'
</pre>
<p>It turns out that the first one, that most of us use because it is apparently
faster, is actually slower! So just use <tt class="docutils literal">+</tt>.</p>
<p>Where does that join come from then? Here. This is slow:</p>
<pre class="literal-block">
&gt;&gt;&gt; result = ''
&gt;&gt;&gt; for text in make_lots_of_tests():
...     result += text
</pre>
<p>And this is fast:</p>
<pre class="literal-block">
&gt;&gt;&gt; result = ''.join(make_lots_of_tests())
</pre>
<p>The reason is that in the first example, the <tt class="docutils literal">result</tt> text is copied in
memory over and over again.</p>
<p>So: use <tt class="docutils literal">.join()</tt> only for joining lists. This also means that you
effectively do what looks good. Nobody will concatenate lots of separate
strings over several lines in their source code. You'd just use a list
there. For just a few strings, just concatenate them.</p>
<p>That's the nice thing of Python: if you do what looks good, you're mostly ok.</p>
</div>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>Dynamic models in Django - Juergen Schackmann</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/dynamic-models.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/dynamic-models.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-17T13:53:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>The classical approach in django is:</p>
<dl class="docutils">
<dt>Code development</dt>
<dd>You create models.</dd>
<dt>Deployment</dt>
<dd>Tables and columns are created with syncdb.</dd>
<dt>Runtime</dt>
<dd>Models and db tables are populated.</dd>
</dl>
<p>This means that models are pretty much static. There is no way to modify them
at runtime based on user interactions. You can get something working with for
instance hstore in postgresql (see <a class="reference external" href="http://reinout.vanrees.org/weblog/2013/05/15/advanced-postgres.html">the postgresql talk</a>).</p>
<p>His usecase is for medical forms. The contents of those forms should be able
to be defined inside the system. There are strict processes for installing
medical software, so you cannot just release a new version with a new
field. So you must get it to work at runtime.</p>
<p>The solution could be to use <strong>dynamic models</strong>, models created at
runtime. Sometimes configuration by subject matter experts is better than code
customization by developers. Also, dynamic models reduce the number of
deployment cycles.</p>
<p>He has some criteria:</p>
<ul class="simple">
<li>Performance.</li>
<li>Querability, which means the standard django query stuff should work.</li>
<li>Django standard tool integration (admin, cache, and so).</li>
<li>Supported DB backends. If possible, support all django DB backends.</li>
<li>Complexity/maintainability.</li>
</ul>
<p>There are a couple of possible solutions:</p>
<dl class="docutils">
<dt>Entity attribute value (EAV)</dt>
<dd>Colums are stored in separate table rows. Instead of a table having
attributes, a table has an attribute table with values. There are at least
two apps that provide this. The performance is a problem here.</dd>
<dt>Serialized dictionary</dt>
<dd>For instance one of the Django JsonField apps. A lot of what is normally
database work is now moved to the application. You'll really have to create
custom logic in your app to take care of it.</dd>
<dt>Runtime schema updates</dt>
<dd>Update models at runtime with syncdb of some South functionality or
Andrew's new <a class="reference external" href="http://reinout.vanrees.org/weblog/2013/05/15/migrating-future.html">schema migrations for Django work</a>. There
are a couple of apps that do this. He also created his own one. The best
one seems to be <a class="reference external" href="https://github.com/charettes/django-mutant">django-mutant</a>.</dd>
<dt>Database-specific solutions</dt>
<dd>Hstore, django-nonrel. Drawback: it doesn't work with all database
backends, of course.</dd>
</dl>
<p>In the end, the <em>runtime schema updates</em> approach looks like the best one.</p>
<p>For more reading: <a class="reference external" href="https://code.djangoproject.com/wiki/DynamicModels">https://code.djangoproject.com/wiki/DynamicModels</a></p>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>Does your stuff scale? - Steven Holmes</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/scale.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/scale.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-17T12:54:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>They grew from a two-person company to a 70-person one in two years. Central
to that growth were Django and google app engine.</p>
<p>Scalability means both load scalability and functional scalability. You also
have to deal with organizational scalability and geographical scalability if
you want to grow your organization.</p>
<div class="section" id="running-django-on-app-engine">
<h1>1: Running Django on app engine</h1>
<p>It is easy to get confused. Is app engine real? Is it a joke? How to run your
django stuff on it?</p>
<p>Their reasons to use it:</p>
<ul class="simple">
<li>Auto-scaling. They build high-profile stuff and it <em>needs</em> to scale. They
had a valentine day site that got a lot of attention on that day and it
automatically scaled up without a change in the app. The day after it scaled
down automatically, too.</li>
<li>Services and APIs.</li>
<li>No sysadmin needed.</li>
</ul>
<p>Some caveats with app engine: it is a sandbox. You you cannot do &quot;pip
install&quot;. The filesystem isn't there in the traditional sense; there is a blob
storage instead. And it is lock-in, mostly; portability is an issue.</p>
<p>They could work arounds these issues and ended up with a better application as
a result.</p>
<p>There are three ways (that they use) of running Django on app engine:</p>
<ul>
<li><p class="first">Django non-rel. A ported version of Django, modified for NoSQL. Github, open
source. It has a familiar API to Django, so you'll feel at home. It works in
production.</p>
<p>A drawback is that the familiarity can be misleading. So you might do things
that won't work like M2M relations. And it can feel heavy. Because of the
fork/port, it might feel hacky.</p>
</li>
<li><p class="first">Djappengine. A lightweight skeleton around app engine. You don't use
django's models. It aims to be the best of both worlds. It also supports
NDB, which is app engine's new fast data storage layer.</p>
<p>Drawback: you need to learn a new database API, so you have a higher
learning curve.</p>
</li>
<li><p class="first">Django appengine + cloudSQL. You get a fully supported django.</p>
<p>Drawback: there's more setup and it is probably not as scalable as a
datastore.</p>
</li>
</ul>
<p>Now to scalability. App engine will already do a lot for you. Some things you
yourself must do:</p>
<ul class="simple">
<li>Plan.</li>
<li>Cache the hell out of it.</li>
<li>Offline tasks out of the request loop.</li>
<li>Prepare load tests and do profiling.</li>
</ul>
<p>Functional scaling provided by app engine (apart from what django provides):</p>
<ul class="simple">
<li>Memcache</li>
<li>Taskqueue</li>
<li>Mapreduce</li>
<li>Search</li>
<li>Email</li>
<li>Images</li>
</ul>
<p>And you get up to 10 testable versions per app. <tt class="docutils literal"><span class="pre">http://0.yourapp</span></tt>,
<tt class="docutils literal"><span class="pre">http://1.yourapp</span></tt> (the previous version) and so on. You can do A/B testing and
traffic splitting. It blew his mind when he first discovered it.</p>
</div>
<div class="section" id="scaling-an-organization-culture">
<h1>2: Scaling an organization + culture</h1>
<p>Part of it is organizational culture:</p>
<ul>
<li><p class="first">Be a minimalist.</p>
</li>
<li><p class="first">Removed bottlenecks and overhead. Don't get in the way.</p>
</li>
<li><p class="first">Just make good things. You can try (new) things out. You have freedom.</p>
</li>
<li><p class="first">Internal apps. From a pool score app to steering deployments. They also have
a big wiki with lots of info in it. It works well for them.</p>
<p>They also build a small Django app to handle all the incoming emailed job
applications. One small app build in an afternoon on a beach in Thailand now
helps them to hire better people more quickly :-)</p>
</li>
</ul>
<p>You can work from everywhere. Plane, pub, train, at home, in an office, at a
beach, whatever. The minimalism helps in scaling.</p>
<p>Important question: <strong>what if google shuts it down?</strong> Answer: for them, the
advantages outweigh the risks. (Note: <em>ouch, this shows what closing Reader
did for google's perceived reliability... Everyone in the room was applauding
the question...</em>)</p>
</div>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>The path to continuous deployment - Òscar Vilaplana</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/continuous-deployment.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/continuous-deployment.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-17T12:17:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>If you've got continuous deployment, you've got stable servers. You make big
changes in small increments.</p>
<p>Continuous deployment forces you to do many good things:</p>
<ul class="simple">
<li>Good tests.</li>
<li>Repeatable build.</li>
<li>Well-configured identical machines.</li>
<li>Automated deployment.</li>
<li>Migrations and rollbacks</li>
<li>Etc.</li>
</ul>
<p>Lots of good things. But let's compare it with lion taming.</p>
<p>Originally, lions were beaten into submission, confused and kept in line with
whips. Likewise you'll be beaten if you dare to touch the production machine
as it might break.</p>
<p>Now lions are understood better. Conditioning, behavior/signal mapping, reward
and trust are the methods now. We understand that deployment is hard. We have
behaviour/signal mapping with code/test/green/deploy. Etc.</p>
<ul>
<li><p class="first">Continuous deployment: everyone is responsible. Everyone deploys. You
automatically learn. Everybody uses the same environment locally for test
deployments. The same as on the server.</p>
</li>
<li><p class="first">Testing is core. Slow tests are killing. Fast tests. And all types of tests:
unit, functional and acceptance tests. Also automatic code checkers. The light
must stay green. Quality must stay high, also test quality.</p>
</li>
<li><p class="first">You need a repeatable build. And it should include not just code, but also
configuration and infrastructure. And... always follow the pipeline.</p>
<p>Even in emergencies, follow the pipeline. Peer review, tests, and then the
deployment. Don't do manual steps.</p>
</li>
<li><p class="first">Rollback. You must be able to switch back to the previous version.</p>
<p>You can take a canary approach. Canary in the coalmine. Show the new version
to a few users. &quot;User testing&quot; in a sense.</p>
<p>Rollbacks in databases; keep it backwards compatible. Never drop columns,
for instance. (After a long time, you can remove them safely, of course).</p>
</li>
<li><p class="first">Small changes. Frequent releases mean less risk: if something breaks, you
know where to search.</p>
</li>
</ul>
<p>Some tips:</p>
<ul>
<li><p class="first">Split your stuff in components. A component is something that has a good API
and that can be switched out for a different component. It can also be
separately deployed.</p>
<p>This helps with testing, too.</p>
</li>
<li><p class="first">Rehearse releases. Get very good at them!</p>
</li>
<li><p class="first">You need good infrastructure. You must manage it and test it good.</p>
</li>
<li><p class="first">Keep all environments equal. Use vagrant.</p>
</li>
<li><p class="first">Automate everything! And if it is not possible: document it. But know that
that's something that's not quite correct yet!</p>
</li>
</ul>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>Principle philosophy - Swift</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/priniciple-philosophy.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/priniciple-philosophy.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-17T10:23:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      
      <category term="python" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>Principle philosophy: a way to discuss our rules and beliefs that govern our
actions. He tells it from his personal experience.</p>
<p>His parents wanted to raise him as a good person. So they thought him good
principles (like don't be a quitter, don't steal, etc). This is quite
black/white though. We are all more gray/gray.</p>
<p>What about the question &quot;how can I be a good programmer&quot;? Programmers use
logic, which sounds black/white again: write tests, don't repeat
yourself. Sigh.</p>
<p>Talking about things like this is impossible without <a class="reference external" href="https://en.wikipedia.org/wiki/Immanuel_Kant">Immanuel Kant</a>. He differentiates between
reason and instinct. If &quot;be happy&quot; were our life goal, we'd just follow our
instincts. So what is reason for, then, apart for doing good? Reason has to do
with moral. There are three ways of looking at &quot;doing good&quot;:</p>
<ul class="simple">
<li>Duty. Good things can come from duty. Duty can also lead to non-good things,
though. Hm, so this is not it.</li>
<li>Make a difference between the goal and the outcome. The outcome might be bad
even though the goal could be worthy.</li>
<li>Universal lawfullness. Only do something if you know that everybody thinks
it is a good idea.</li>
</ul>
<p>Does this help with a question like &quot;is testing good&quot;?</p>
<p>Gandhi said that a man is the sum of his actions.</p>
<p>In a sense we are the sum of our experiences. So increase the amount of
experience that you have. Either have the experiences yourself, or share them
<strong>like on this conference</strong>. Everything looks different from the trenches:
learn from eachother.</p>
<p>Some lessons he learned from a <em>little baseball league</em> experience (where he
sucked) as a kid:</p>
<ul class="simple">
<li>Swing for the fences. Aim for a home run. It allows you take great risks
(because you have great goals). It motivates you.</li>
<li>Set reasonable goals, too. Incremental intermediate goals. Those
intermediate goals help you progress.</li>
<li>You suck... and that's totally OK. You're not good at everything. It gives
you a different perspective. And you <em>can</em> still give it your best. Also to
that almost-unused old project that you get a bug report for.</li>
</ul>
<p><strong>Some take-aways</strong>:</p>
<ul class="simple">
<li>Build a strong foundation of principles.</li>
<li>One size doesn't fit all</li>
<li>Learn from your experiences and share them.</li>
<li>Build a great network.</li>
<li>Ask all the right questions.</li>
</ul>
</div>

        ]]>
      </content>

    </entry>
    
  <entry>
    <title>The advantages of diversity - Steve Holden</title>
    <link rel="alternate" type="text/html"
          href="http://reinout.vanrees.org/weblog/2013/05/17/advantages-of-diversity.html" />
      <id>http://reinout.vanrees.org/weblog/2013/05/17/advantages-of-diversity.html</id>
      <author>
        <name>Reinout van Rees</name>
      </author>
      <published>2013-05-17T00:00:00+01:00</published>
      <updated>2013-05-17T10:14:00+01:00</updated>

      
      <category term="django" />
      
      <category term="djangocon" />
      

      <content type="html"><![CDATA[
        <div class="document">
<p>Open source is great. It is absolutely amazing.</p>
<p>We live in a multi-dimensional world, though it is often presented
otherwise.</p>
<p>Some present a simple line-based worldview. Bad-Good for instance. Where do
you want to be on the line? Republican-democrat? Ruby-Python?
Foreigner-native? Once you think along those lines (...) you tend to start
thinking in opposites.</p>
<p>This is the basis for many invalid world views. Just draw a line, cluster
according to your preference and you're ready. Linear concepts are not
useful. The issue is polariation.  In a one-dimensional world, there is no
room for complexity.</p>
<p>What about a Venn-diagram based worldview? It allows for a bit more subtlety,
but there's still a line on the outside...</p>
<p>The open source world has a lot to teach the rest of the world. It is focused,
mostly, on outcomes and results. But it is not representative. It is not even
representative of the tech industry generally. In tech, 20% are women, in open
source it is more like 2%, for instance.</p>
<p>And... we need diversity! The biggest resource in open source is people. So
you'd rather not exclude many people. The most common diversity areas, to give
you an idea:</p>
<ul class="simple">
<li>Ethnicity</li>
<li>Religion</li>
<li>Gender</li>
<li>Culture</li>
<li>Socio-economic background</li>
</ul>
<p>Diversity is desirable because each individual is limited. We are all good at
some things and bad at others. A group can solve a bigger range of problems
And you don't want the group to be too homogeneous.</p>
<p>Typical open source projects will tend to focus on the actual programming and
it'll ignore technical writers, designers, training, etc. Django stands out
with its documentation. But Python's documentation isn't that good. There's no
real emphasis on it in the current Python team. <strong>If we don't broaden our
community with different skill sets and roles</strong>, we'll fall
behind. Python is poised to be the #1 language of choice, but we need to
improve some things before that can happen.</p>
<p>We ought to involve the community more as open source projects. We should run
our projects more professionally. Be more open to involve all of the community
more.</p>
<p>We should not accept it anymore to have to read through half-finished
documentation and having to fall back to reading source code. &quot;But that takes
time to rectify&quot;. Well, yes. So <strong>involve more people</strong>. Get more people with
more diverse skill sets to help. Perhaps you can then focus on what you're
good at.</p>
<p>It is up to us all. The python world <em>does</em> have an awesome community. But we
might just be a bit too smug about how wonderful we are. We should not get
complacent and we should keep aiming at increasing our diversity.</p>
</div>

        ]]>
      </content>

    </entry>
    

</feed>
