<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>pydanny</title><link href="http://pydanny.com" rel="alternate"></link><link href="http://pydanny.com/feeds/all.atom.xml" rel="self"></link><id>http://pydanny.com</id><updated>2012-05-14T19:30:00Z</updated><entry><title>10 reasons to go to DjangoCon Europe</title><link href="http://pydanny.com/10-reasons-to-go-to-djangocon-europe.html" rel="alternate"></link><updated>2012-05-14T19:30:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/10-reasons-to-go-to-djangocon-europe.html</id><summary type="html">&lt;p&gt;You should go to &lt;a class="reference external" href="http://djangocon.eu"&gt;DjangoCon Europe&lt;/a&gt; in lovely &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Zurich"&gt;Zurich&lt;/a&gt;, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Switzerland"&gt;Switzerland&lt;/a&gt;. Here are 10 reasons why:&lt;/p&gt;
&lt;div class="section" id="chocolate"&gt;
&lt;h2&gt;1. &lt;strong&gt;Chocolate&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;So much of what we like about chocolate comes from Switzerland. For example, Milk Chocolate was invented in Switzerland.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="keynote-speaker-jacob-kaplan-moss"&gt;
&lt;h2&gt;2. &lt;strong&gt;Keynote speaker: Jacob Kaplan-Moss&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Always a great speaker and fun to be around, he's one of the BDFL's of &lt;a class="reference external" href="http://djangoproject.com"&gt;Django&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cheese"&gt;
&lt;h2&gt;3. &lt;strong&gt;Cheese&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;I grew up thinking that Swiss Cheese was just about holes. It's so much more. I can't wait to try fresh European cheese made by master craftsmen from the freshest ingredients.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="keynote-speaker-jessica-mckellar"&gt;
&lt;h2&gt;4. &lt;strong&gt;Keynote speaker: Jessica McKellar&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In a word, Jessica is &lt;strong&gt;incredible&lt;/strong&gt;. She's a Twisted core developer, PSF board member, part of the trio responsible for the gigantic Boston Python User Group's massive size explosion, and a talented speaker. She's used her incredible talents and skills to increase diversity in the community and generally help other people.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="breakfast"&gt;
&lt;h2&gt;5. &lt;strong&gt;Breakfast&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Muesli was invented in Switzerland. I love Muesli. I was floored by how much better it was in New Zealand. I can't wait to try it in it's homeland.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="web-site"&gt;
&lt;h2&gt;6. &lt;strong&gt;Web Site&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;The DjangoCon Europe site is crazy. I mean, look at all those animations!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="talks"&gt;
&lt;h2&gt;7. &lt;strong&gt;Talks&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;This is a single track event with proven speakers like Zachary Voase and Andrew Godwin, yet balances that with bringing in new blood to spice things up. And dare I say &lt;a class="reference external" href="http://2012.djangocon.eu/schedule/round-pegs-and-square-holes/"&gt;I'm giving a technical talk&lt;/a&gt; with &lt;a class="reference external" href="http://audreymroy.com/"&gt;Audrey Roy&lt;/a&gt;? ;-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mountains"&gt;
&lt;h2&gt;8. &lt;strong&gt;Mountains&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;With all the incredible food, you would think you would gain umpteen kilograms. Fortunately there are mountains all around to climb and hike.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sprints"&gt;
&lt;h2&gt;9. &lt;strong&gt;Sprints&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Want to sprint on Django itself? Look no further because there will be Django core developers around! There will also be notable &lt;a class="reference external" href="http://python.org"&gt;Python&lt;/a&gt; developers like &lt;a class="reference external" href="http://kennethreitz.com/"&gt;Kenneth Reitz&lt;/a&gt; and others around working hard on a lot of different projects. It's going to intense and fun!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="castles"&gt;
&lt;h2&gt;10. &lt;strong&gt;Castles&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Living in the USA, we just don't have anything like castles. DjangoCon Europe will be near a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/List_of_castles_and_fortresses_in_Switzerland#Zurich"&gt;small horde of stone fortifications&lt;/a&gt;. Which means if the Zombie Apocalypse happens during the conference, we'll have many secure places to go. They also make lovely tourist destinations. :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-are-you-waiting-for"&gt;
&lt;h2&gt;What are you waiting for?&lt;/h2&gt;
&lt;p&gt;DjangoCon Europe has a cap on attendance. Tickets for Python events have been selling out, not just for PyCon US. Don't miss out!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="it-s-all-about-me"&gt;
&lt;h2&gt;It's all about me&lt;/h2&gt;
&lt;p&gt;Yup.&lt;/p&gt;
&lt;p&gt;Call me selfish but I want you there because I haven't haven't met all our European friends yet in person. Hope to see you next month in Zurich!&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="europe"></category><category term="djangocon"></category></entry><entry><title>CSS Hacking to make my code samples legible</title><link href="http://pydanny.com/css-hacking-to-make-my-code-samples-legible.html" rel="alternate"></link><updated>2012-05-11T08:30:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/css-hacking-to-make-my-code-samples-legible.html</id><summary type="html">&lt;p&gt;I've been very happy with &lt;a class="reference external" href="http://pelican.readthedocs.org/"&gt;Pelican&lt;/a&gt; as a blog engine so far, and haven't even moved off the sample theme. There's just been one problem: Myself and others have had a lot of trouble reading the code snippets.&lt;/p&gt;
&lt;p&gt;I didn't have time to cook up a full Pelican theme, so instead I just hacked the local CSS files. The problem with this hack is that every time I regenerate the blog I have to copy the right CSS files into place. So next week when I have time I'll do a proper Pelican theme.&lt;/p&gt;
&lt;p&gt;In the meantime, enjoy!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;shuffle&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Meal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;food_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Beef&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Fish&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Vegetarian&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Chicken&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;food_type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="css"></category><category term="usability"></category></entry><entry><title>Choosing an API framework for Django</title><link href="http://pydanny.com/choosing-an-api-framework-for-django.html" rel="alternate"></link><updated>2012-05-10T08:00:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/choosing-an-api-framework-for-django.html</id><summary type="html">&lt;p&gt;First off, out of the box, &lt;a class="reference external" href="http://djangoproject.com"&gt;Django&lt;/a&gt; lets you construct API responses with a little work. All you need to do is something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Copied from https://docs.djangoproject.com/en/1.4/topics/class-based-views/#more-than-just-html&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simplejson&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JSONResponseMixin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render_to_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="s"&gt;&amp;quot;Returns a JSON response containing &amp;#39;context&amp;#39; as payload&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_json_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;convert_context_to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_json_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;httpresponse_kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="s"&gt;&amp;quot;Construct an `HttpResponse` object.&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                 &lt;span class="n"&gt;content_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                 &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;httpresponse_kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_context_to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="s"&gt;&amp;quot;Convert the context dictionary into a JSON object&amp;quot;&lt;/span&gt;
        &lt;span class="c"&gt;# Note: This is *EXTREMELY* naive; in reality, you&amp;#39;ll need&lt;/span&gt;
        &lt;span class="c"&gt;# to do much more complex handling to ensure that arbitrary&lt;/span&gt;
        &lt;span class="c"&gt;# objects -- such as Django model instances or querysets&lt;/span&gt;
        &lt;span class="c"&gt;# -- can be serialized as JSON.&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once you get that &lt;cite&gt;mixin&lt;/cite&gt;, use it in your views like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# modified from djangoproject.com sample code&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simplejson&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JSONDetailView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JSONResponseMixin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MyCustomUserView&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_context_to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;objects&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;first_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;last_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;is_active&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This works pretty well in a number of simple cases, but doing things like pagination, posting of data, metadata, API discovery, and other important things ends up being a bit more work. This is where the resource oriented API frameworks come in.&lt;/p&gt;
&lt;div class="section" id="what-makes-a-decent-api-framework"&gt;
&lt;h2&gt;What makes a decent API Framework?&lt;/h2&gt;
&lt;p&gt;These features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pagination&lt;/li&gt;
&lt;li&gt;posting of data with validation&lt;/li&gt;
&lt;li&gt;Publishing of metadata along with querysets&lt;/li&gt;
&lt;li&gt;API discovery&lt;/li&gt;
&lt;li&gt;proper HTTP response handling&lt;/li&gt;
&lt;li&gt;caching&lt;/li&gt;
&lt;li&gt;serialization&lt;/li&gt;
&lt;li&gt;throttling&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Proper API frameworks also need:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Really good test coverage of their code&lt;/li&gt;
&lt;li&gt;Decent performance&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;An active community to advance and support the framework&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you take these factors, at this time there are only two API frameworks worth using, &lt;a class="reference external" href="http://django-tastypie.readthedocs.org/"&gt;django-tastypie&lt;/a&gt; and &lt;a class="reference external" href="http://django-rest-framework.org/"&gt;django-rest-framework&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="which-one-is-better-django-tastypie-or-django-rest-framework"&gt;
&lt;h2&gt;Which one is better? django-tastypie or django-rest-framework?&lt;/h2&gt;
&lt;p&gt;I say they are equal.&lt;/p&gt;
&lt;p&gt;You simply can't go wrong with either one. The authors and communities behind both of them are active, the code is solid and tested. And here are my specific thoughts about both of them:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;django-tastypie&lt;/h2&gt;
&lt;p&gt;Using django-tastypie is like playing with pure Python while using the Django ORM. I find it very comfortable. Seems really fast too. The documentation is incredible, and I rarely have any problems figuring anything out. It also supports OAuth 1.0a out of the box, which is mighty awesome these days.&lt;/p&gt;
&lt;p&gt;In fact, I wrote a custom OAuth2 handler for django-tastypie for &lt;a class="reference external" href="http://consumer.io"&gt;consumer.io&lt;/a&gt; that I'm working to extract for publication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;django-rest-framework&lt;/h2&gt;
&lt;p&gt;As it's based off Django 1.3 style Class Based Views (CBVs), it has a very familiar pattern. Actually, because of the quality of the documentation, I really prefer using django-rest-framework CBVs more than using Django's actual CBVs.&lt;/p&gt;
&lt;p&gt;Maybe I should make an HTML renderer for django-rest-framework? :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="but-what-about-django-piston"&gt;
&lt;h2&gt;But what about django-piston?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Don't use django-piston&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I don't want to say anything negative, but let's face it: &lt;strong&gt;django-piston is dead&lt;/strong&gt;. Besides a critical security release last year, nothing has been done for it in about 3 years. The documentation is weak, the code mostly untested, and the original author left. He has gone on to do some amazing things. Django-piston was amazing in its time, but its time has passed and so should you.&lt;/p&gt;
&lt;p&gt;The only reason for using django-piston for years has been that it supported OAuth, but django-tastypie now addresses that use case. I've used django-tastypie's basic OAuth class and rolled custom Authentication modules to support some extra OAuth flavors and found it wonderful.&lt;/p&gt;
&lt;p&gt;Use django-tastypie or django-rest-framework instead. You'll be much, much happier for it.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;a class="reference external" href="http://news.ycombinator.com/item?id=3954314"&gt;Discuss this on Hacker News&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="api"></category><category term="review"></category></entry><entry><title>Django Requirements for a project</title><link href="http://pydanny.com/django-requirements-for-a-project.html" rel="alternate"></link><updated>2012-05-09T08:00:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/django-requirements-for-a-project.html</id><summary type="html">&lt;p&gt;Today I'm starting a new project. I'm working as fast as I can and hope to launch on Friday. What are my package dependencies?&lt;/p&gt;
&lt;div class="section" id="django-1-4"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/Django/1.4"&gt;Django==1.4&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Unlike my last quick project which was &lt;a class="reference external" href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt;, this effort really falls into &lt;a class="reference external" href="http://djangoproject.com"&gt;Django&lt;/a&gt;'s sweet spot. I need sessions, forms, templates, and models to do things in an ideal Django pattern.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="psycopg2-2-4-5"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/psycopg2"&gt;psycopg2==2.4.5&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I need transactions and hard-type validation in the database, which means PostgreSQL. If I didn't need transactions or the hard-type validation I would consider MongoDB instead.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-debug-toolbar-0-9-4"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/django-debug-toolbar"&gt;django-debug-toolbar==0.9.4&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because not using this tool is insane.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-extensions-0-8"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/django-extensions"&gt;django-extensions==0.8&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because amongst other things this library gives you, I never want to write my own &lt;tt class="docutils literal"&gt;TimeStampedModel&lt;/tt&gt; ever again. :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="south-0-7-5"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/South"&gt;South==0.7.5&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Django gives you the freedom to migrate data in the way you want. The way I want to do it is via South.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-registration-0-8-0"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/django-registration"&gt;django-registration==0.8.0&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Normally &lt;a class="reference external" href="http://pypi.python.org/pypi/django-social-auth"&gt;django-social-auth&lt;/a&gt; is my go-to tool for registration, but in this case I need simple username/password registration. This is a very solid tool, but you do have to make your own templates or find someone's fork that has a copy of templates that match.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-floppyforms-0-4-7"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/django-floppyforms"&gt;django-floppyforms==0.4.7&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An excellent tool for making your forms HTML5-ish out of the box.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-crispy-forms-1-1-3"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/django-crispy-forms"&gt;django-crispy-forms==1.1.3&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The child of my own django-uni-forms, this will let me create forms using div-based controls super fast, and do layout customizations if I need them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-heroku-postgresify-0-2"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/django-heroku-postgresify"&gt;django-heroku-postgresify==0.2&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This tool makes getting the PostGreSQL settings out of Heroku trivial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-heroku-memcacheify-0-1"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/django-heroku-memcacheify"&gt;django-heroku-memcacheify==0.1&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This tool makes getting the memcache settings for Heroku trivial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="gunicorn-0-14-2"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/gunicorn"&gt;gunicorn==0.14.2&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All the cool kids who play in devops swear by Gunicorn. I use it because Heroku seems to recommend it for Django deployments.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="installing-the-above-packages"&gt;
&lt;h2&gt;Installing the above packages&lt;/h2&gt;
&lt;p&gt;Never copy/paste these libraries directly into your projects. If you do that, you'll end up hating yourself later as your local instances become unmaintained forks of the real project. Also, unless you are really careful in your copy/pasting, you'll be in violation of various open source licenses. Odds are the FOSS police aren't going to find you, but I can assure you that when you bring in one of the authors of these packages to help you fix a problem he/she is going to be mighty annoyed at the lack of attribution.&lt;/p&gt;
&lt;p&gt;Do it the right way: do proper Python dependency management.&lt;/p&gt;
&lt;p&gt;Create a &lt;tt class="docutils literal"&gt;requirements.txt&lt;/tt&gt; file and install them as proper dependencies. The file should contain the following text:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Django==1.4
South==0.7.5
django-crispy-forms==1.1.3
django-debug-toolbar==0.9.4
django-extensions==0.8
django-floppyforms==0.4.7
django-registration==0.8.0
django-heroku-memcacheify==0.1
django-heroku-postgresify==0.2
django-registration==0.8.0
gunicorn==0.14.2
psycopg2==2.4.5
&lt;/pre&gt;
&lt;p&gt;Once you have that, you install them thus in your &lt;a class="reference external" href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pip install -r requirements.txt
&lt;/pre&gt;
&lt;p&gt;Now that I have all this, it's time to code!&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/pydanny/4358842735/"&gt;&lt;img alt="http://farm5.staticflickr.com/4027/4358842735_38991c0944.jpg" class="align-center" id="blizzard-of-2010" src="http://farm5.staticflickr.com/4027/4358842735_38991c0944.jpg" /&gt;&lt;/a&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category></entry><entry><title>Los Angeles Open Source Sprint on May 12th!</title><link href="http://pydanny.com/los-angeles-open-source-sprint-on-may-12th.html" rel="alternate"></link><updated>2012-05-01T09:20:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/los-angeles-open-source-sprint-on-may-12th.html</id><summary type="html">&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/pydanny/7132778527/"&gt;&lt;img alt="http://farm9.staticflickr.com/8022/7132778527_6e3b49b313_o.png" class="align-center" id="la-open-source-sprint-hosted-on-flickr" src="http://farm9.staticflickr.com/8022/7132778527_6e3b49b313_o.png" /&gt;&lt;/a&gt;
&lt;p&gt;This is a day long coding event in Los Angeles for Open Source developers of all languages and skill levels to come and code like fiends. They'll be joined by dozens of either really smart coders or nice people like me. Sponsors are providing food, drinks, venue, and more!&lt;/p&gt;
&lt;p&gt;RSVP at &lt;a class="reference external" href="http://www.meetup.com/LA-Hackathons/events/62796642/"&gt;http://www.meetup.com/LA-Hackathons/events/62796642/&lt;/a&gt; before it fills up! It's free.&lt;/p&gt;
&lt;p&gt;I'll be there to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Organize the event with the assistance of the awesome Los Angeles technical community!&lt;/li&gt;
&lt;li&gt;Code like a fiend. I want to work on django-mongonaut and could use some GraphViz and JavaScript help.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now to open the floor to questions...&lt;/p&gt;
&lt;div class="section" id="where-and-when"&gt;
&lt;h2&gt;Where and when?&lt;/h2&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Spire.io
7257 Beverly Blvd #210
Los Angeles, CA 90036
&lt;/pre&gt;
&lt;p&gt;When:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
May 12, 2012
10 AM to 10 PM
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="is-this-like-a-hackathon"&gt;
&lt;h2&gt;Is this like a Hackathon?&lt;/h2&gt;
&lt;p&gt;Yup. See &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Hackathon#Sprints"&gt;http://en.wikipedia.org/wiki/Hackathon#Sprints&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="will-there-be-wifi"&gt;
&lt;h2&gt;Will there be Wifi?&lt;/h2&gt;
&lt;p&gt;Yes!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="i-m-just-starting-as-a-developer-should-i-come"&gt;
&lt;h2&gt;I'm just starting as a developer, should I come?&lt;/h2&gt;
&lt;p&gt;It depends.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you've never coded before&lt;/strong&gt;, this isn't the right place. Instead, you might consider one of the local coding workshops or classes. In fact, here's a good &lt;a class="reference external" href="http://www.meetup.com/Los-Angeles-Hack-Night/"&gt;bi-weekly hack night / study group&lt;/a&gt; for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you've done a tutorial or two&lt;/strong&gt;, sprints can be a great way to learn new skills or hone your technique by sitting alongside experienced developers who actually need your help. A lot of projects have what are called 'low hanging fruit', which are 'simpler' tasks saved for beginner developers to wet their teeth on. Things I've learned at events like these include Git, Mercurial, JQuery, and a hundred other things that have made me a better coder.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-if-i-don-t-have-a-project-of-my-own-to-bring-should-i-come"&gt;
&lt;h2&gt;What if I don't have a project of my own to bring? Should I come?&lt;/h2&gt;
&lt;p&gt;Heck yeah! There will be a number of projects around that you can join and contribute to in order to make the world a better place. There isn't a list up yet, but I'm hoping by Saturday there will be one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-if-i-want-to-come-and-recruit-people"&gt;
&lt;h2&gt;What if I want to come and recruit people?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Absolutely not&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is not a job fair and we don't want unnecessary distractions.&lt;/p&gt;
&lt;p&gt;On the other hand, if you want to help sponsor we'll happily mention you on the &lt;a class="reference external" href="http://www.meetup.com/LA-Hackathons/events/62796642/"&gt;meetup.com&lt;/a&gt; description.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="are-there-going-to-be-any-presentations-or-lightning-talks"&gt;
&lt;h2&gt;Are there going to be any presentations or lightning talks?&lt;/h2&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;This is a sprint, not a conference or demonstration. We'll try and limit announcements and interruptions as much as possible, the only exception being for letting you know food has arrived.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-should-i-bring"&gt;
&lt;h2&gt;What should I bring?&lt;/h2&gt;
&lt;p&gt;Your own functioning laptop with power cord. Neither event organizers, the venue, or sponsors are providing equipment. We also encourage you to bring a power strip labeled with your name.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="i-m-sold-how-much-does-it-cost-and-where-do-i-register"&gt;
&lt;h2&gt;I'm sold! How much does it cost and where do I register?&lt;/h2&gt;
&lt;p&gt;The event costs you nothing and you RSVP at &lt;a class="reference external" href="http://www.meetup.com/LA-Hackathons/events/62796642/"&gt;http://www.meetup.com/LA-Hackathons/events/62796642/&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="LA"></category><category term="sprint"></category><category term="hackathon"></category></entry><entry><title>Join us at DjangoCon Europe!</title><link href="http://pydanny.com/join-us-at-djangocon-europe.html" rel="alternate"></link><updated>2012-04-10T12:00:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/join-us-at-djangocon-europe.html</id><summary type="html">&lt;p&gt;This year in June, the European edition of &lt;a class="reference external" href="http://djangocon.eu"&gt;DjangoCon&lt;/a&gt; is going to be held in lovely &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Zurich"&gt;Zurich&lt;/a&gt;, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Switzerland"&gt;Switzerland&lt;/a&gt;. It is my great fortune and delight to announce that &lt;a class="reference external" href="http://audreymroy.com"&gt;Audrey&lt;/a&gt; and I will be attending. Hooray!&lt;/p&gt;
&lt;p&gt;Needless to say, we're extremely excited. My &lt;a class="reference external" href="http://dannygreenfeld.blogspot.com/search/label/ploneconf2007"&gt;trip to Europe in 2007&lt;/a&gt; was an amazingly fun and educational experience, and I can't wait to share a similar experience with Audrey. We can't wait to see all our old European friends, make new ones, and be dazzled by what Europe has to offer.&lt;/p&gt;
&lt;p&gt;Also, let's face it, the conference is going to be &lt;strong&gt;incredible&lt;/strong&gt;. They've lined up some awesome venues, the food (&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Raclette"&gt;cheese&lt;/a&gt;, chocolate, &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Muesli"&gt;muesli&lt;/a&gt;, etc) in Switzerland is world-renowned, the website looks fantastic, and they've got Jacob Kaplan-Moss to keynote. It looks so good I'm surprised there are any &lt;a class="reference external" href="http://2012.djangocon.eu/sponsors/"&gt;sponsor slots left&lt;/a&gt;!&lt;/p&gt;
&lt;div class="section" id="talks"&gt;
&lt;h2&gt;Talks&lt;/h2&gt;
&lt;p&gt;While attending the conference, we submitted and hope to give a presentation on the positives (speed, flexibility, community, etc) and negatives (a few) of using &lt;a class="reference external" href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; as a &lt;a class="reference external" href="http://djangoproject.com"&gt;Django&lt;/a&gt; datastore. I'm also considering giving a second talk. Some ideas for that include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Zen of Django&lt;/li&gt;
&lt;li&gt;Django isn't for beginners (A Tredennick inspired talk explaining why teaching beginning developers Django isn't a good idea)&lt;/li&gt;
&lt;li&gt;Advanced Django Template Usage&lt;/li&gt;
&lt;li&gt;Advanced Django Models Usage (An intimidating talk to put together)&lt;/li&gt;
&lt;li&gt;Django Packages Thunderdome II&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any thoughts?&lt;/p&gt;
&lt;p&gt;While I'm at it, I'm going to poke any prospective conference goers to submit their own talks. I love attending conference talks and at PyCon US this year I barely got to see any. Show me what you got!&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/pydanny/1614703646/"&gt;&lt;img alt="http://farm3.staticflickr.com/2339/1614703646_2e2610162a.jpg" class="align-center" id="my-last-day-in-italy-back-in-2007-when-i-still-had-hair" src="http://farm3.staticflickr.com/2339/1614703646_2e2610162a.jpg" /&gt;&lt;/a&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="djangocon"></category><category term="mongodb"></category></entry><entry><title>Choosing a new python based blog engine</title><link href="http://pydanny.com/choosing-a-new-python-based-blog-engine.html" rel="alternate"></link><updated>2012-04-05T12:00:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/choosing-a-new-python-based-blog-engine.html</id><summary type="html">&lt;div class="section" id="why-a-new-blog-engine"&gt;
&lt;h2&gt;Why a new blog engine?&lt;/h2&gt;
&lt;p&gt;On my &lt;a class="reference external" href="http://pydanny.blogspot.com/"&gt;old blog&lt;/a&gt;, I had been having issues with Blogger for some time.  The WYSIWYG text editor was annoying in that it produced wonky HTML, so I had to hand craft the posts. Which meant I often wrote the HTML formatted copy in a text editor and then copy/pasted it into the browser. A few times this blew up and I really wished I had version controlled back ups. Adding code examples was problematic, even with a stylesheet helpfully provided by Google. Finally, some of the changes to the blog engine itself were beginning to worry me, so I started looking for alternatives.&lt;/p&gt;
&lt;p&gt;After my fiancee, Audrey Roy, converted her blog to &lt;a class="reference external" href="https://github.com/mojombo/jekyll"&gt;https://github.com/mojombo/jekyll&lt;/a&gt; at it's new location of &lt;a class="reference external" href="http://audreymroy.com"&gt;audreymroy.com&lt;/a&gt;, the static file hosting seemed so awesome I was impressed enough to &lt;a class="reference external" href="http://pydanny.com/tried-out-jekyll.html"&gt;give Jekyll a try&lt;/a&gt;. Why did Jekyll and static file hosting interest me so much?&lt;/p&gt;
&lt;div class="section" id="i-don-t-want-to-maintain-my-own-server"&gt;
&lt;h3&gt;I don't want to maintain my own server&lt;/h3&gt;
&lt;p&gt;A couple times I rolled out a blog on a site I stood up, but didn't really feel like maintaining a site. I want someone else to do it. When I write, I want someone else to worry about the details. I want to focus on writing and nothing else.&lt;/p&gt;
&lt;p&gt;Well... almost nothing else. You'll understand shortly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="i-want-to-be-able-to-write-without-connection"&gt;
&lt;h3&gt;I want to be able to write without connection&lt;/h3&gt;
&lt;p&gt;With blogger, I needed an internet connection to get my blog posts to format correctly. With Jekyll and other static file systems, I can just type away.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="i-want-to-publish-via-git"&gt;
&lt;h3&gt;I want to publish via git&lt;/h3&gt;
&lt;p&gt;My &lt;a class="reference external" href="http://pydanny-event-notes.rtfd.org"&gt;http://pydanny-event-notes.rtfd.org&lt;/a&gt; has really exploded in my own usage and continued because it uses the same patterns I use in software development. I'm used to the pattern of using Git to push up content, so why use naked HTML? Sure, there are RST-to-HTML processors that I could use to generate that HTML, but they always require some amount of manual correction. Jekyll, and it's alternatives, let me just write.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="jekyll-wasn-t-for-me"&gt;
&lt;h2&gt;Jekyll wasn't for me&lt;/h2&gt;
&lt;p&gt;I found Jekyll to be good and much more fun than Blogger, but not good enough. To sum up:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I prefer RestructuredText over Markdown.&lt;/li&gt;
&lt;li&gt;I don't know enough Ruby to easily customize things. I don't feel like diving into Ruby just to learn how to make modifications.&lt;/li&gt;
&lt;li&gt;The template engine was like Smarty/Django/Jinja2, but not as much fun. Debugging errors was very problematic. Which was a problem when I started to play with modifying the theme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the second and third bullets, you might wonder why I would care about the underlying engine if all I wanted to do was write. Well, I'm well aware of the fact that I change opinions now and then.  :-)&lt;/p&gt;
&lt;p&gt;It was after trying out Jekyll that I started looking for &lt;a class="reference external" href="http://python.org"&gt;Python&lt;/a&gt; based static file blog systems. The choices that seemed appropriate were:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="blogofile"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://www.blogofile.com/"&gt;blogofile&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is probably the most mature, most common Python static file generator around. It looks really awesome, and everyone who uses it swears by it. Alas, it's powered by &lt;a class="reference external" href="http://www.makotemplates.org/"&gt;Mako&lt;/a&gt; templates, which is... um... &lt;a class="reference external" href="http://pydanny.blogspot.com/2010/12/stupid-template-languages.html"&gt;not my friend&lt;/a&gt; (apologies to &lt;a class="reference external" href="http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/"&gt;Mike Bayer&lt;/a&gt;). What I really wanted was something with templates powered by &lt;a class="reference external" href="http://www.pocoo.org/projects/jinja2/"&gt;Jinja2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="hyde"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://hyde.github.com/"&gt;hyde&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hyde claims to have started as Jekyll's evil Python twin. On the surface it looks awesome. Where it fails is documentation. There are lots of wonderful features that appear to exist, but follow the links to those features and you find yourself on placeholder pages.&lt;/p&gt;
&lt;p&gt;In theory, I could have just looked at the hyde code and figured out stuff myself. Maybe even document out the holes.&lt;/p&gt;
&lt;p&gt;In practice, all I want to do is write blog posts. It's one thing to customize things to suit your needs, it's another thing to make things work. Or document a tool. Color me lazy if you will, but when it comes to blogging, that's just how I am.&lt;/p&gt;
&lt;p&gt;I think in the near future, once fully documented, Hyde is going to be AWESOME. For now? Well, I wanted another option.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="pelican"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://pelican.readthedocs.org/"&gt;pelican&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I was immediately hooked. Python powered engine with Jinja2 templates with &lt;strong&gt;complete documentation&lt;/strong&gt;. In fact, every time I asked the author for help, he resignedly pointed me at the documentation. How cool is that?&lt;/p&gt;
&lt;p&gt;At some point I'll use the &lt;tt class="docutils literal"&gt;CSS&lt;/tt&gt; setting to change the color of &lt;tt class="docutils literal"&gt;pygments&lt;/tt&gt; to something with white background and black text. For now I'm happy as things are now.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/77704901&amp;#64;N05/6831339872/"&gt;&lt;img alt="http://farm8.staticflickr.com/7043/6831339872_10d0c40171.jpg" class="align-center" id="pycon-cartwheel-with-glass" src="http://farm8.staticflickr.com/7043/6831339872_10d0c40171.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class="reference external" href="http://news.ycombinator.com/item?id=3804553"&gt;Discuss this post on Hacker News&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="blog"></category></entry><entry><title>Calendar About Nothing</title><link href="http://pydanny.com/calendar-about-nothing.html" rel="alternate"></link><updated>2012-03-28T11:30:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/calendar-about-nothing.html</id><summary type="html">&lt;p&gt;On October 16th, 2011, which was one hundred and sixty-four days before I published this post, I resolved to get myself onto the Longest Streak list of &lt;a class="reference external" href="http://calendaraboutnothing.com/"&gt;Calendar About Nothing&lt;/a&gt;. Today, with this blog post, I've managed to do just that - get on the Longest Streaks.&lt;/p&gt;
&lt;p&gt;Calendar About Nothing tracks your open project commits on &lt;a class="reference external" href="http://github.com"&gt;Github&lt;/a&gt;. It tallies your total number of days, records your longest streak, and lets you compare yourself against other committers. The idea comes from an &lt;a class="reference external" href="http://lifehacker.com/281626/jerry-seinfelds-productivity-secret?tag=softwaremotivation"&gt;article&lt;/a&gt; where Jerry Seinfeld says his secret to productivity is to get something done every day, because if you skip one day then skipping another day is easier.&lt;/p&gt;
&lt;div class="section" id="i-feel-a-great-sense-of-accomplishment"&gt;
&lt;h2&gt;I feel a great sense of accomplishment.&lt;/h2&gt;
&lt;p&gt;The majority of those days I would like to think I did real commits. I pledged to myself to do more than just white space tweaks or write a script to do the work for me. I wanted to accomplish things and make a difference. I started projects, wrote code, cleaned up old code, added tests, documented a lot, and moved my blog here. It's been an awesome time, and keeping my fingers constantly in projects has been eye opening.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="i-feel-a-great-sense-of-relief"&gt;
&lt;h2&gt;I feel a great sense of relief.&lt;/h2&gt;
&lt;p&gt;I've really enjoyed this but there were days it was hard to get to the internet or days I was busy on other things. I discovered early on my phone was not a good interface with Github's text editor. Some days I had no desire to code or lacked the creativity to write. Then I remembered that my ability to work openly on Github is a gift, and I should just do it. Now I can relax a bit and if I miss a day, it's not such a big deal. I've made it to the Longest Streak list!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="going-for-a-longer-streak"&gt;
&lt;h2&gt;Going for a longer streak&lt;/h2&gt;
&lt;p&gt;We'll see what happens now. I just feel happy that I've captured the moment and made my mark on the board. I invite you to do the same.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/pydanny/7024690837/in/photostream/"&gt;&lt;img alt="http://farm7.staticflickr.com/6216/7024690837_0974c93f63_o.png" class="align-center" id="my-place-on-calendar-about-nothing" src="http://farm7.staticflickr.com/6216/7024690837_0974c93f63_o.png" /&gt;&lt;/a&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category></entry><entry><title>Launching our API at PyCon 2012</title><link href="http://pydanny.com/launching-our-api-at-pycon-2012.html" rel="alternate"></link><updated>2012-03-09T07:30:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/launching-our-api-at-pycon-2012.html</id><summary type="html">&lt;p&gt;A few months ago me and my fiancee, &lt;a class="reference external" href="http://audreymroy.com"&gt;Audrey Roy&lt;/a&gt;, launched our start up, &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt;. It's a Python powered product comparison site that combines the best features of &lt;a class="reference external" href="http://opencomparison.org"&gt;Open Comparison&lt;/a&gt;, Yelp, Consumer Reports, and Pinterest. We've worked day and night to make it better, with countless members of the Python community using the site and giving us invaluable feedback.&lt;/p&gt;
&lt;p&gt;All of that brings us to &lt;a class="reference external" href="http://us.pycon.org/2012/"&gt;PyCon&lt;/a&gt;. We're not just here as attendees and participants, but also to promote our startup.  It used to be the cool thing to launch your startup at SXSW, but times have changed. Now it's the cool thing to launch at PyCon!&lt;/p&gt;
&lt;p&gt;Like Twilio, Twitter, Facebook, and Google, we've got an &lt;a class="reference external" href="http://api.consumernotebook.com"&gt;API&lt;/a&gt; we want developers to use. And as an upcoming startup, we've got to really be creative in how we gain your attention, so here is what we're doing for PyCon 2012:&lt;/p&gt;
&lt;div class="section" id="demos-at-our-pycon-startup-row-booth"&gt;
&lt;h2&gt;1. Demos at our &lt;a class="reference external" href="https://us.pycon.org/2012/community/openspaces/capoeira/"&gt;PyCon Startup Row&lt;/a&gt; booth.&lt;/h2&gt;
&lt;p&gt;Thanks PyCon!&lt;/p&gt;
&lt;p&gt;We've got a booth on Saturday. We've got banners and bright red track jackets. We're giving out handy API reference cards, as well as 10 different &lt;a class="reference external" href="http://consumernotebook.com/lists/audreyr/list-of-oreo-cookie-flavors/"&gt;flavors of Oreo cookies&lt;/a&gt; (see our site for a complete list of every Oreo cookie flavor, by the way).&lt;/p&gt;
&lt;p&gt;So stop on by, sign up for the BETA, have a cookie, and talk to us about our API. For that matter, feel free to talk to me or Audrey about the API any time you see us. We're wearing bright red jackets with '&lt;strong&gt;Ask me about our API&lt;/strong&gt;' on our back.&lt;/p&gt;
&lt;p&gt;Speaking of the API, the next item on our plan is...&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="a-big-kickoff-api-contest"&gt;
&lt;h2&gt;2. A big kickoff API contest.&lt;/h2&gt;
&lt;p&gt;We've put together the Consumer Notebook &lt;a class="reference external" href="http://api.consumernotebook.com"&gt;API&lt;/a&gt;, which lets you get product list
and comparison data out of our site via a simple REST interface.&lt;/p&gt;
&lt;p&gt;We're kicking off our PyCon 2012 API launch with an &lt;a class="reference external" href="http://developers.consumernotebook.com/contest.html"&gt;API contest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You have from now until April 22 to find new and exciting ways to use our &lt;a class="reference external" href="http://api.consumernotebook.com"&gt;API&lt;/a&gt;. If you win we'll give you a Kindle Fire or equivalent gift certificate valid in your nation of origin.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://developers.consumernotebook.com/contest.html"&gt;API Contest Details&lt;/a&gt;&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/pydanny/6821231296/sizes/m/in/photostream/"&gt;&lt;img alt="http://farm8.staticflickr.com/7189/6821231296_d0670e84b7_m.jpg" class="align-center" id="grid-of-python-books" src="http://farm8.staticflickr.com/7189/6821231296_d0670e84b7_m.jpg" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="we-re-hosting-the-saturday-night-pycon-capoeira-open-space"&gt;
&lt;h2&gt;3. We're hosting the Saturday night &lt;a class="reference external" href="https://us.pycon.org/2012/community/openspaces/capoeira/"&gt;PyCon Capoeira Open Space&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Want to see some awesome Capoeira moves? Want to learn some of the basics? Want to just have fun?&lt;/p&gt;
&lt;p&gt;We've hired professional Hollywood stuntman and Capoeira instructor to the stars, &lt;a class="reference external" href="http://valleycapoeira.com/?page_id=7"&gt;Contra Mestre Xingu&lt;/a&gt;, to come up from Los Angeles to lead this event. In addition to appearing in movies, videos, and commercials, he's got first hand experience with snakes. In his own words:&lt;/p&gt;
&lt;blockquote class="epigraph"&gt;
&lt;p&gt;Capoeira saved my life. What? How? Well it was a sunny afternoon, I was shooting a film in the Hollywood hills off Coldwater Canyon at a house. I was running back to set from the bathroom and out of nowhere a rattlesnake jumped up from the ground and tried to bite me. I quickly jumped out of the way and did a fast negative &lt;a class="reference external" href="http://en.wikipedia.org/wiki/List_of_capoeira_techniques#Rol.C3.AA"&gt;rolé&lt;/a&gt; away from the snake. Then I called the other people on set and we caught it. I really didn't think much of it afterwards until after the shoot. My friend told me the rattlesnake was a young one and I'm lucky I didn't get bitten.  When a younger rattler bites you, it usually unloads all of it's venom in you because it cannot control the amount it releases.&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;Contra Mestre Xingu&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Over 30 people have signed up up for this event, including Python core developers.&lt;/p&gt;
&lt;p&gt;Details:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
When: Saturday, 8pm - 10pm
What to bring: Camera!
What to bring if you are participating: Workout clothes, water bottle
&lt;/pre&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/pydanny/6821195620/sizes/s/in/photostream/"&gt;&lt;img alt="http://farm8.staticflickr.com/7182/6821195620_2b7870a39c_m.jpg" class="align-center" id="location-of-the-pycon-capoeira-open-space-event" src="http://farm8.staticflickr.com/7182/6821195620_2b7870a39c_m.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;Location: The PyCon upstairs central open space&lt;/strong&gt;&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;See you around!&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="OAuth"></category><category term="api"></category><category term="Consumer-Notebook"></category><category term="pycon"></category></entry><entry><title>The sorry state of Python OAuth providers</title><link href="http://pydanny.com/the-sorry-state-of-python-oauth-providers.html" rel="alternate"></link><updated>2012-03-05T07:30:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/the-sorry-state-of-python-oauth-providers.html</id><summary type="html">&lt;p&gt;This is one of those challenging posts to write. The people whose projects I'm going to describe have put in a lot of dedicated, hard work to overcome a challenging subject. Writing an OAuth consumer is a hard problem and writing an OAuth provider is an even harder problem. The efforts put in by the authors of these projects has been nothing short of incredible. The problem, however, is that the existing projects are not usable as-is, and need the support of the community in order to improve.&lt;/p&gt;
&lt;p&gt;The terrible thing is that this is a solved problem within our community. Python based projects are successfully implementing OAuth providers, and often using internally hacked versions of the efforts I'm about to describe. However, they aren't giving this back to the community. It might be that they want to protect their competitive edge, but I'm going to be nice and say that it's because their too busy to find time to send pull requests back.&lt;/p&gt;
&lt;p&gt;In any case, let me present our use case. For &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt; we want an &lt;a class="reference external" href="http://api.consumernotebook.com"&gt;API&lt;/a&gt;. We want to be able to track usernames, passwords, and the application using our &lt;a class="reference external" href="http://api.consumernotebook.com"&gt;API&lt;/a&gt; - which is the OAuth use case. Much as BasicAuth or DigestAuth is the easier way to go in terms of implementation, OAuth was designed for our use case: allowing third-party developers to build apps using our API without having to store credentials. In fact, it's a critical security issue: Twitter dealt with malicious &amp;quot;Twitter apps&amp;quot; stealing usernames and passwords before they switched to OAuth. As an API provider, being an OAuth provider might be more challenging, but it's the responsible thing to do.&lt;/p&gt;
&lt;div class="section" id="existing-oauth-providers"&gt;
&lt;h2&gt;Existing OAuth Providers&lt;/h2&gt;
&lt;p&gt;Time to get into the meat of the issue. Let's look at the current implementations of OAuth providing within the Python community. Again, I wish I didn't have to be negative, but I'm up against the wall:&lt;/p&gt;
&lt;div class="section" id="oauth2app-django"&gt;
&lt;h3&gt;OAuth2app (Django)&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/hiidef/OAuth2app"&gt;https://github.com/hiidef/OAuth2app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OAuth version: 2.0&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Strange URL construction that might be a security hole.&lt;/li&gt;
&lt;li&gt;Bitwise operators in the logic making it harder to debug. Security is hard. Don't complicate your security code because your mistakes will cost.&lt;/li&gt;
&lt;li&gt;Uncommented code. Security is hard. Comment your code.&lt;/li&gt;
&lt;li&gt;Documentation outdated and insufficient.&lt;/li&gt;
&lt;li&gt;Doesn't work without serious hacking and adding of undocumented parameters. Which means I have to worry if I'm breaking anything.&lt;/li&gt;
&lt;li&gt;We managed to get it working with GET requests.  Then we realized that we were using GET requests, which seems like a bad idea.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="django-piston-django"&gt;
&lt;h3&gt;django-piston (Django)&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bitbucket.org/jespern/django-piston"&gt;https://bitbucket.org/jespern/django-piston&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OAuth version: 1.0&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Stalled project.&lt;/li&gt;
&lt;li&gt;Documentation insufficient.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="django-oauth-plus-django"&gt;
&lt;h3&gt;django-oauth-plus (Django)&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="http://code.larlet.fr/django-oauth-plus"&gt;http://code.larlet.fr/django-oauth-plus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OAuth version: 1.0a&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Tutorial doesn't work.&lt;/li&gt;
&lt;li&gt;Documentation insufficient.&lt;/li&gt;
&lt;li&gt;Doesn't work without serious hacking. Which means I have to worry if I'm breaking anything.&lt;/li&gt;
&lt;li&gt;We could not get it to work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="lastuser-flask"&gt;
&lt;h3&gt;lastuser (Flask)&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/hasgeek/lastuser"&gt;https://github.com/hasgeek/lastuser&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OAuth version: 2.0&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;No documentation&lt;/li&gt;
&lt;li&gt;No tests to serve as documentation&lt;/li&gt;
&lt;li&gt;Lack of documentation means I'm not sure if it is actually a OAuth provider.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="python-oauth2-python"&gt;
&lt;h3&gt;python-oauth2 (Python)&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/dgouldin/python-OAuth2"&gt;https://github.com/dgouldin/python-OAuth2&lt;/a&gt; (best example)&lt;/p&gt;
&lt;p&gt;OAuth version: 1.0&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Called 'OAuth2' but only works with OAuth 1? Really? &lt;strong&gt;WTF?&lt;/strong&gt; This needs to fixed.&lt;/li&gt;
&lt;li&gt;Documentation insufficient.&lt;/li&gt;
&lt;li&gt;Provides only a skeleton of a provider. Not a turnkey solution.&lt;/li&gt;
&lt;li&gt;Doesn't work as a provider without serious hacking. Which means I have to worry if I'm breaking anything.&lt;/li&gt;
&lt;li&gt;Many, many forks of the project, with various blog posts advising people to use various particular forks rather than the main one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="how-about-a-solution"&gt;
&lt;h2&gt;How about a solution?&lt;/h2&gt;
&lt;p&gt;Alright, I've ranted and laid out out a bunch of bullets identifying a problem. Time to try and fix the problem.&lt;/p&gt;
&lt;p&gt;For starters, a production-usable OAuth provider should meet certain standards:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Near turnkey solution&lt;/li&gt;
&lt;li&gt;Working code (duplicates above bullet but I'm making a point)&lt;/li&gt;
&lt;li&gt;Working tutorials&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Commented code&lt;/li&gt;
&lt;li&gt;Linted code&lt;/li&gt;
&lt;li&gt;Test coverage &amp;gt; 80%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is my specification. If your project for any Python framework matches it, I'll list it on a forthcoming website that also covers Python based OAuth consumers.&lt;/p&gt;
&lt;p&gt;For what it's worth, Idan Gazit has been working on something to help address the problem, specifically &lt;a class="reference external" href="https://github.com/idangazit/oauthlib"&gt;https://github.com/idangazit/oauthlib&lt;/a&gt;. It also is intended to cover the Python OAuth consumption issue I didn't cover in this article.  It and related efforts need a lot of work, so...&lt;/p&gt;
&lt;p&gt;The PyCon US 2012 sprints start on March 12. I think as a community, we Pythonistas should band together and make things right. I think we'll have the brainpower and enough eyes on the problem to make serious headway on the issue, either by fixing existing solutions or creating new ones. Right now I've got interest from people to join in and help, including Idan Gazit, Audrey Roy, George Hickman, and others.&lt;/p&gt;
&lt;p&gt;We're willing to put in the time to make OAuth in Python better, how about you?&lt;/p&gt;
&lt;p&gt;Join us at the PyCon US sprints either in person or on-line. &lt;a class="reference external" href="https://us.pycon.org/2012/community/sprints/projects/"&gt;Details of the sprint are near the bottom of this PyCon Sprint page&lt;/a&gt;.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://oauth.net/"&gt;&lt;img alt="http://farm8.staticflickr.com/7201/6803475636_f34fb400eb_m.jpg" class="align-center" id="oauth-logo" src="http://farm8.staticflickr.com/7201/6803475636_f34fb400eb_m.jpg" /&gt;&lt;/a&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="updates"&gt;
&lt;h3&gt;Updates&lt;/h3&gt;
&lt;p&gt;03/05/2012 - Removed Velruse from the list of providers as it's lead, Michael Merickel, clarified that it is not a provider.
03/06/2012 - Added a link to the PyCon OAuth sprints.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;a class="reference external" href="http://news.ycombinator.com/item?id=3666853"&gt;Discuss this post on Hacker News&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="OAuth"></category><category term="api"></category><category term="Consumer-Notebook"></category></entry><entry><title>You should Heroku</title><link href="http://pydanny.com/you-should-heroku.html" rel="alternate"></link><updated>2012-02-28T12:45:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/you-should-heroku.html</id><summary type="html">&lt;p&gt;In mid-November me and my fiancee, &lt;a class="reference external" href="http://audreymroy.com"&gt;Audrey Roy&lt;/a&gt; began our startup. We had been frustrated with trying to do on-line product research and came up with an idea to take the lessons learned from &lt;a class="reference external" href="http://djangopackages.com"&gt;Django Packages&lt;/a&gt; / &lt;a class="reference external" href="http://opencomparison.org"&gt;Open Comparison&lt;/a&gt; and apply them to a commercial effort. The result has been &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt;, and it's been a steadily growing success.&lt;/p&gt;
&lt;p&gt;We've been bootstrapping the project. That means supporting it with consulting and grinding away on it during our free time. That means 12-16 hour days of Python, Django, and Javascript coding, marketing, system administration, graphic design, communicating with users and vendors, and a thousand other tasks. Since we've had to explore new techniques for making things work on the backend and front end, that means we've needed to have a robust system that is trivial to deploy and certain to never go down. Which, of course, requires serious sys admin skills.&lt;/p&gt;
&lt;div class="section" id="the-big-problem"&gt;
&lt;h2&gt;The Big Problem&lt;/h2&gt;
&lt;blockquote class="pull-quote"&gt;
&lt;strong&gt;I hate system administration work.&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;Sys admin is boring. I find it tedious and dull. Devops doesn't make it easier/faster, it just makes it possible to do it at a large scale.&lt;/p&gt;
&lt;p&gt;Fortunately for me, my fiancee likes the sys admin side of things. However, she's got serious programming skills in Python/Javascript, understands CSS, is an excellent illustrator, and has good business skills to boot. Which means &lt;strong&gt;I needed Audrey not to be doing sys admin&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="solution-platform-as-a-service"&gt;
&lt;h2&gt;Solution: Platform as a Service&lt;/h2&gt;
&lt;p&gt;Platform as a Service, or &lt;a class="reference external" href="http://en.wikipedia.org/wiki/PaaS"&gt;PaaS&lt;/a&gt;, is where someone else does the majority of work involved in system administration. There are now &lt;a class="reference external" href="http://www.quora.com/What-is-the-Heroku-equivalent-for-Django-applications-Edit-Question-not-relevant-anymore-as-Heroku-now-supports-Django"&gt;dozens of companies edging into the Python capable PaaS space&lt;/a&gt;. We've been leery of using any of them but finally settled on &lt;a class="reference external" href="http://heroku.com"&gt;Heroku&lt;/a&gt; after a long period of evaluation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="why-heroku"&gt;
&lt;h2&gt;Why Heroku?&lt;/h2&gt;
&lt;p&gt;We choose Heroku for a number of reasons:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;We competed in a Los Angeles area Hacking contest with &lt;a class="reference external" href="http://rdegges.com/"&gt;Randall Degges&lt;/a&gt;. He was responsible for the sys admin and went with Heroku. He got it up and it was out of the way for the competition. He spent his time coding, adding features, and fixing templates instead of tweaking knobs on something in the cloud. We saw other people not deliver products at the contest because of this issue.&lt;/li&gt;
&lt;li&gt;Heroku doesn't lock you in. If I wanted to, I could take all the pieces out in about 10 minutes, then go old school and host it myself on my own closet server.&lt;/li&gt;
&lt;li&gt;Heroku has very good &lt;a class="reference external" href="http://devcenter.heroku.com/categories/heroku-postgres"&gt;PostgreSQL&lt;/a&gt; support. Our web framework is &lt;a class="reference external" href="http://djangoproject.com"&gt;Django&lt;/a&gt;, which has an ORM that works best with PostgreSQL.&lt;/li&gt;
&lt;li&gt;Heroku has staff. At least seventy of them. Odds are they would have people around 24/7 to deal with issues.&lt;/li&gt;
&lt;li&gt;The add-on system means they've got many other people adding great new features. Want &lt;a class="reference external" href="https://addons.heroku.com/mongolab"&gt;MongoDB&lt;/a&gt;? No problem! How about something to &lt;a class="reference external" href="https://addons.heroku.com/pandastream"&gt;handle video&lt;/a&gt;? You got it!&lt;/li&gt;
&lt;li&gt;Heroku scales up trivially. If we get an upswell of users, I just type &lt;tt class="docutils literal"&gt;heroku ps:scale web=50&lt;/tt&gt; and I've got 50 web server things handling the load.&lt;/li&gt;
&lt;li&gt;When I think of Heroku I think of Puffer Fish. Which is awesome because Puffer Fish are awesome.&lt;/li&gt;
&lt;/ol&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/saspotato/5776592544/"&gt;&lt;img alt="http://farm6.staticflickr.com/5303/5776592544_fb15a2902a_m.jpg" class="align-center" id="puffer-fish" src="http://farm6.staticflickr.com/5303/5776592544_fb15a2902a_m.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;Creative Commons: Some rights reserved by &lt;a class="reference external" href="http://www.flickr.com/photos/saspotato/5776592544/"&gt;Saspotato&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="things-that-we-really-liked-about-using-heroku"&gt;
&lt;h3&gt;Things that we really liked about using Heroku&lt;/h3&gt;
&lt;p&gt;As we progressed down the journey of building our site, we discovered even more nice features about Heroku. Here are some of the things that really make me smile:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://devcenter.heroku.com/articles/releases"&gt;Releases&lt;/a&gt; and especially &lt;a class="reference external" href="http://devcenter.heroku.com/articles/releases#rollback"&gt;rollbacks&lt;/a&gt; means we deploy with a lot more confidence.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://devcenter.heroku.com/articles/logging"&gt;Logging&lt;/a&gt; and other diagnostic add-ons like &lt;a class="reference external" href="https://addons.heroku.com/sentry"&gt;Sentry&lt;/a&gt; and &lt;a class="reference external" href="https://addons.heroku.com/newrelic"&gt;New Relic&lt;/a&gt; means we know what's going on.&lt;/li&gt;
&lt;li&gt;During one huge data migration effort I scaled up the workers so a 6 hour task became a 5 minute task. Cost was less then 10 cents for workers instead of me losing hours of labor.&lt;/li&gt;
&lt;li&gt;In case we go viral, we don't have to worry about load balancers and all that high performance stuff.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="what-does-that-mean"&gt;
&lt;h2&gt;What does that mean?&lt;/h2&gt;
&lt;p&gt;It means I'm doing the deployments. I'm the sys admin. And I'm happy with my role because it takes minutes out of my day. Me and Audrey team up on everything else and the results so far have been great. If you've ever worked with me, the fact that &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt; is administered and deployed by me is going to be a shock.&lt;/p&gt;
&lt;p&gt;We've been able to really focus on development of the project. And when I mean development, I mean a lot of things. I mean:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Django&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Data Modeling&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://api.consumernotebook.com/"&gt;Documenting the API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Marketing: &lt;a class="reference external" href="http://insidertips.consumernotebook.com/"&gt;blogging on Consumer Notebook&lt;/a&gt;, &lt;a class="reference external" href="https://twitter.com/consumernotebk"&gt;Tweeting&lt;/a&gt;, and working with other groups&lt;/li&gt;
&lt;li&gt;Trying out &lt;a class="reference external" href="https://github.com/consumernotebook/tickets/issues"&gt;public tickets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Iterating through the user experience by communicating to users&lt;/li&gt;
&lt;li&gt;All the boring legal and business stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What you don't see is anything about sys admin issues. That's because what could have been a huge sink in time and resources is pretty much gone. We deploy staging servers with a bit of code I copy/pasted from a bash history into a Fabric script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;fabric.api&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;

&lt;span class="n"&gt;commands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;heroku create --stack cedar&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add memcache&lt;/span&gt;
&lt;span class="s"&gt;heroku config:add S3_KEY=HAHAHAHAHAHA S3_SECRET=NOTGIVINGITOUT&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add redistogo&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add sendgrid:starter&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add mongolab:starter&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add sentry:test&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add pgbackups&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add custom_domains:basic&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add zerigo_dns:basic&lt;/span&gt;
&lt;span class="s"&gt;heroku domains:add staging.consumernotebook.com&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add ssl:piggyback&lt;/span&gt;
&lt;span class="s"&gt;git push heroku master&lt;/span&gt;
&lt;span class="s"&gt;heroku scale web=1&lt;/span&gt;
&lt;span class="s"&gt;heroku addons:add heroku-PostgreSQL:ronin&lt;/span&gt;
&lt;span class="s"&gt;heroku pg:wait&lt;/span&gt;
&lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_staging&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;How awesome is that?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="how-much-does-heroku-really-cost"&gt;
&lt;h2&gt;How much does Heroku really cost?&lt;/h2&gt;
&lt;p&gt;You can do Heroku for free. A lot of people do. More power to them.&lt;/p&gt;
&lt;p&gt;But let's face it, beyond a certain point, every PaaS, including Heroku, is going to be more expensive then getting your own EC2, Rackspace, Dreamhost, or Linode hosted server. For a fraction of the cost, you can provision a server, install all the bits, configure the database, http server, load balancers, and even write Chef/Puppet/Fabric scripts so you can do it repeatedly at scale. Cheap!&lt;/p&gt;
&lt;p&gt;So why pay more for Heroku? Why not just do it ourselves? For example, right now we're on dedicated PostgreSQL hosting which Heroku charges us $200/month. That's a lot, right?&lt;/p&gt;
&lt;blockquote class="pull-quote"&gt;
&lt;strong&gt;Wrong.&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;Right now we're seeing a 50% increase in visits every day. So if we ran our own servers, Chef/Puppet/Fabric or not, odds are we would be spending at least 10 hours a month doing server work. And I can assure you that when we consult that we make more than $20/hour.&lt;/p&gt;
&lt;blockquote class="pull-quote"&gt;
&lt;strong&gt;$200 &amp;lt; 10 hours of us doing consulting work to bootstrap the project.&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;Until you hit a certain point, these days the real cost of servers is labor. If you're a developer or small effort, and you think going with a cheap hosting provider is the way to go, think again. Think about the hours you're losing monkeying around with servers and databases instead of getting code done.&lt;/p&gt;
&lt;p&gt;Heroku saves us money.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-takeaway"&gt;
&lt;h2&gt;The Takeaway&lt;/h2&gt;
&lt;p&gt;One of the problems Django and other Python web frameworks has had is the difficulty of deployment. I can't tell you how many projects I didn't do because of the thought of handling the sys admin side of things. Let's face it, one of the great ongoing successes for PHP is that deploying the majority of sites is trivial.&lt;/p&gt;
&lt;p&gt;With the rise of devops we've seen a lot of developers across languages and frameworks dive into &lt;strong&gt;Chef&lt;/strong&gt; and &lt;strong&gt;Puppet&lt;/strong&gt;. It's been sadly amusing watching people muck around with these great tools to make the deployment of 1-2 servers 'easier', when the real benefit of those tools has been to do things at scale. Things like deployments of fifty servers at once or deployment abstractions for hundreds of people (my fancy talk for PaaS).&lt;/p&gt;
&lt;p&gt;In any case, things have changed. Deploying Python web apps is as trivial as deploying PHP code.&lt;/p&gt;
&lt;p&gt;For developers I see great times ahead.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;a class="reference external" href="http://news.ycombinator.com/item?id=3643910"&gt;Discuss this post on Hacker News&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="django"></category><category term="heroku"></category><category term="consumernotebook"></category><category term="mongodb"></category></entry><entry><title>I use this</title><link href="http://pydanny.com/i-use-this.html" rel="alternate"></link><updated>2012-02-25T12:45:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/i-use-this.html</id><summary type="html">&lt;p&gt;I had been meaning to do this for some time, and even had a nascent page for it on this site already. I just noticed my old friend &lt;a class="reference external" href="http://jessica.hammer.usesthis.com/"&gt;Jessica Hammer&lt;/a&gt; was featured on &lt;cite&gt;usesthis.com&lt;/cite&gt;. Then I remembered &lt;a class="reference external" href="http://kennethreitz.com/"&gt;Kenneth Reitz&lt;/a&gt; &lt;a class="reference external" href="http://kennethreitz.com/i-use-this.html"&gt;blogged about his tools&lt;/a&gt; not that long ago. Looks like it is my turn now.&lt;/p&gt;
&lt;p&gt;So without further ado, seven of my tools, specifically software.&lt;/p&gt;
&lt;div class="section" id="textmate"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://consumernotebook.com/textmate-the-missing-editor-for-mac-os-x/4f4ad4e35a4305000d000000/"&gt;TextMate&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="epigraph"&gt;
&lt;p&gt;&amp;quot;My relationship with Textmate isn't healthy.&amp;quot;&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;Myself&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I continue to use it, even though it's unsupported, has weird whitespace issues, and people make fun of me. I don't mean the EMACS/Vim people, cause they mock everyone, I mean people using &lt;a class="reference external" href="http://consumernotebook.com/sublime-text/4f4ad53a5a4305000e000000/"&gt;Sublime Text 2&lt;/a&gt;, &lt;a class="reference external" href="http://consumernotebook.com/jetbrains-pycharm/4f4ad5b861e9e4000e000000/"&gt;PyCharm&lt;/a&gt;, and NotePad on Windows. I try to make a brave face of it and for the most part I succeed.&lt;/p&gt;
&lt;p&gt;Speaking of which, you know how you sometimes wish deep inside that the fairy tales of youth were actually true? Or that there was a zombie apocalypse and you got the chance to show off how all your eclectic skills and pursuits would make you a survival genius? Well, I feel that way about TextMates 2 being released in my lifetime. Alas, stark reality stares me in the face; yet I cling to hope.&lt;/p&gt;
&lt;p&gt;Alright, sometimes I dabble in Sublime Text 2.  I've played with PyCharm. In 2010 I even worked on a project where use of &lt;a class="reference external" href="http://consumernotebook.com/pydev/4f4ad5d55a4c6f000d000000/"&gt;PyDev&lt;/a&gt; was mandatory. When I touch servers it's EMACS, Vi, or even Nano. And yet to TextMate I always return.&lt;/p&gt;
&lt;p&gt;Is TextMate dead? Probably. And yes, someday I'll switch over to something else, probably Sublime Text 2. In order to be certain I'm starting to &lt;a class="reference external" href="http://consumernotebook.com/lists/pydanny/complete-list-of-python-editors/"&gt;list all the Python editors&lt;/a&gt; so I can review them properly before switching.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="keynote"&gt;
&lt;h2&gt;Keynote&lt;/h2&gt;
&lt;p&gt;I never liked Powerpoint. I tried to use Google Presentations for years. Finally I tried Apple's Keynote for presentations and it was an amazing decision. It's simple, easy, and remains out of my way. To make code pretty I copy/paste pygmentized code and it just works.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="read-the-docs"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://rtfd.org"&gt;Read the Docs&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="epigraph"&gt;
&lt;p&gt;&amp;quot;Wikis are where documentation goes to die.&amp;quot;&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;Jacob Kaplan-Moss&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm of the opinion that Python open source projects that don't have Sphinx documentation are not ready for production use. And if I have to decide between two projects that are close in capability and one of them isn't on Read the Docs, then you know which way I'll go.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;Because I want my documentation as up-to-date as possible. Wikis often fail in this, so do custom documentation solutions, and so does upload tarballs to a service. You should be using the same patterns for documentation as you do coding. Use Read the Docs.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="heroku"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://heroku.com"&gt;Heroku&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I first heard that Heroku had become yet-another-Python-PAAS, I shrugged. The field is crowded. We've tried a bunch, but never felt like committing a real project to this type of service.&lt;/p&gt;
&lt;p&gt;After a coding contest in October over in Hollywood where &lt;a class="reference external" href="http://rdegges.com"&gt;Randall Degges&lt;/a&gt; served as sys admin for the project and tried out Heroku, I was impressed. Heroku provided a nice command-line interface and had an impressive feature set on it's own. A stand-out feature I noticed was the &lt;a class="reference external" href="http://add-ons.heroku.com"&gt;add-ons&lt;/a&gt;, which are Heroku moderated third-party plug-ins for their service. Finally, it didn't hurt that Heroku has the staff to provide 24/7 coverage of their servers.&lt;/p&gt;
&lt;p&gt;We decided to give it a try and the results are that &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt; is hosted by Heroku. We're more than pleased, and I'll be blogging about the advantages of PaaS over doing-servers-yourself in a future article.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="password"&gt;
&lt;h2&gt;&lt;a class="reference external" href="https://agilebits.com/store"&gt;1Password&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For all my umpteen accounts they all have different, crazy obscure passwords. All I need to do is remember one password and I've got access to them. What is even better is that it allows me to look up passwords in a crowded room - they are kept obfuscated by the password &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;****&lt;/span&gt;&lt;/tt&gt; field. So much better than trying to keep it all in my head, or relying on weird coding patterns.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="consumer-notebook"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yup, I eat my own dogfood. It lets me &lt;a class="reference external" href="http://consumernotebook.com/grids/~pydanny/"&gt;build comparison grids&lt;/a&gt; or look at what &lt;a class="reference external" href="http://consumernotebook.com/grids/r1chardj0n3s/10-android-tablets/"&gt;other people are comparing&lt;/a&gt;. I can &lt;a class="reference external" href="http://consumernotebook.com/lists/~pydanny/"&gt;list stuff for any purpose&lt;/a&gt;, and turn the content of those lists into grids. It is still in BETA, so things are still under development. However, on the other side, since I'm the one building and using it, I get to determine the features going in or coming out.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="mac-os-x"&gt;
&lt;h2&gt;Mac OS X&lt;/h2&gt;
&lt;p&gt;I started as an Apple user:&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/pydanny/6933443849/"&gt;&lt;img alt="http://farm8.staticflickr.com/7050/6933443849_51316a7cb7.jpg" class="align-center" id="apple" src="http://farm8.staticflickr.com/7050/6933443849_51316a7cb7.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;I use Mac OS X professionally and have done so since 2006. However, between autumn of 1985 and 2006 I used MS/DOS and Windows (deployments usually to Unix/Linux). Not by choice but by hard reality of management decision. In September of 2006 as I started to learn Python work gave me an old, discarded Macbook Pro. Since then coding on OS X and then deploying on Linux has been my pattern. I've followed this pattern ever since, and I'm going to hit six years now as an OS X user.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="tools"></category></entry><entry><title>PyCon Australia 2011 Review</title><link href="http://pydanny.com/pycon-australia-2011-review.html" rel="alternate"></link><updated>2012-02-24T12:45:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/pycon-australia-2011-review.html</id><summary type="html">&lt;p&gt;In June of 2011 I had the good fortune of having my then girlfriend, Audrey Roy, now fiancee, &lt;a class="reference external" href="http://pydanny.blogspot.com/2011/06/im-going-to-pycon-australia.html"&gt;invited to present a keynote speech at PyCon Australia 2011&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was terribly excited for her to get that invitation, and that excitement was compounded when they allowed me to present on &lt;a class="reference external" href="http://www.slideshare.net/pydanny/confessions-of-a-joe-developer`:"&gt;Confessions of Joe Developer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Travel is a passion of mine, and it's only been since 2007 that I've gotten a chance to do much seeing of the world. Australia was always this distant goal of mine, but I never thought I would get the chance to go. Fortunately, my assumption was wrong and we landed on August 18th in Sydney, Australia!&lt;/p&gt;
&lt;p&gt;Audrey &lt;a class="reference external" href="http://audreyr.posterous.com/thank-you-pycon-au"&gt;wrote her own statement about the event&lt;/a&gt; right after we were done. She's good that way. Okay then, off to my own review. This is belated, but better late then never, right?&lt;/p&gt;
&lt;div class="section" id="conference-rooms"&gt;
&lt;h2&gt;Conference Rooms&lt;/h2&gt;
&lt;p&gt;The Sydney Masonic Center was the venue and it was a really curious building. They built it a while ago, then apparently grafted an office building onto the top of the temple. &lt;strong&gt;You have to see it to believe it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The main temple room was room, interesting, and fun. The acoustics, to my limited ear, seemed quite good. The alternative rooms for some of the tracks were small presentation rooms, which did quite nicely except when the organizers chose popular talks for small rooms and things overflowed. Everyone was good natured about that and we all just worked it out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result: Great&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="speakers"&gt;
&lt;h2&gt;Speakers&lt;/h2&gt;
&lt;p&gt;I'm partial but I think the opening keynote by Audrey Roy about diversity was wonderful. Mary Gardinar also talk about open source projects trying to change the world that need our support. Raymond Hettiger seriously delivered the goods with another version of his amazing talk about what makes Python great. Whatever you do, go and see it as many times as possible because he changes it each and every time.  Richard Jones' presentation on the &lt;a class="reference external" href="http://pydanny-event-notes.readthedocs.org/en/latest/PyconAU2011/zen_of_python.html"&gt;Zen of Python&lt;/a&gt; was very solid too, and I'll use this as an opportunity to promote my &lt;a class="reference external" href="http://pypi.python.org/pypi/that"&gt;Anti-Zen of Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When it came time for me to present on &lt;a class="reference external" href="http://www.slideshare.net/pydanny/confessions-of-a-joe-developer`:"&gt;Confessions of Joe Developer&lt;/a&gt;, I finished way too early; plus me and Audrey felt the talk was not technical enough. Even though the reception for my talk was very positive, based on that experience and observation we ramped up the technical content for DjangoCon US and I delivered a much stronger talk. I want to thank the Australian Python community for being a wonderful audience.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="http://pydanny-event-notes.readthedocs.org/en/latest/PyconAU2011/index.html"&gt;rest of the talks I saw were all quite good&lt;/a&gt;, in fact the &lt;a class="reference external" href="http://pydanny-event-notes.readthedocs.org/en/latest/PyconAU2011/decorators.html"&gt;one on decorators&lt;/a&gt; was incredible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result: Super&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conference-meals"&gt;
&lt;h2&gt;Conference Meals&lt;/h2&gt;
&lt;p&gt;The night before the conference, Frends/mentors Russell Keith-Magee and Malcolm Tredennick took me to a sushi-train place and we gobbled down some very nice raw seafood. Call me silly, but sushi on moving plates just tastes better! Thanks guys!&lt;/p&gt;
&lt;p&gt;In between talks they served nice little sandwiches. The coffee bar had lovely Flat Whites and considering the quality of dairy in Australia I was very happy with the break food.&lt;/p&gt;
&lt;p&gt;The first night of the conference they served an amazing, amazing meal. The lamb was like nothing I've tasted before - my best way of describing it was &amp;quot;&lt;em&gt;so this is how lamb is supposed to taste&lt;/em&gt;&amp;quot;. We also got served Pavlova, which Audrey really enjoyed.&lt;/p&gt;
&lt;p&gt;The last evening of the conference we went out to a famous Sydney gastropub/brewery and got kangaroo and crocodile pizza. The kangaroo was outstanding, but the alligator wasn't my thing.&lt;/p&gt;
&lt;p&gt;After the conference we went with Graham Dumpleton to a wonderful Dim Sum place and I stuffed myself silly while Audrey quizzed Graham on WSGI. I was sleepy for the rest of the day.&lt;/p&gt;
&lt;p&gt;Pounds gained? Many.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result: Superb&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="parties"&gt;
&lt;h2&gt;Parties&lt;/h2&gt;
&lt;p&gt;There were some lovely dinners and hang-outs. It was incredible putting faces to names and personalities. Everyone looked as I imagined, which meant they looked smashing. Events tended to be lower key, which can make for some wonderfully nice, cozy conversation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result: Good&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="accomodations"&gt;
&lt;h2&gt;Accomodations&lt;/h2&gt;
&lt;p&gt;There was no official conference hotel so we stayed at World Hotel - in easy walking distance of the conference center. It wasn't cheap, but I've learned from painful experience that when you travel to a conference, you want to spend your time at the conference, not going to-and-from a cheap hotel five miles away.&lt;/p&gt;
&lt;p&gt;The staff of the hotel were very nice and helpful. Unfortunately they were working around the limitations of their building. The rooms were really tiny and rather stuffy. Normally that isn't an issue since we spend a lot of our time outside the room, but in this case Audrey was polishing her talk and needed a quiet room.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result: Average but not the fault of the conference&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sprints"&gt;
&lt;h2&gt;Sprints&lt;/h2&gt;
&lt;p&gt;We talked with Richard Jones about PyPI authentication issues, and he decided to go with OpenID. Personally, I would prefer OAUTH but I'll take whatever I can get. On the behalf of the community Mark Rees implemented OpenID on PyPI at the sprint so things like &lt;a class="reference external" href="http://opencomparison.org"&gt;http://opencomparison.org&lt;/a&gt; can support the community better. One goal at PyCon 2012 is to get that working as another authentication system.&lt;/p&gt;
&lt;p&gt;Otherwise I closed bugs and worked lintification of the project. Audrey and a couple Australian PyLadies, Elena Williams and Jenny Nguyen, worked some core Django documentation tickets. We didn't get as much done as we hoped thanks to an outside distraction, but the organization of the sprints was top-notch.&lt;/p&gt;
&lt;p&gt;During the sprint, those crazy Australians taught us how to do a &lt;strong&gt;Tim Tam Slam&lt;/strong&gt;. It's rather scary and not for the faint of heart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result: Great&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="overall-result"&gt;
&lt;h2&gt;Overall Result&lt;/h2&gt;
&lt;p&gt;The conference was run professionally. The leadership was on the ball. The few issues that cropped up were taken care of, certainly better then what I would have done. Thank you everyone who put it together or just gave us a great time: Tim Ansell, Richard Jones, Nick Coghlan, Russell Keith McGee, Graham Dumpleton, Malcolm Tredennick and many others.&lt;/p&gt;
&lt;p&gt;Australia was amazing. The people were wonderful. I wish we had more time to go sightseeing and relax, but we were off all too quickly. I could write a book about the experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combined Result: Great&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="pycon"></category><category term="audrey"></category><category term="australia"></category><category term="review"></category></entry><entry><title>My PyCon 2012 Schedule</title><link href="http://pydanny.com/my-pycon-2012-schedule.html" rel="alternate"></link><updated>2012-02-22T09:00:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/my-pycon-2012-schedule.html</id><summary type="html">&lt;p&gt;Here I was thinking that this year's PyCon wasn't going to be so busy because I didn't submit a talk or tutorial. Ha! What the heck was I thinking?&lt;/p&gt;
&lt;p&gt;Here's what I've already got in the works.&lt;/p&gt;
&lt;div class="section" id="wednesday-march-7th"&gt;
&lt;h2&gt;Wednesday, March 7th&lt;/h2&gt;
&lt;p&gt;Me and Audrey are driving up from Los Angeles. I've wanted to do this drive for a while, so this is very exciting. We'll arrive in the evening and hopefully tag up with friends old and new.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="thursday-march-8th"&gt;
&lt;h2&gt;Thursday, March 8th&lt;/h2&gt;
&lt;p&gt;I'm moderating the Code Reuse panel of the Python Web Summit. &lt;a class="reference external" href="http://www.google.com/moderator/#15/e=1c9a94&amp;amp;t=1c9a94.43"&gt;Have you submitted a question yet&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;In the evening we'll be helping assemble bags for the conference. That's always a blast.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="friday-march-9th"&gt;
&lt;h2&gt;Friday, March 9th&lt;/h2&gt;
&lt;p&gt;PyCon really begins! I'll be at the keynotes, and then the talks begin. These are some of the talks I'm really leaning towards watching:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/64/"&gt;Introduction to Metaclasses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/399/"&gt;The Art of Subclassing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/249/"&gt;Data, Design, Meaning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/246/"&gt;Code Generation in Python: Dismantling Jinja&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem, of course, is that all the talks look awesome. Missing some of these talks is going to hurt.&lt;/p&gt;
&lt;p&gt;In the evening we're going to the New Relic/Loggly/Skull Candy party and hang out at the (in)famous TIP BOF.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="saturday-march-10th"&gt;
&lt;h2&gt;Saturday, March 10th&lt;/h2&gt;
&lt;p&gt;I'll be at the &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt; &lt;a class="reference external" href="http://pycon.blogspot.com/2012/02/startup-row-winners-for-pycon-2012.html"&gt;Startup Row&lt;/a&gt; booth all day! Come and hang out with us and all the other bright, new companies.&lt;/p&gt;
&lt;p&gt;In the evening I'm hosting the &lt;a class="reference external" href="https://us.pycon.org/2012/community/openspaces/capoeira/"&gt;PyCon Capoeira Open Space&lt;/a&gt;. We've got a seriously large room assigned for the event, and over twenty five people currently signed up to participate (&lt;a class="reference external" href="http://bit.ly/pycon-capoeira"&gt;there's still room for signups&lt;/a&gt;). Even if you don't want to play a musical instrument or learn/play at Capoeira, come anyway to watch. Some of the players there have some seriously amazing skills - I can assure you've seen them in the movies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sunday-march-11th"&gt;
&lt;h2&gt;Sunday, March 11th&lt;/h2&gt;
&lt;p&gt;More talks!&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/482/"&gt;Transifex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/301/"&gt;Sketching a better product&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/66/"&gt;Building A Python-Based Search Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/168/"&gt;Diversity in practice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="monday-march-12-thursday-march-15"&gt;
&lt;h2&gt;Monday March 12 - Thursday, March 15&lt;/h2&gt;
&lt;p&gt;Sprints! Nothing set in stone yet, but some ideas I've had include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Launch python.opencomparison.org for all of Python.&lt;/li&gt;
&lt;li&gt;OpenComparison integration of PyPI OpenID, SourceForge OAUTH, and BitBucket OAUTH.&lt;/li&gt;
&lt;li&gt;Improved OpenComparison integration of the Launchpad API.&lt;/li&gt;
&lt;li&gt;Implement Gitorious API for OpenComparison.&lt;/li&gt;
&lt;li&gt;Implement Text Based search for OpenComparison.&lt;/li&gt;
&lt;li&gt;Hack on Mongo related technologies such as django-mongonaut and some other planned projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: center;"&gt;&lt;a href="https://us.pycon.org/2012/"&gt;&lt;img border="0" height="102" width="277" src="http://1.bp.blogspot.com/-fa4jnLXs1so/TniyemLkoiI/AAAAAAAAAqo/LjZqklTFBXk/s400/pycon2012.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
</summary><category term="python"></category><category term="pycon"></category><category term="consumernotebook"></category><category term="django"></category></entry><entry><title>Selected for PyCon StartUp Row</title><link href="http://pydanny.com/selected-for-pycon-startup-row.html" rel="alternate"></link><updated>2012-02-21T01:00:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/selected-for-pycon-startup-row.html</id><summary type="html">&lt;p&gt;Me and Audrey have been working hard on &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt;, a Python/Django based project. We submitted it to PyCon StartUp row and found out this morning we've been accepted. &lt;strong&gt;Hooray!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From the &lt;a class="reference external" href="http://pycon.blogspot.com/2012/02/startup-row-winners-for-pycon-2012.html"&gt;PyCon StartUp Row winner's post&lt;/a&gt;, here is a little bit of what we're about:&lt;/p&gt;
&lt;blockquote class="highlights"&gt;
Have you tried researching products online recently? Search engines are gamed by scammy marketers. Product review sites overwhelm you with ads, have unreliable reviews, or dryly compare raw product specs. &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt; is working to solve this problem. It is like Yelp for products, with product comparison grids inspired by the founders' open-source work on &lt;a class="reference external" href="http://djangopackages.com"&gt;Django Packages&lt;/a&gt; and &lt;a class="reference external" href="http://opencomparison.org"&gt;Open Comparison&lt;/a&gt;.&lt;/blockquote&gt;
&lt;p&gt;Just so you know, &lt;a class="reference external" href="http://us.pycon.org"&gt;PyCon&lt;/a&gt; in North America is the biggest gathering for the international Python community. The conference this year is in Santa Clara, California, and is sold-out at 1500+ attendees, but could have easily sold out several times that number. The talks, tutorials, and events are going to be incredible, and I'm delighted to be part of the PyCon experience!&lt;/p&gt;
&lt;p&gt;We look forward to sharing the StartUp Row with friends like Transifex, Python Packages, and &lt;a class="reference external" href="http://www.weddinglovely.com/"&gt;Wedding Lovely&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please check out &lt;a class="reference external" href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt; right now and also visit our PyCon booth on Saturday, March 10th and we'll show you what we're doing.&lt;/p&gt;
</summary><category term="python"></category><category term="pycon"></category><category term="audrey"></category><category term="consumernotebook"></category><category term="django"></category></entry><entry><title>Parsing MongoDB URI</title><link href="http://pydanny.com/parsing-mongodb-uri.html" rel="alternate"></link><updated>2012-02-20T09:20:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/parsing-mongodb-uri.html</id><summary type="html">&lt;p&gt;Rather than hard-code the configuration into a Python based settings file, when using a PaaS such as Heroku you want to pick up the MongoDB URI from the system settings. Here's what I do:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# get the dynamic elements from the MongoURI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;^mongodb\:\/\/(?P&amp;lt;username&amp;gt;[_\w]+):(?P&amp;lt;password&amp;gt;[\w]+)@(?P&amp;lt;host&amp;gt;[\.\w]+):(?P&amp;lt;port&amp;gt;\d+)/(?P&amp;lt;database&amp;gt;[_\w]+)$&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mongolab_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MONGOLAB_URI&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mongolab_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupdict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;# Save the data to settings&lt;/span&gt;
&lt;span class="n"&gt;MONGO_HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;host&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;MONGO_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;port&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;MONGO_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;MONGO_DATABASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;MONGO_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Connect to MongoEngine&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;mongoengine&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;me_connect&lt;/span&gt;
&lt;span class="n"&gt;me_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;host&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;port&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</summary><category term="python"></category><category term="mongodb"></category><category term="howto"></category></entry><entry><title>django-uni-form end of life</title><link href="http://pydanny.com/django-uni-form-end-of-life.html" rel="alternate"></link><updated>2012-02-18T01:00:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/django-uni-form-end-of-life.html</id><summary type="html">&lt;p&gt;I started on django-uni-form in January 2009. In order to use &lt;a class="reference external" href="http://pinaxproject.com"&gt;Pinax&lt;/a&gt; on an internal social network for &lt;a class="reference external" href="http://www.nasa.gov"&gt;NASA&lt;/a&gt; HQ, we had to render all content, including forms, &lt;a class="reference external" href="http://django-uni-form.readthedocs.org/en/latest/concepts.html#section-508"&gt;Section 508&lt;/a&gt; compliant. Rather than rewrite the html for all 50+ forms that existed in the  Pinax 0.5.x framework at that time, I decided to minimize my work and automate things. &lt;a class="reference external" href="http://jtauber.com"&gt;James Tauber&lt;/a&gt; gave guidance and insight, my co-workers were supportive, and &lt;a class="reference external" href="http://enn.io"&gt;Jannis Leidel&lt;/a&gt; suggested the Uni-form library. The name &lt;strong&gt;Django Uni-Form&lt;/strong&gt; was obvious, and lo the project was named.&lt;/p&gt;
&lt;p&gt;Looking at the old, extremely deprecated &lt;a class="reference external" href="http://code.google.com/p/django-uni-form/"&gt;Google Code site for django-uni-form&lt;/a&gt;, I see that the first commit happened on January 7th, 2009. That was for version 0.1, with some core code that was literally a merger between the Django form example on how to integrate divs into forms and the simplest template tag I could figure out.&lt;/p&gt;
&lt;p&gt;The python code in uni_form/templatetags/uni_form.py:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.template&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Template&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.template.loader&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_template&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;


&lt;span class="n"&gt;register&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@register.filter&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_uni_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;templates/uni_form.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;form&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The template tag code was nearly exactly copy/pasted from the starter &lt;a class="reference external" href="https://docs.djangoproject.com/en/1.0/topics/forms/#looping-over-the-form-s-fields"&gt;Django docs on forms&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;form&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;    &amp;lt;div class=&amp;quot;ctrlHolder &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;field.errors&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;error&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;error&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;field.errors&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;            &amp;lt;p class=&amp;quot;errorField&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;                &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;error&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;            &amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endfor&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;field.label_tag&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;field.help_text&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;        &amp;lt;p class=&amp;quot;formHint&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;            &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;field.help_text&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;        &amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;

&lt;span class="x"&gt;    &amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endfor&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Using it was trivial, you just wrote out:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;uni_form&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;

&lt;span class="x"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;    &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;form&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;as_uni_form&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="days-of-django-uni-form"&gt;
&lt;h2&gt;Days of django-uni-form&lt;/h2&gt;
&lt;p&gt;Leading up to &lt;cite&gt;PyCon&lt;/cite&gt; 2009 James Tauber suggested some things that lead to the &lt;a class="reference external" href="http://django-uni-form.readthedocs.org/en/latest/concepts.html#form-helpers"&gt;FormHelpers&lt;/a&gt;, and we hammered out the API on IRC. We knew it crossed the rigid lines between Model-View-Template, but sometimes it's advantageous to break a few rules and abstractions in order to get better things down the road&lt;/p&gt;
&lt;p&gt;At PyCon 2009 with the mentoring of Jannis, James, and &lt;a class="reference external" href="http://twitter.com/brosner"&gt;Brian Rosner&lt;/a&gt;, I moved the project from google code to &lt;a class="reference external" href="https://github.com/pydanny/django-uni-form"&gt;Github&lt;/a&gt;. Jannis released it on &lt;a class="reference external" href="http://pypi.python.org/pypi/"&gt;PyPI&lt;/a&gt; and I followed the pattern he showed me for two years. Yeah, I learned tons under those guys.&lt;/p&gt;
&lt;p&gt;After PyCon 2009 a pull request with the &lt;a class="reference external" href="http://django-uni-form.readthedocs.org/en/latest/helpers.html#layouts"&gt;Layout&lt;/a&gt; helper was provided. It took some work to make it pass all the tests and use cases, but the end result was definition of form layout in the Python. This broke the rigid battle lines of Model-View-Template and left purists screaming in agony, but it certainly made working with forms in Django trivially easy.&lt;/p&gt;
&lt;p&gt;Lots of people started to use the project across projects like Pinax and organizations like NASA, &lt;a class="reference external" href="http://pbs.org"&gt;PBS&lt;/a&gt;, Discovery Channel, various newspapers and many others. Lots of pull requests came in and the features grew.&lt;/p&gt;
&lt;p&gt;In 2010, &lt;a class="reference external" href="http://twitter.com/arowla"&gt;Alice Rowland&lt;/a&gt; submitted the first &lt;a class="reference external" href="http://sphinx.pocoo.org/"&gt;Sphinx&lt;/a&gt; docs, and it was her work that really helped get me started on doing lots of Sphinx work.&lt;/p&gt;
&lt;p&gt;And, all the way into 2011, pull requests for Django Form Sets started to come rolling in, and almost none were of acceptable quality. They never came with documentation, tests, and almost always broke existing tests really hard. Since I'm not a huge fan of Django FormSets, I didn't want to put in a ton of effort making them work. I believe one of them was pretty good, but life was crazy busy at the time and I let it slide. Apologies to whoever it was gave me a working FormSet pull request with documentation, tests, and working code.&lt;/p&gt;
&lt;p&gt;Long periods were going by without new versions. I admit I often slow about accepting pull requests. Life was busy and reviewing the incoming code took a lot of time. Browser cross-checking, running tests, and more was really time consuming. I tried to get others to become co-leads on the project, but invariably they didn't have time to do it. Note: If someone asks you to co-lead something, respond in 24 hours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="enter-miguel-araujo"&gt;
&lt;h2&gt;Enter Miguel Araujo&lt;/h2&gt;
&lt;p&gt;After PyCon 2011, when there was some unpleasant stress in my life, I woke up cranky one morning and mouthed off on twitter to this guy who asked me to accept a pull request on django-uni-form. This guy tweeted back to me saying I ought to be nicer since I had a library people liked.&lt;/p&gt;
&lt;p&gt;He was right.&lt;/p&gt;
&lt;p&gt;I apologized to the guy (&lt;a class="reference external" href="http://twitter.com/maraujop"&gt;Miguel Araujo&lt;/a&gt;) and remembered my manners. Over the next couple of months we chatted via Twitter and Github's messaging system. He was smart, trustworthy, and passionate about everything he did. I knew I had found my co-lead. He responded promptly and I gave him commit rights.&lt;/p&gt;
&lt;p&gt;Working together (with him doing the vast majority of the work), we moved the project into new releases. The architecture and design changed, driven by discussions we had together. The code was cleaned up, gnarly bits in there to support old versions of Python and Django kicked out, and the documentation revised. The project had new life!&lt;/p&gt;
&lt;p&gt;The only blip I saw with Miguel is my own fault of sometimes being too nice as a project leader when it comes to accepting pull requests. &lt;a class="reference external" href="http://django-uni-form.readthedocs.org/en/latest/contributing.html#how-to-get-your-pull-request-accepted"&gt;I believe pull requests should be really atomic&lt;/a&gt; - for one thing and one thing only with support tests and documentation. Otherwise it becomes nigh impossible to incorporate them and these days I reject multi-purpose pull requests.  One pull request in particular took a huge amount of debate and discussion to work in. I think after that Miguel is much better at being upfront at the beginning about rejecting pull requests with giant scopes.&lt;/p&gt;
&lt;p&gt;During all this I asked Miguel to take over the project, he accepted, and &lt;a class="reference external" href="http://pydanny.blogspot.com/2011/06/announcing-django-uni-form-080-beta.html"&gt;I even blogged my announcement his role as project leader&lt;/a&gt;. Miguel is indeed very nice and after that fact he asked me to remain on board as co-lead.&lt;/p&gt;
&lt;p&gt;We finally met in September of 2011 and co-presented on &lt;a class="reference external" href="http://www.slideshare.net/pydanny/advanced-django-forms-usage"&gt;Advanced Django Form Usage at DjangoCon 2011&lt;/a&gt;. The deepest technical material we presented was authored by Miguel. During our research he uncovered at least one bug in Django and got an ancient bug closed. It was a great experience and I hope he'll co-present with me in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="django-uni-form-is-dead-long-live-django-crispy-forms"&gt;
&lt;h2&gt;django-uni-form is dead, long live django-crispy-forms&lt;/h2&gt;
&lt;p&gt;The upside of django-uni-form is that it grew in features organically thanks to my own needs and general community effort. The downside of django-uni-form is that it grew in features organically thanks to my own needs and general community effort. In any long running project there is cruft and weird patterns that start to hurt after a while. django-uni-form was no different.&lt;/p&gt;
&lt;p&gt;So I'm making this absolutely official as of now. &lt;strong&gt;django-uni-form is at it's end of life&lt;/strong&gt;. It's done and kaput. No more pull requests will be accepted and the issue tracker will be turned off shortly. Just so no one is mistaken:&lt;/p&gt;
&lt;blockquote&gt;
&lt;strong&gt;django-uni-form is deprecated. Use django-crispy-forms&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;Miguel asked if he could start the project anew, under a different name. We both had been uncomfortable with the name &lt;em&gt;django-uni-form&lt;/em&gt; for some time, especially since it had almost nothing to do with Uni-form anymore. In fact, I often using template overrides to avoid the Uni-form HTML layout - the most common alternative being &lt;a class="reference external" href="http://twitter.github.com/bootstrap/"&gt;Twitter Bootstrap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We tossed around names for the project, but all of them were stupid, especially mine. We are both huge fans and users of &lt;a class="reference external" href="https://github.com/brutasse/django-floppyforms"&gt;django-floppyforms&lt;/a&gt; (HTML5 form widget app), so my fiancee, &lt;a class="reference external" href="http://audreymroy.com"&gt;Audrey Roy&lt;/a&gt;, suggested django-crispy-forms. And lo, the project was named.&lt;/p&gt;
&lt;p&gt;Right now &lt;a class="reference external" href="https://github.com/maraujop/django-crispy-forms"&gt;django-crispy-forms&lt;/a&gt; has an improved API, better performance, and supports both Twitter bootstrap forms 2.0 and UniForm. Adding new form layouts will be easier, and feature controls will be better.&lt;/p&gt;
&lt;p&gt;What you should be using now is &lt;a class="reference external" href="https://github.com/maraujop/django-crispy-forms"&gt;django-crispy-forms&lt;/a&gt;. Don't worry about changing over as there are &lt;a class="reference external" href="http://django-crispy-forms.readthedocs.org/en/d-0/migration.html"&gt;migration instructions&lt;/a&gt; on the &lt;a class="reference external" href="http://django-crispy-forms.readthedocs.org/"&gt;excellent documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Try it. You'll like it. :-)&lt;/p&gt;
&lt;/div&gt;
</summary><category term="django"></category><category term="python"></category></entry><entry><title>Two years ago today</title><link href="http://pydanny.com/two-years-ago-today.html" rel="alternate"></link><updated>2012-02-17T09:20:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/two-years-ago-today.html</id><summary type="html">&lt;p&gt;The &lt;a class="reference external" href="http://us.pycon.org"&gt;PyCon&lt;/a&gt; tutorial on Django in Depth was ending. I had been sitting next to my friend &lt;a class="reference external" href="http://djangrrl.com/"&gt;Barbara&lt;/a&gt; and we got up to go when I heard a feminine voice ask: &amp;quot;Are you &lt;a class="reference external" href="https://twitter.com/bshaurette"&gt;bshaurette&lt;/a&gt;?&amp;quot; I turned and it was like I got punched in the gut.&lt;/p&gt;
&lt;p&gt;It was the first time I met &lt;a class="reference external" href="http://audreymroy.com"&gt;Audrey&lt;/a&gt;. I remember every detail of how she looked at that moment. The clothes she was wearing, the part in her hair, that her eyes met mine, and that they didn't turn away. I was immediately captivating, but fortunately remembered to act like a gentleman. I tossed in a casual invitation to her to join us for lunch, which I pulled off even though my heart was pounding. Thankfully she accepted.&lt;/p&gt;
&lt;p&gt;Life has been pretty much awesome ever since.&lt;/p&gt;
&lt;p&gt;That was the day I met the love of my life.&lt;/p&gt;
</summary><category term="pycon"></category><category term="audrey"></category></entry><entry><title>My new blog</title><link href="http://pydanny.com/my-new-blog.html" rel="alternate"></link><updated>2012-02-17T00:30:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/my-new-blog.html</id><summary type="html">&lt;p&gt;What I did to get it running:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pip install pelican
git clone git://github.com/pydanny/pydanny.github.com.git
&lt;/pre&gt;
&lt;p&gt;My settings.py file:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
AUTHOR = 'Daniel Greenfeld'
DISQUS_SITENAME = 'pydanny'
GITHUB_URL = 'https://github.com/pydanny'
GOOGLE_ANALYTICS='UA-18066389-2'
SITEURL = 'http://pydanny.github.com'
SITENAME = 'pydanny'
SOCIAL = (('twitter', 'http://twitter.com/pydanny'),
          ('github', 'https://github.com/pydanny'),
          ('facebook', 'http://www.facebook.com/daniel.greenfeld'),)
TAG_FEED = 'feeds/%s.atom.xml'
THEME='notmyidea'
TWITTER_USERNAME = 'pydanny'
&lt;/pre&gt;
&lt;p&gt;How I push up entries and pages and themes:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pelican . -o . -s settings.py
git commit -am &amp;quot;blogging here&amp;quot;
git push
&lt;/pre&gt;
&lt;div class="section" id="results"&gt;
&lt;h2&gt;Results!&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://pydanny.github.com"&gt;http://pydanny.github.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</summary><category term="python"></category><category term="blog"></category></entry><entry><title>Tried out Jekyll</title><link href="http://pydanny.com/tried-out-jekyll.html" rel="alternate"></link><updated>2012-02-09T10:20:00Z</updated><author><name>Daniel-Greenfeld</name></author><id>http://pydanny.com/tried-out-jekyll.html</id><summary type="html">&lt;div class="section" id="why-jekyll"&gt;
&lt;h2&gt;Why Jekyll?&lt;/h2&gt;
&lt;p&gt;I've had issues with Blogger for some time.  After my fiancee, Audrey Roy, moved her blog to &lt;a class="reference external" href="https://github.com/mojombo/jekyll"&gt;https://github.com/mojombo/jekyll&lt;/a&gt;, I was impressed enough to give it a try.&lt;/p&gt;
&lt;p&gt;Why did it impress me?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="code-highlighting-made-easy"&gt;
&lt;h2&gt;Code highlighting made easy&lt;/h2&gt;
&lt;p&gt;I don't have to hand-craft HTML code to get google prettify in a post. I just stick in a simple macro of 'highlight python' called like a Django templatetag and I get:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Daniel Greenfeld&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This issue alone sums up why I don't do more blog posts with code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="i-don-t-want-to-maintain-my-own-blog-site"&gt;
&lt;h2&gt;I don't want to maintain my own blog site&lt;/h2&gt;
&lt;p&gt;A couple times I rolled out a blog on a site I stood up, but didn't really feel like maintaining a site. I want someone else to do it. When I write, I want someone else to worry about the details. I want to focus on writing and nothing else.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="i-want-to-be-able-to-write-without-connection"&gt;
&lt;h2&gt;I want to be able to write without connection&lt;/h2&gt;
&lt;p&gt;I need an internet connection to get my blogger posts to format right. With Jekyll, I can just type away.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ability-to-publish-via-git"&gt;
&lt;h2&gt;Ability to publish via git&lt;/h2&gt;
&lt;p&gt;My &lt;a class="reference external" href="http://pydanny-event-notes.rtfd.org"&gt;http://pydanny-event-notes.rtfd.org&lt;/a&gt; has really exploded in my own usage and continued because it uses the same patterns I use in software development. I'm used to the pattern of using Git to push up content, so why use naked HTML? Sure, there are RST-to-HTML processors that I could use to generate that HTML, but they always require an some amount of manual correction. Jekyll, and it's alternatives,let me just write.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="why-not-jekyll"&gt;
&lt;h2&gt;Why not Jekyll?&lt;/h2&gt;
&lt;p&gt;Jekyll is written in &lt;a class="reference external" href="http://ruby-lang.org"&gt;ruby&lt;/a&gt;. Nothing against ruby, but I can't trivially work in that language the way I can in Python. It's good to eat your own dogfood.&lt;/p&gt;
&lt;p&gt;So I started looking at &lt;a class="reference external" href="http://hyde.github.com/"&gt;hyde&lt;/a&gt;, &lt;a class="reference external" href="http://blogofile.com/"&gt;blogofile&lt;/a&gt;, and &lt;a class="reference external" href="http://pelican.readthedocs.org/"&gt;pelican&lt;/a&gt; as alternatives. More on that later.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="ruby"></category><category term="blog"></category></entry></feed>
