<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Kenneth Reitz</title><link href="http://www.kennethreitz.com" rel="alternate"></link><link href="http://www.kennethreitz.com/feeds/all.atom.xml" rel="self"></link><id>http://www.kennethreitz.com</id><updated>2012-05-14T10:00:00Z</updated><entry><title>Be Cordial or Be on Your Way</title><link href="http://www.kennethreitz.com/be-cordial-or-be-on-your-way.html" rel="alternate"></link><updated>2012-05-14T10:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2012-05-14:/be-cordial-or-be-on-your-way.html/</id><summary type="html">&lt;p&gt;Contributing to Open Source can be stressful.&lt;/p&gt;
&lt;p&gt;By opening a Pull Request to a popular project, you're inviting the maintainers and all of their users to analyze and scrutinize your code. Often, they will.&lt;/p&gt;
&lt;p&gt;Most of the time, the maintainers of the projects do their best to be kind. If they have feedback or criticism, it's generally positive. Unfortunately, this isn't always the case.&lt;/p&gt;
&lt;p&gt;Every once in while, maintainers and community members will shun and insult a contributor's work. This is a perfect example of what you should &lt;strong&gt;never&lt;/strong&gt; do.&lt;/p&gt;
&lt;p&gt;What if the Pull Request in question was the person's first time ever contributing to a project? They could be scared away from the world of open source forever.&lt;/p&gt;
&lt;p&gt;Instead of simply yelling at a potential contributor and causing a mess of negativity and stress; the maintainer should take the opportunity to educate the user. They should point the user to a guide that outlines what the proper protocol for his project is.&lt;/p&gt;
&lt;p&gt;As a project maintainer, it's &lt;em&gt;extremely&lt;/em&gt; important to be respectful to your contributors. They often take what you say very personally.&lt;/p&gt;
&lt;div class="section" id="publishing-open-source"&gt;
&lt;h2&gt;Publishing Open Source&lt;/h2&gt;
&lt;p&gt;I don't handle stress and negativity well at all. I almost instantly get a terrible headache, have difficulty concentrating, lose my appetite, and my general quality of life degrades almost immediately.&lt;/p&gt;
&lt;p&gt;There's a difference between being stressed and being in a stressful situation. One can be caught in a tremendously stressful situation and not be stressed at all with the right mixture of perspective and empathy.&lt;/p&gt;
&lt;p&gt;By publishing your code (or anything, really) on the open internet, you're inviting the whole world to analyze and scrutinize it, line by line. That takes guts. People may love it, hate it, disagree with your general approach, or be convinced that you're doing their community a huge disservice. That can be stressful.&lt;/p&gt;
&lt;p&gt;Don't worry about non-constructive feedback. It serves no purpose. Realize that some people just take things &lt;em&gt;way&lt;/em&gt; too seriously. Tell them to be on their way.&lt;/p&gt;
&lt;blockquote class="epigraph"&gt;
&lt;p&gt;Listen to everyone, then disregard it.&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;311&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="reflect"&gt;
&lt;h2&gt;Reflect&lt;/h2&gt;
&lt;p&gt;Take some time to reflect. Remember why you're doing this in the first place. I write open source software because I &lt;em&gt;love&lt;/em&gt; software and want to help make my world a better place.&lt;/p&gt;
&lt;p&gt;Why are you? If you don't have answer, maybe you shouldn't be doing it. If you find yourself maintaining a project purely out of obligation, maybe you should be &lt;a class="reference external" href="http://geemus.com/blog/2011/11/27/less-is-more"&gt;doing less&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Don't be &lt;a class="reference external" href="http://jacobian.org/writing/assholes/"&gt;an asshole&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Make your contributors &lt;a class="reference external" href="http://news.ycombinator.com/item?id=3786590"&gt;feel welcome and appreciated&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Always say &lt;a class="reference external" href="http://www.amazon.com/gp/product/B007MXAZBW/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B007MXAZBW"&gt;thank you&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before you tweet, comment on a pull request, or comment publically about a project, remember that it's often not a peice of code you're critiquing — it's a human being.&lt;/p&gt;
&lt;p&gt;I don't have the energy or patience for non-constructive feedback. Be cordial and positive or be on your way.&lt;/p&gt;
&lt;img alt="http://cl.ly/240j1a2k1U3R3W3V2707/Screen%20Shot%202012-05-14%20at%203.43.08%20PM.png" src="http://cl.ly/240j1a2k1U3R3W3V2707/Screen%20Shot%202012-05-14%20at%203.43.08%20PM.png" /&gt;
&lt;/div&gt;
</summary></entry><entry><title>Repository Structure and Python</title><link href="http://www.kennethreitz.com/repository-structure-and-python.html" rel="alternate"></link><updated>2012-04-16T21:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2012-04-16:/repository-structure-and-python.html/</id><summary type="html">&lt;p&gt;This opinionated guide was written for my best-practices guide, &lt;a class="reference external" href="http://python-guide.org"&gt;The Hitchhiker's Guide to Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is based on the recommendations of the Distribute project, personal experience, and good intentions.&lt;/p&gt;
&lt;div class="section" id="it-s-important"&gt;
&lt;h2&gt;It's Important.&lt;/h2&gt;
&lt;p&gt;Just as Code Style, API Design, and Automation are essential for a healthy development cycle, Repository structure is a crucial part of your project's &lt;a class="reference external" href="http://www.amazon.com/gp/product/1257638017/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1257638017"&gt;architecture&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When a potential user or contributor lands on your repository's page, they see a few things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Project Name&lt;/li&gt;
&lt;li&gt;Project Description&lt;/li&gt;
&lt;li&gt;Bunch O' Files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only when they scroll below the fold will the user see your project's README.&lt;/p&gt;
&lt;p&gt;If your repo is a massive dump of files or a nested mess of directories, they might look elsewhere before even reading your beautiful documentation.&lt;/p&gt;
&lt;blockquote&gt;
Dress for the job you want, not the job you have.&lt;/blockquote&gt;
&lt;p&gt;Of course, first impressions aren't everything. You and your colleagues will spend countless hours working with this repository, eventually becoming intimately familiar with every nook and cranny. The layout of it is important.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sample-repository"&gt;
&lt;h2&gt;Sample Repository&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;: This is what I recommend.&lt;/p&gt;
&lt;p&gt;This repository is &lt;a class="reference external" href="https://github.com/kennethreitz/samplemod"&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
README.rst
LICENSE
setup.py
requirements.txt
sample/__init__.py
sample/core.py
sample/helpers.py
docs/conf.py
docs/index.rst
tests/test_basic.py
tests/test_advanced.py
&lt;/pre&gt;
&lt;p&gt;Let's get into some specifics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-actual-module"&gt;
&lt;h2&gt;The Actual Module&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="19%" /&gt;
&lt;col width="5%" /&gt;
&lt;col width="76%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;./sample/&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;./sample.py&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;The code of interest.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Your module package is the core focus of the repository. It should not be tucked away:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
./sample/
&lt;/pre&gt;
&lt;p&gt;If your module consists of only a single file, you can place it directly in the root of your repository:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
./sample.py
&lt;/pre&gt;
&lt;p&gt;Your library does not belong in an ambiguous &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;python&lt;/tt&gt; subdirectory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="license"&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="26%" /&gt;
&lt;col width="6%" /&gt;
&lt;col width="68%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;./LICENSE&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Lawyering up.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is arguably the most important part of your repository, aside from the source code itself.
The full license text and copyright claims should exist in this file.&lt;/p&gt;
&lt;p&gt;No excuses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="setup-py"&gt;
&lt;h2&gt;Setup.py&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="17%" /&gt;
&lt;col width="4%" /&gt;
&lt;col width="78%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;./setup.py&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Package and distribution management.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If your module package is at the root of your repository, this should obviously be at the root as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="requirements-file"&gt;
&lt;h2&gt;Requirements File&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="22%" /&gt;
&lt;col width="5%" /&gt;
&lt;col width="73%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;./requirements.txt&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Development dependencies.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A &lt;a class="reference external" href="http://www.pip-installer.org/en/latest/requirements.html"&gt;Pip requirements file&lt;/a&gt;
should be placed at the root of the repository. It should specify the dependencies required to contribute to the project: testing, building, and generating documentation.&lt;/p&gt;
&lt;p&gt;If your project has no development dependencies, or you prefer development environment setup via &lt;tt class="docutils literal"&gt;setup.py&lt;/tt&gt;, this file may be unnecessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation"&gt;
&lt;h2&gt;Documentation&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="18%" /&gt;
&lt;col width="5%" /&gt;
&lt;col width="77%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;./docs/&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Package reference documentation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;There is little reason for this to exist elsewhere.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="test-suite"&gt;
&lt;h2&gt;Test Suite&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="18%" /&gt;
&lt;col width="4%" /&gt;
&lt;col width="78%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;./test_sample.py&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;./tests&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Package integration and unit tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Starting out, a small test suite will often exist in a single file:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
./test_sample.py
&lt;/pre&gt;
&lt;p&gt;Once a test suite grows, you can move your tests to a directory, like so:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
tests/test_basic.py
tests/test_advanced.py
&lt;/pre&gt;
&lt;p&gt;Obviously, these test modules must import your packaged module to test it. You can do this a few ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Expect the package to be installed in site-packages.&lt;/li&gt;
&lt;li&gt;Use a simple (but &lt;em&gt;explicit&lt;/em&gt;) path modification to resolve the package properly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I highly recommend the latter. Requiring a developer to run &lt;tt class="docutils literal"&gt;setup.py develop&lt;/tt&gt; to test an actively changing codebase also requires them to have an isolated environment setup for each instance of the codebase.&lt;/p&gt;
&lt;p&gt;To give the individual tests import context, create a &lt;tt class="docutils literal"&gt;tests/context.py&lt;/tt&gt; file:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import os
import sys
sys.path.insert(0, os.path.abspath('..'))

import sample
&lt;/pre&gt;
&lt;p&gt;Then, within the individual test modules, import the module like so:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
from .context import sample
&lt;/pre&gt;
&lt;p&gt;This will always work as expected, regardless of installation method.&lt;/p&gt;
&lt;p&gt;Some people will assert that you should distribute your tests within your module itself — I disagree. It often increases complexity for your users; many test suites often require additional dependencies and runtime contexts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="makefile"&gt;
&lt;h2&gt;Makefile&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="22%" /&gt;
&lt;col width="6%" /&gt;
&lt;col width="72%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;./Makefile&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Generic management tasks.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you look at most of my projects or any Pocoo project, you'll notice a &lt;tt class="docutils literal"&gt;Makefile&lt;/tt&gt; laying around. Why? These projects aren't written in C... In short, &lt;tt class="docutils literal"&gt;make&lt;/tt&gt; is a incredibly useful tool for defining generic and platform agnostic tasks for your project.&lt;/p&gt;
&lt;p&gt;Sample &lt;tt class="docutils literal"&gt;Makefile&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
init:
    pip install -r requirements.txt

test:
    nosetests tests
&lt;/pre&gt;
&lt;p&gt;Other generic management scripts (e.g. &lt;tt class="docutils literal"&gt;manage.py&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;fabfile.py&lt;/tt&gt;) belong at the root of the repository as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="regarding-django-applications"&gt;
&lt;h2&gt;Regarding Django Applications&lt;/h2&gt;
&lt;p&gt;I've noticed a new trend in Django applications since the release of Django 1.4. Many developers are structuring their repositories poorly due to the new bundled application templates.&lt;/p&gt;
&lt;p&gt;How? Well, they go to their bare and fresh repository and run the following, as they always have:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ django-admin.py start-project samplesite
&lt;/pre&gt;
&lt;p&gt;The resulting repository structure looks like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
README.rst
samplesite/manage.py
samplesite/samplesite/settings.py
samplesite/samplesite/wsgi.py
samplesite/samplesite/sampleapp/models.py
&lt;/pre&gt;
&lt;p&gt;Don't do this.&lt;/p&gt;
&lt;p&gt;Repetitive paths are confusing for both your tools and your developers. Unnecessary nesting doesn't help anybody (unless they're nostalgic for monolithic SVN repos).&lt;/p&gt;
&lt;p&gt;Let's do it properly:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ django-admin.py start-project samplesite .
&lt;/pre&gt;
&lt;p&gt;Note the &amp;quot;&lt;tt class="docutils literal"&gt;.&lt;/tt&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;The resulting structure:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
README.rst
manage.py
samplesite/settings.py
samplesite/wsgi.py
samplesite/sampleapp/models.py
&lt;/pre&gt;
&lt;p&gt;Much better.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>The Future of Python HTTP</title><link href="http://www.kennethreitz.com/the-future-of-python-http.html" rel="alternate"></link><updated>2012-04-02T12:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2012-04-02:/the-future-of-python-http.html/</id><summary type="html">&lt;p&gt;I like to think &lt;a class="reference external" href="http://python-requests.org"&gt;Requests&lt;/a&gt; is mostly analogous to
&lt;a class="reference external" href="http://werkzeug.pocoo.org/"&gt;Werkzeug&lt;/a&gt; in terms of purpose, functionality,
and goals. One is for servers while the other is for clients.&lt;/p&gt;
&lt;p&gt;Werkzeug and Flask were &lt;em&gt;huge&lt;/em&gt; inspirations for Requests' design. As a matter of fact, Requests
&lt;a class="reference external" href="https://github.com/kennethreitz/requests/blob/develop/requests/utils.py#L99"&gt;contains&lt;/a&gt;
a decent bit of Werkzeug's internal data structures.&lt;/p&gt;
&lt;p&gt;So, why are they separate projects?&lt;/p&gt;
&lt;div class="section" id="brainstorming"&gt;
&lt;h2&gt;Brainstorming&lt;/h2&gt;
&lt;p&gt;At PyCon 2012 a few weeks ago, Andrey Petrov, Armin Ronacher, Paul McMillan, and myself got
into a room for a brainstorming session around the possibility of formally combining our efforts.&lt;/p&gt;
&lt;p&gt;My expectations going in weren't that high, but that quickly changed once we were
all in the same room. We discussed the general state of Python HTTP, security concerns,
&lt;a class="reference external" href="http://www.amazon.com/gp/product/0596529554/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0596529554"&gt;distributed services&lt;/a&gt;, and web application testing.&lt;/p&gt;
&lt;p&gt;Today, making &lt;em&gt;real&lt;/em&gt; HTTP Requests to an in-process WSGI app with a &lt;em&gt;real&lt;/em&gt; HTTP client is not simple.
Can you imagine writing &lt;em&gt;real&lt;/em&gt; OAuth tests for your application with the same HTTP consumer
your clients will use?&lt;/p&gt;
&lt;p&gt;The root of the problem is that WSGI doesn't map &lt;tt class="docutils literal"&gt;1:1&lt;/tt&gt; to HTTP.&lt;/p&gt;
&lt;p&gt;So, instead of taking the WebOb approach of using WSGI as the common protocol between services,
why not use HTTP itself? The rest of the world uses HTTP as the most-common denominator after all.&lt;/p&gt;
&lt;p&gt;After a few hours, we drafted up a solid plan:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Consolidate shared code between Requests and Werkzeug into a new &lt;tt class="docutils literal"&gt;httpcore&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;Move WSGI-specific Werkzeug code into a new &lt;tt class="docutils literal"&gt;wsgicore&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;Make HTTP (vs WSGI) the common protocol between services.&lt;/li&gt;
&lt;li&gt;Provide a transport adapter mechanism for mocking and emulating HTTP services.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="the-architecture"&gt;
&lt;h2&gt;The Architecture&lt;/h2&gt;
&lt;p&gt;Requests, Flask, and Werkzeug will remain the same to the end user.&lt;/p&gt;
&lt;p&gt;Behind the scenes, the same functions used to generate a request will be used to consume it.
For example, stream handling, header parsing, and form-encoding will all be synchronous functions
from &lt;tt class="docutils literal"&gt;httpcore&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="figure align-center"&gt;
&lt;img alt="http://cl.ly/1n0M093z3l0Z390u1121/Screen%20Shot%202012-04-02%20at%202.05.29%20AM.png" src="http://cl.ly/1n0M093z3l0Z390u1121/Screen%20Shot%202012-04-02%20at%202.05.29%20AM.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="adapters"&gt;
&lt;h3&gt;Adapters&lt;/h3&gt;
&lt;p&gt;Transport Adapters will provide a mechanism to define interaction methods for an &amp;quot;HTTP&amp;quot; service.
They will allow you to fully mock a web service to fit your needs.&lt;/p&gt;
&lt;p&gt;Gloriously simplified example (implementation subject to change):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class DistributedAdapter(BaseAdapter):
    def __init__(self):
        self.connect_pool = …

    def send(self, request):
        &amp;quot;&amp;quot;&amp;quot;Takes a Request object, returns a Response object.&amp;quot;&amp;quot;&amp;quot;
        # Whatever needs to happen here.
        …
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="httpcore"&gt;
&lt;h3&gt;HTTPCore&lt;/h3&gt;
&lt;p&gt;HTTPCore will be comprised of the code currently shared by Requests and Werkzeug,
general HTTP utilities, and base objects / data structures.&lt;/p&gt;
&lt;p&gt;Specifically, it will provide:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Request and Response objects&lt;/li&gt;
&lt;li&gt;General HTTP Utilities&lt;/li&gt;
&lt;li&gt;Common Data Structures (&lt;tt class="docutils literal"&gt;MultiDict&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;CaseInsensitiveDict&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;Common Data Structure Utilities (&lt;tt class="docutils literal"&gt;merge_kwargs&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;Stream Handling (&lt;tt class="docutils literal"&gt;make_line_iter&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;make_chunk_iter&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;HTTP Parsing (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;http-parser&lt;/span&gt;&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;URI/IRI Parsing and Handling Functions (&lt;tt class="docutils literal"&gt;uricore&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;SSL Utilities&lt;/li&gt;
&lt;li&gt;Cookie Handling&lt;/li&gt;
&lt;li&gt;Base &lt;tt class="docutils literal"&gt;TransportAdapter&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="wsgicore"&gt;
&lt;h3&gt;WSGICore&lt;/h3&gt;
&lt;p&gt;WSGICore will extend the framework that HTTPCore provides to be used by WSGI applications.
It will replace the WSGI-specific parts of Werkzeug:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Request and Response objects&lt;/li&gt;
&lt;li&gt;WSGI Transport Adapter (&lt;tt class="docutils literal"&gt;HTTP &lt;span class="pre"&gt;&amp;lt;-&amp;gt;&lt;/span&gt; WSGI&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;WSGI Utility Functions&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;Distributed Services&lt;/h2&gt;
&lt;p&gt;In addition to testing web applications, this new Adapter system will provide a
fantastic mechanism for distributed services.&lt;/p&gt;
&lt;p&gt;In Requests, you'll be able to &lt;em&gt;mount&lt;/em&gt; external services to the routing mechanism
by &lt;em&gt;mocking&lt;/em&gt; HTTP. To Requests, it'll be an &lt;a class="reference external" href="http://www.amazon.com/gp/product/B0043D2ED6/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B0043D2ED6"&gt;HTTP Service&lt;/a&gt;, but in reality the
service could be anything: a random number generator, ZeroMQ socket, proxy,
WSGI application, &lt;em&gt;&amp;amp;c&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Here's some theoretical example code:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import requests

from webscale import DevNullAdpater
from wsgicore.adapters import WsgiAdapter
from haystackapp.core import app as haystack

s = requests.session()
s.mount('null:', DevNullAdapter())
s.mount('http://haystack', WsgiAdapter(app=haystack))

# Make a request via DevNullAdapter
r = s.get('null://someurl')

# Make a request via Haystack WSGI App
r = s.get('http://haystack/index')

# Make a request via standard HTTPS
r = s.get('https://github.com/')
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="long-term-advantages"&gt;
&lt;h2&gt;Long-term Advantages&lt;/h2&gt;
&lt;p&gt;There's a number of advantages to this design and approach in the future:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Requests will be able to use the same cache backends for &lt;em&gt;HTTP Requests&lt;/em&gt; that Flask/Werkzeug does for &lt;em&gt;views&lt;/em&gt;. They will be moved to &lt;tt class="docutils literal"&gt;cachecore&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Security enhancements (e.g. &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions"&gt;DNSSEC&lt;/a&gt;) can live in &lt;tt class="docutils literal"&gt;httpcore&lt;/tt&gt; rather than waiting for a PEP or standard library implementation.&lt;/li&gt;
&lt;li&gt;Django could potentially utilize the security features provided by &lt;tt class="docutils literal"&gt;httpcore&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Django/Flask could potentially use Requests as their respective official test clients.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="development"&gt;
&lt;h2&gt;Development&lt;/h2&gt;
&lt;p&gt;If you have thoughts to share, feel free to discuss this with us on Freenode at &lt;tt class="docutils literal"&gt;#cores&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;There's little code to show at the moment, but you can track the development over on GitHub:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/core"&gt;https://github.com/core&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Xcode, GCC, and Homebrew</title><link href="http://www.kennethreitz.com/xcode-gcc-and-homebrew.html" rel="alternate"></link><updated>2012-02-16T10:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2012-02-16:/xcode-gcc-and-homebrew.html/</id><summary type="html">&lt;p&gt;Several months ago, I got fed up with having to download Xcode to build my software.
I took the Xcode installer, ripped out all of the parts I didn't need, and made a nice
installer for GCC. It ended up being ~200MB in size. It took 2 minutes to download.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/kennethreitz/osx-gcc-installer/"&gt;OSX-GCC-Installer&lt;/a&gt; was born. Perfect.&lt;/p&gt;
&lt;p&gt;Unfortunately, I couldn't include the 10.6/7 SDKs due to &lt;a class="reference external" href="http://www.amazon.com/gp/product/0596517963/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0596517963"&gt;licensing restrictions&lt;/a&gt;.
These SDKs include CoreAudio, CoreData, OpenGL, and more. Most software that isn't build
specifically for OSX would build perfectly. Unfortunately, some software added some
needless system dependencies, though (I'm looking at you, Node).&lt;/p&gt;
&lt;p&gt;I stuck it up on GitHub, and much to my delight, it became a pretty big hit.
It solved a lot of headaches for a lot of people.&lt;/p&gt;
&lt;p&gt;Today, the project has 1649 watchers on GitHub and has been downloaded 53,400 times.
That's &lt;strong&gt;13.7 Terabytes&lt;/strong&gt; of transfer. Thanks, GitHub, for the
generous hosting.&lt;/p&gt;
&lt;p&gt;Homebrew did their best to support the project, but the official stance was &amp;quot;if
you buy a Mac, you buy the whole package&amp;quot;, pointing everyone to install full Xcode
if they had any problems. Far from ideal, but I was content.&lt;/p&gt;
&lt;div class="section" id="apple-s-interest"&gt;
&lt;h2&gt;Apple's Interest&lt;/h2&gt;
&lt;p&gt;Meanwhile, Apple reached out to me to discuss some details about OSX-GCC-Installer.
They took an interest in shipping something official, but they weren't sure of the proper
approach to take to support projects like Homebrew.&lt;/p&gt;
&lt;p&gt;I hopped on the phone, explained the specific needs of Homebrew, the restrictions
with the proprietary headers and licensing, and what the ideal situation would be.&lt;/p&gt;
&lt;p&gt;Months passed and I didn't hear anything. Until today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="command-line-tools-for-xcode"&gt;
&lt;h2&gt;Command Line Tools for Xcode&lt;/h2&gt;
&lt;p&gt;Today, Apple added a beautiful new package to their official developer tools suite:
&lt;strong&gt;Command Line Tools for Xcode&lt;/strong&gt;. It's a 171 MB download that includes all of the
tools a Homebrew should ever need. Best of all, it contains the proprietary
headers that I couldn't ship myself.&lt;/p&gt;
&lt;p&gt;You can &lt;a class="reference external" href="http://developer.apple.com/downloads"&gt;download and try it out&lt;/a&gt; today.
All you need is a free Apple ID.&lt;/p&gt;
&lt;p&gt;You'll want to uninstall Xcode first:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ sudo /Developer/Library/uninstall-devtools --mode=all
&lt;/pre&gt;
&lt;p&gt;Major props to Apple for making this happen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-future"&gt;
&lt;h2&gt;The Future&lt;/h2&gt;
&lt;p&gt;This is an incredible day for the Homebrew community.
You can now setup a complete OS X develop environment with a single 171.7 MB package download.
It's official. It's legal. It'll be maintained.&lt;/p&gt;
&lt;p&gt;Homebrew is going to officially support the package too.&lt;/p&gt;
&lt;p&gt;Max Howell:&lt;/p&gt;
&lt;blockquote&gt;
To stave off further questions, yes, you can use the &amp;quot;Command Line Tools for Xcode&amp;quot; package with Homebrew. And we will support it.&lt;/blockquote&gt;
&lt;p&gt;Mike McQuaid:&lt;/p&gt;
&lt;blockquote&gt;
We will recommend you don't use Xcode from the App Store but instead the command-line-tools package (which can also be installed from inside of Xcode and lives happily alongside it).&lt;/blockquote&gt;
&lt;p&gt;Open source is incredible.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>How I Develop Things and Why</title><link href="http://www.kennethreitz.com/how-i-develop-things-and-why.html" rel="alternate"></link><updated>2012-01-27T10:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2012-01-27:/how-i-develop-things-and-why.html/</id><summary type="html">&lt;p&gt;I've always considered myself a bit of a software junkie. Nothing excites me more than a great piece of new software.&lt;/p&gt;
&lt;p&gt;Some of my best childhood memories are our trips to Grandma's house, where I'd have access to a computer with a dial-up connection that I'd use to obtain freeware and shareware.
I'd bring 4 or 5 floppies with me and try to cram all the games, waveform editors, and utilities that I could sneaker-net home.&lt;/p&gt;
&lt;p&gt;Luckily today, excellent software written with passion oozes out of the app ecosystem. OS X and the App Store really fuel an economy of software built for humans by people that care.&lt;/p&gt;
&lt;p&gt;Unfortunately, this doesn't always hold true in developer software — text editors, modules, libraries, toolchains, &amp;amp;c. We are forced to deal with APIs on a daily basis that were not built with the user in mind. Over-engineering surrounds us as developers. Things that should be simple are often &lt;a class="reference external" href="http://www.amazon.com/gp/product/059651798X/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=059651798X"&gt;needlessly complex&lt;/a&gt; for the sake of being complex and &amp;quot;proper&amp;quot;.&lt;/p&gt;
&lt;p&gt;Why should consumer apps and developer APIs be treated differently?&lt;/p&gt;
&lt;div class="section" id="have-an-issue"&gt;
&lt;h2&gt;Have an Issue&lt;/h2&gt;
&lt;p&gt;The first step to developing something great is to have a real problem. You can't solve a problem properly if you don't experience it firsthand.&lt;/p&gt;
&lt;p&gt;On the consumer app side of things, a great example of this is Microsoft OneNote. Have you used OneNote? It's incredible.&lt;/p&gt;
&lt;p&gt;Essentially, OneNote is a hierarchical freeform note-taking software that assumes nothing: you can type, use handwriting, embed files, cross-link notes, sync them online, &lt;em&gt;&amp;amp;c&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately, OneNote is only available on Windows. This kills me. I would love to think that Microsoft's would port this lovely peice of software to OS X, but I doubt it will ever happen.&lt;/p&gt;
&lt;p&gt;If I ever decide to actually ship a consumer product, it will be something akin to OneNote for OS X. It would be incredible. It may not be for many, but for people that resonate with my problem, it will work wonderfully. It would be a reaction to a real problem, not an engineered app an entrepreneur thinks will fill a gap so he can make some fast cash.&lt;/p&gt;
&lt;p&gt;GitHub wasn't built for the developer community at large; the founders built GitHub for themselves. The problem they solved simply happened to resonate with millions of developers because they themselves happen to be developers.&lt;/p&gt;
&lt;p&gt;37Signals &lt;a class="reference external" href="http://www.amazon.com/gp/product/0307463745/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0307463745"&gt;didn't build Basecamp&lt;/a&gt; for a world full of project managers and consultants; they built it for themselves. They also developed Ruby on Rails for themselves, as Ruby developers that were repeating themselves too often.&lt;/p&gt;
&lt;p&gt;How &lt;em&gt;pragmatic&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;These companies didn't need to commission lengthy case studies and perform market analysis. They didn't setup faux AdWords to measure the effectiveness of various marketing copy. Yet, they are astronomically successful. How is this possible? They know exactly what they want to build, how it should function, and how it should look because they were building it for themselves and not for others.&lt;/p&gt;
&lt;p&gt;Let's go back to the developer's side of things.&lt;/p&gt;
&lt;p&gt;A great example is my &lt;a class="reference external" href="http://docs.python-requests.org/"&gt;Requests&lt;/a&gt; module. I was a heavy user of &lt;a class="reference external" href="http://convore.com"&gt;Convore&lt;/a&gt; at the time, and I wanted to interface with it programmatically. So, I set out to build a Python module that wrapped the Convore HTTP API. Unfortunately, this was easier said than done. Dealing with Python's standard library for HTTP was a complete and total nightmare. It was over-engineered.&lt;/p&gt;
&lt;p&gt;I love Python because it's a language designed for Humans. Why should modern HTTP be so difficult? So, I sat out to discover what it was that I wanted, and built exactly what I needed. It resonated well with others.&lt;/p&gt;
&lt;p&gt;Nothing is more satisfying than using your own tools to Get Things Done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="respond-with-a-readme"&gt;
&lt;h2&gt;Respond with a README&lt;/h2&gt;
&lt;p&gt;Before I start writing a single line of code, I write the README and fill it with usage examples. I pretend that the module I want to build is already written and available, and I write some code with it.&lt;/p&gt;
&lt;p&gt;This has an incredible effect: instead of engineering something that will only get the job done, you start to interact with the problem itself and build an interface that reacts to it.&lt;/p&gt;
&lt;p&gt;You discover it. You respond to it.&lt;/p&gt;
&lt;p&gt;Great sculptures aren't manufactured — they're discovered. The sculptor studies and listens to the slab of marble. He identifies with the stone. Then, he responds. He enables the marble to speak for itself, setting free something beautiful that hidden was inside all along.&lt;/p&gt;
&lt;p&gt;He &lt;em&gt;responds&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is what &lt;a class="reference external" href="http://www.amazon.com/gp/product/B005SYWGXW/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B005SYWGXW"&gt;responsive design&lt;/a&gt; is all about. It's not merely a method to engineer a web design that will function on a phone, tablet, and desktop.&lt;/p&gt;
&lt;blockquote&gt;
Beware lest you lose the substance by grasping at the shadow.&lt;/blockquote&gt;
&lt;p&gt;Responsive design is about making a design that identifies and understands itself enough to respond to the environment it's placed in. It is about setting your design free from arbitrary constraints. It is setting free something beautiful that was inside all along.&lt;/p&gt;
&lt;p&gt;This is known as &lt;a class="reference external" href="http://tom.preston-werner.com/2010/08/23/readme-driven-development.html"&gt;Readme-Driven Development&lt;/a&gt;. I call it &lt;strong&gt;Responsive API Design&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="build"&gt;
&lt;h2&gt;Build&lt;/h2&gt;
&lt;p&gt;Now that you know what your API is: Build it. Make it happen. If there's a significant amount of complexity behind a simple call, make a layered API: a porcelain interface that sits on top of a verbose API that sits on top of an low level integration interface.&lt;/p&gt;
&lt;p&gt;The user API is all that matters. Everything else is secondary.&lt;/p&gt;
&lt;p&gt;Once your software is released, improve it! Add new features, better security, optimal performance, and rigidity. But never compromise the API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="manifesto"&gt;
&lt;h2&gt;Manifesto&lt;/h2&gt;
&lt;p&gt;Build things that you want. Build things that you need. Build things for you.&lt;/p&gt;
&lt;p&gt;The Golden Rule™:&lt;/p&gt;
&lt;blockquote&gt;
Do unto others as you would have them do to you.&lt;/blockquote&gt;
&lt;p&gt;Adapted to:&lt;/p&gt;
&lt;blockquote&gt;
Build tools for others that you want to be built for you.&lt;/blockquote&gt;
&lt;/div&gt;
</summary></entry><entry><title>Major Progress for Requests</title><link href="http://www.kennethreitz.com/major-progress-for-requests.html" rel="alternate"></link><updated>2012-01-16T10:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2012-01-16:/major-progress-for-requests.html/</id><summary type="html">&lt;p&gt;Requests has changes a lot over the past few months. An update is long overdue.&lt;/p&gt;
&lt;p&gt;In case you aren't familiar, Requests is Python &lt;a class="reference external" href="http://docs.python-requests.org"&gt;HTTP for Humans&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="a-slow-and-painful-death-for-urllib2"&gt;
&lt;h2&gt;A Slow and Painful Death for Urllib2&lt;/h2&gt;
&lt;p&gt;The most notable change has been the complete removal of urllib2 as a dependency.
Requests started out as a clean wrapper around urllib2, abstracting away the
complex hacks required to accomplish basic tasks.&lt;/p&gt;
&lt;p&gt;But, as the feature set grew (as well as the bug list), the project became
impossible and frustrating to maintain. Supporting the simple use case of
&amp;quot;send basic auth on a 404&amp;quot; took several hours.&lt;/p&gt;
&lt;p&gt;Things shouldn't be this way. Not in Python.&lt;/p&gt;
&lt;p&gt;It quickly became obvious that urllib2 was the problem.&lt;/p&gt;
&lt;p&gt;The first step was decoupling all depending functionality on urllib2 handlers.
Redirections, Basic and Digest Authentication, File Uploads, Cookies,
&lt;em&gt;&amp;amp;c&lt;/em&gt;. Easier said than done.&lt;/p&gt;
&lt;p&gt;I started to work on the requirements for the new backend I planned to build.
It would sit directly on top of httplib. I knew I wanted to add keep-alive
in the near future, so it would need to support that, along with adding some
file upload mechanisms.&lt;/p&gt;
&lt;p&gt;That's when I found &lt;a class="reference external" href="https://github.com/shazow/urllib3"&gt;urllib3&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="keep-alive-and-connection-pooling"&gt;
&lt;h2&gt;Keep-alive and Connection Pooling&lt;/h2&gt;
&lt;p&gt;Despite its name, urllib3 is actually a thin wrapper around httplib with a few
niceties added: connection reuse, keep-alive, and file uploads. It was exactly
what I needed.&lt;/p&gt;
&lt;p&gt;So, I reached out to &lt;a class="reference external" href="https://twitter.com/#!/shazow"&gt;Andrey Petrov&lt;/a&gt; on Twitter.
Much to my surprise, he loved the idea of embedding urllib3 within Requests.
We worked together for a few weeks to make some required changes and watched the work
slowly came to fruition.&lt;/p&gt;
&lt;p&gt;By random chance, I had the opportunity to get to know Andrey at
&lt;a class="reference external" href="http://py.codeconf.com"&gt;PyCodeConf&lt;/a&gt;, while all of this was in the making.
We've since become good friends. Open source is awesome.&lt;/p&gt;
&lt;p&gt;Thanks to the urllib3 collaboration, Requests has first class support
for HTTP/1.1 Keep-alive and Connection Pooling:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
s = requests.session()

# New connection to Httpbin.org.
s.get('http://httpbin.org/get')

# New connection to Github.com.
s.get('http://github.com/kennethreitz')

# Reuse old connection to Httpbin.org.
s.get('http://httpbin.com/ip')
&lt;/pre&gt;
&lt;p&gt;Elegant. Thread-safe. Automatic. Awesome.&lt;/p&gt;
&lt;p&gt;It took a few months to bring to a full release, but the move went resoundingly
well. Porting Requests to Python 3 will now be significantly simpler, and the
codebase is a joy to maintain again.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ssl-verification"&gt;
&lt;h2&gt;SSL Verification&lt;/h2&gt;
&lt;p&gt;The biggest milestone yet has also been met: automatic SSL Certificate validation
with hostname verification. This is huge.&lt;/p&gt;
&lt;p&gt;Secure HTTP? In Python? Say it isn't so!&lt;/p&gt;
&lt;p&gt;Any request to an &lt;tt class="docutils literal"&gt;https&lt;/tt&gt; resource that does not have a valid certificate will
raise an exception, unless otherwise specified. Just like a web browser.&lt;/p&gt;
&lt;p&gt;Requests ships with the exact Certificate Authority Bundle that Mozilla's Firefox
ships with, and it is updated on a regular basis.&lt;/p&gt;
&lt;p&gt;For example, this website doesn't have a valid certificate:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; requests.get('https://kennethreitz.com')
Traceback (most recent call last):
...
requests.exceptions.SSLError: hostname 'kennethreitz.com' doesn't match either of '*.herokuapp.com', 'herokuapp.com'
&lt;/pre&gt;
&lt;p&gt;And Github does:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; requests.get('https://github.com')
&amp;lt;Response [200]&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Of course, you can disable this functionality explicitly or specify your own
private CA Bundle in your codebase. Requests will also honor the
&lt;tt class="docutils literal"&gt;REQUESTS_CA_BUNDLE&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;CURL_CA_BUNDLE&lt;/tt&gt; environment variables, just like curl.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="usage"&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;In terms of numbers, Requests has been doing very well recently.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;72,000+ PyPi Installations&lt;/li&gt;
&lt;li&gt;1,700+ GitHub Watchers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's a lot of GitHub watchers. In fact,
&lt;a class="reference external" href="https://github.com/languages/Python/most_watched"&gt;if you sort&lt;/a&gt;
all of the Python projects on GitHub by watchers, the only projects ahead of
Requests are Flask, Tornado, and Django.&lt;/p&gt;
&lt;p&gt;This blows my mind. Of course, this is a silly vanity metric. Open source isn't a contest.&lt;/p&gt;
&lt;p&gt;It's encouraging, nonetheless.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Joining Heroku!</title><link href="http://www.kennethreitz.com/joining-heroku.html" rel="alternate"></link><updated>2011-12-01T20:20:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-12-01:/joining-heroku.html/</id><summary type="html">&lt;p&gt;I am extremely happy to announce that I am joining the &lt;a class="reference external" href="http://heroku.com"&gt;Heroku&lt;/a&gt; team!&lt;/p&gt;
&lt;p&gt;If you aren't familiar, Heroku is a Polyglot Platform as a Service for hosting
web applications. The product is executed so well that they are responsible for
an entire micro-industry of PaaS platforms for different languages
(Python included). Company after company strives to
become the &amp;quot;Heroku for &lt;em&gt;x&lt;/em&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;Until recently, there were only a few &lt;a class="reference external" href="http://ep.io"&gt;good options&lt;/a&gt; for modern
Python deployment. However, a few months ago, Heroku added
&lt;a class="reference external" href="http://blog.heroku.com/archives/2011/9/28/python_and_django/"&gt;official Python support&lt;/a&gt;
to the Cedar stack — it is &lt;em&gt;beautiful&lt;/em&gt;.&lt;/p&gt;
&lt;div class="section" id="the-role"&gt;
&lt;h2&gt;The Role&lt;/h2&gt;
&lt;p&gt;I will be responsible for the technical design of Heroku's Python offering, as well as Heroku’s voice in the Python community.&lt;/p&gt;
&lt;p&gt;Other responsibilities will include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Contributing to open source projects.&lt;/li&gt;
&lt;li&gt;Driving best practices adoption.&lt;/li&gt;
&lt;li&gt;Be passionate about the general success of Python.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best. Job. Ever.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="arc90-readability"&gt;
&lt;h2&gt;Arc90 + Readability?&lt;/h2&gt;
&lt;p&gt;Arc90 + Readability and myself have parted ways on excellent terms.
Leaving the team was a very difficult decision to make. Readability is a
hard-working team of incredible individuals, working passionately on one
of my favorite online tools.&lt;/p&gt;
&lt;p&gt;Readability is very much in a &amp;quot;move as fast as possible&amp;quot; stage of growth.
Unfortunately, my passions for workflow automation, best-practices,
and autonomy proved to mix harshly with the style of Readability's operation.&lt;/p&gt;
&lt;p&gt;We're very proud of what we &lt;a class="reference external" href="http://blog.readability.com/2011/11/reading-needs-a-platform-introducing-the-new-readability/"&gt;built over the past six months&lt;/a&gt;, and I look forward to seeing the platform grow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="heroku-s-values"&gt;
&lt;h2&gt;Heroku's Values&lt;/h2&gt;
&lt;p&gt;I've always found myself attracted to beautiful and elegant architectures and APIs.
Heroku is a natural perfect fit. They're inspiring as both a Product, a Platform, and a Company. Here are a few selections of team marketing:&lt;/p&gt;
&lt;p&gt;On craft:&lt;/p&gt;
&lt;blockquote&gt;
&amp;quot;Heroku is a do-ocracy. Makers of every stripe are welcomed here. Amazing ideas and execution are rewarded with independence and trust.&amp;quot;&lt;/blockquote&gt;
&lt;p&gt;On productivity:&lt;/p&gt;
&lt;blockquote&gt;
&amp;quot;From customer facing roles to our developers, we believe in building, not meeting.&amp;quot;&lt;/blockquote&gt;
&lt;p&gt;Lastly, my personal favorite:&lt;/p&gt;
&lt;blockquote&gt;
&amp;quot;We spend as long as it takes to make things right.&amp;quot;&lt;/blockquote&gt;
&lt;p&gt;Needless to say, I'm tremendously excited about becoming an official Herokai™.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Static Sites on Heroku Cedar</title><link href="http://www.kennethreitz.com/static-sites-on-heroku-cedar.html" rel="alternate"></link><updated>2011-11-26T05:20:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-11-26:/static-sites-on-heroku-cedar.html/</id><summary type="html">&lt;p&gt;Heroku's excellent &lt;a class="reference external" href="http://devcenter.heroku.com/articles/cedar"&gt;Cedar Stack&lt;/a&gt;
has first-class support for Python, Ruby, Node.js, Java, Clojure, and Scala applications.
Unfortunately, there's no obvious way to serve static sites without first
fronting them with a Rack or WSGI application.&lt;/p&gt;
&lt;p&gt;The Cedar stack has unofficial support for
&lt;a class="reference external" href="https://github.com/heroku/heroku-buildpack-python"&gt;Custom Build Packs&lt;/a&gt;,
which allow you to compile your own language runtime on top of Cedar.
My plan was to build an custom nginx build pack for Cedar, but that turned out
to be completely unnecessary.&lt;/p&gt;
&lt;p&gt;Did you you know that Cedar has full (unofficial)
support for PHP applications, fronted with Apache? When you push up a repository
with an &lt;tt class="docutils literal"&gt;index.php&lt;/tt&gt; file at the root, Apache and PHP are bundled into
your application at runtime.&lt;/p&gt;
&lt;div class="section" id="elegant-static-sites-on-cedar"&gt;
&lt;h2&gt;Elegant Static Sites on Cedar&lt;/h2&gt;
&lt;p&gt;First, lets turn your site into a PHP &amp;quot;application&amp;quot;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ touch index.php
&lt;/pre&gt;
&lt;p&gt;Next, we can fully disable Apache's PHP engine:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ echo 'php_flag engine off' &amp;gt; .htaccess
&lt;/pre&gt;
&lt;p&gt;When you push this up, you'll have a bare Apache instance serving up the
contents of your site to the world. Best yet, you can do all of the
&lt;a class="reference external" href="http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/"&gt;stupid .htaccess tricks&lt;/a&gt;
that you could on on any traditional shared hosting platform.&lt;/p&gt;
&lt;p&gt;It works great! This very website is served this way.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Requests v0.6.0 Released!</title><link href="http://www.kennethreitz.com/requests-v060-released.html" rel="alternate"></link><updated>2011-08-17T05:20:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-08-17:/requests-v060-released.html/</id><summary type="html">&lt;p&gt;Requests v0.6.0 was just released! This is big.&lt;/p&gt;
&lt;p&gt;If you're unfamiliar with &lt;strong&gt;Requests&lt;/strong&gt;, the Python HTTP Module for
Humans, it strives to keep things as simple and elegant as possible.
&lt;a class="reference external" href="http://python-requests.org"&gt;Learn more&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="sessions"&gt;
&lt;h2&gt;Sessions&lt;/h2&gt;
&lt;p&gt;I'm extremely happy to announce that Requests now has support for sessions!&lt;/p&gt;
&lt;p&gt;A session is created with a simple context manager. The resulting object
has a method for each type of request, just like Requests itself.&lt;/p&gt;
&lt;p&gt;Any optional parameters can be passed to &lt;tt class="docutils literal"&gt;requests.session&lt;/tt&gt;, and will
be included in each Request method call. Cookies are also persisted
throughout all requests within a session.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
with requests.session(auth=('username', 'password')) as s:

    r = s.get('https://api.github.com')

    r.status_code
    # 200
&lt;/pre&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.python-requests.org/en/latest/user/advanced/#session-objects"&gt;Learn more about sessions&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="status-code-reference"&gt;
&lt;h2&gt;Status Code Reference&lt;/h2&gt;
&lt;p&gt;When reading HTTP code, remembering the exact meaning for every
status_code can be difficult. Especially if you're working with a robust
API. So, I've included a flexible lookup object to reference a status_code
within your code.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; requests.codes.ok
200

&amp;gt;&amp;gt;&amp;gt; requests.codes.im_a_teapot
418

&amp;gt;&amp;gt;&amp;gt; requests.codes['precondition_failed']
412
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="dict-cookies"&gt;
&lt;h2&gt;Dict Cookies&lt;/h2&gt;
&lt;p&gt;Requests has had CookieJar support for a while, but that's far from ideal.
CookieJars require an enormous amount of manual code. So, now you can give
Requests a simple dictionary wherever it expects a CookieJar, and it'll
automatically generate a CookieJar for you!&lt;/p&gt;
&lt;p&gt;Best yet, if a server responds with Cookies in any request, you'll have
a simple dictionary waiting for you in &lt;tt class="docutils literal"&gt;Response.cookies&lt;/tt&gt;. If you
want the full CookieJar, you can access it at &lt;tt class="docutils literal"&gt;Response.request.cookiejar&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="hook-system"&gt;
&lt;h2&gt;Hook System&lt;/h2&gt;
&lt;p&gt;I've added a new hooks system for both signaling and modifying the
method arguments, requests, and responses during the request lifecycle.&lt;/p&gt;
&lt;p&gt;This will be extremely useful for using Requests to wrap web service APIs.
Adding custom authentication mechanisms (OAuth anyone?) should be as simple
as a few callbacks within a session.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.python-requests.org/en/latest/user/advanced/#event-hooks"&gt;Learn more about Hooks&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="c"&gt;
&lt;h2&gt;&lt;em&gt;&amp;amp;c&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;I saw a large number of users relying on the order of the request
function parmaters, instead of naming the arguments explicitly.
So, now everything but &lt;tt class="docutils literal"&gt;url&lt;/tt&gt; (and sometimes &lt;tt class="docutils literal"&gt;data&lt;/tt&gt;) is passed
via &lt;tt class="docutils literal"&gt;**kwargs&lt;/tt&gt;, so you have to do things properly. This also gives me
some flexiblity in making API decisions in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="community-update"&gt;
&lt;h2&gt;Community Update&lt;/h2&gt;
&lt;p&gt;This weekend, Requests had its biggest explosion ever. The documentation has
been accessed 43,000+ times by 25,000+ unique visitors in the past 30 days.
The repo is approaching &lt;a class="reference external" href="https://github.com/kennethreitz/requests"&gt;700 watchers on GitHub&lt;/a&gt; (trailing just behind Celery),
and the latest release has been downloaded over 2000 times from PyPi in
the last month alone.&lt;/p&gt;
&lt;p&gt;Another big milestone: we now have 25 contributors! Many thanks to everyone
involved :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="changelog"&gt;
&lt;h2&gt;Changelog&lt;/h2&gt;
&lt;p&gt;Here's a full list of what's new on v0.6.0:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;New callback hook system&lt;/li&gt;
&lt;li&gt;New persistent sessions object and context manager&lt;/li&gt;
&lt;li&gt;Transparent Dict-cookie handling&lt;/li&gt;
&lt;li&gt;Status code reference object&lt;/li&gt;
&lt;li&gt;Removed Response.cached&lt;/li&gt;
&lt;li&gt;Added Response.request&lt;/li&gt;
&lt;li&gt;All args are kwargs&lt;/li&gt;
&lt;li&gt;Relative redirect support&lt;/li&gt;
&lt;li&gt;HTTPError handling improvements&lt;/li&gt;
&lt;li&gt;Improved https testing&lt;/li&gt;
&lt;li&gt;Bugfixes&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="source-code"&gt;
&lt;h2&gt;Source Code&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Requests&lt;/strong&gt; is open source (ISC Licensed), and will make your world a
better place. I promise :)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/kennethreitz/requests"&gt;Code on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://python-requests.org"&gt;python-requests.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary></entry><entry><title>I Use This</title><link href="http://www.kennethreitz.com/i-use-this.html" rel="alternate"></link><updated>2011-07-30T15:10:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-07-30:/i-use-this.html/</id><summary type="html">&lt;p&gt;A while back, I published a post about my setup, inspired by the awesome
articles on the &lt;a class="reference external" href="http://usesthis.com/"&gt;UsesThis&lt;/a&gt; site.&lt;/p&gt;
&lt;p&gt;As times change, so does my toolset. So, here's a list of my latest
favorite things. I &lt;em&gt;love&lt;/em&gt; them, and think you should use them too.&lt;/p&gt;
&lt;div class="section" id="ep-io"&gt;
&lt;h2&gt;ep.io&lt;/h2&gt;
&lt;p&gt;Perfectly Pythonic WSGI Hosting.&lt;/p&gt;
&lt;p&gt;There are a number of new Heroku-like Python hosts out there, but most
of them leave a bad taste in my mouth. This is mostly because they only
support Django, and not generic WSGI (e.g. Flask apps).&lt;/p&gt;
&lt;p&gt;Ep.io supports any WSGI application. It charges based on usage and
offers a generous amount of free usage &lt;em&gt;per application&lt;/em&gt;. Redis support.
Cron jobs. Optional git/mercurial integration. The architecture and
configurations are &lt;em&gt;very&lt;/em&gt; elegant. I love it.&lt;/p&gt;
&lt;p&gt;I host a most of my open source applications, including this very
website, on ep.io. I couldn't be happier.&lt;/p&gt;
&lt;p&gt;[ &lt;a class="reference external" href="http://ep.io"&gt;ep.io&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="gaug-es"&gt;
&lt;h2&gt;gaug.es&lt;/h2&gt;
&lt;p&gt;Google Analytics is an extremely power analytics platform that can be
used to drive important business decisions and analyze deep trends.&lt;/p&gt;
&lt;p&gt;I don't need any of that.&lt;/p&gt;
&lt;p&gt;I need realtime traffic information, visitor browsers and devices, and a
simple list of referral URLs.&lt;/p&gt;
&lt;p&gt;Check out &lt;a class="reference external" href="http://gaug.es"&gt;Gauges&lt;/a&gt;. Realtime, simple, and elegant
analytics. No domain limits. It's provided by a group of great guys that
are passionate about making the service as awesome as possible. It
really shows.&lt;/p&gt;
&lt;p&gt;[ &lt;a class="reference external" href="http://gaug.es"&gt;gaug.es&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dnsimple"&gt;
&lt;h2&gt;DNSimple&lt;/h2&gt;
&lt;p&gt;Stop using GoDaddy. Now. They have extremely misleading billing
practices, terrible ads, and — worst of all — one of the worst DNS
management interfaces on earth.&lt;/p&gt;
&lt;p&gt;DNSimple has the simplest and most elegant DNS management system I've
ever used. Everything just works —&amp;nbsp;instantly. One-click record templates
for GitHub Pages, Google Apps, etc.&lt;/p&gt;
&lt;p&gt;There's a small subscription fee, tiered by the number of hosted
domains. If you find yourself thinking, &amp;quot;Why would I pay for DNS
hosting?&amp;quot;: You get what you pay for.&lt;/p&gt;
&lt;p&gt;It doesn't matter where you register your domains, but I register all of
mine through DNSimple. The registration cost is a little high compared
to a few providers, but — again —&amp;nbsp;you really get what you pay for.&lt;/p&gt;
&lt;p&gt;I got a signed postcard from them in the mail last year, wishing me a
Happy New Year. These guys care.&lt;/p&gt;
&lt;p&gt;[ &lt;a class="reference external" href="https://dnsimple.com/r/125ca47dda0551"&gt;DNSimple&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sublime-text-2"&gt;
&lt;h2&gt;Sublime Text 2&lt;/h2&gt;
&lt;p&gt;It's time to face the facts: TextMate is dead. The author has been lying
to his loyal community for a long time now. It's time for us to move on.&lt;/p&gt;
&lt;p&gt;I looked for a worthy replacement for a long time. This wasn't an easy
task. I believe that I have tried literally every editor ever released
for every major operating system within the past 10 years. I'm really
picky about my development environment; It's part of who I am.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt; is incredible.&lt;/p&gt;
&lt;p&gt;It offers TextMate theme and snippets support, extremely optimized
workflows, and a full internal Python API for writing plugins. Coupled
with &lt;a class="reference external" href="https://github.com/lunixbochs/sublimelint"&gt;SublimeLint&lt;/a&gt; and
&lt;a class="reference external" href="https://github.com/buymeasoda/soda-theme"&gt;Soda Theme Dark&lt;/a&gt;, it's
perfect.&lt;/p&gt;
&lt;p&gt;It's available for OS X, Linux, and Windows too.&lt;/p&gt;
&lt;p&gt;[ &lt;a class="reference external" href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="readability"&gt;
&lt;h2&gt;Readability&lt;/h2&gt;
&lt;p&gt;Full disclosure: &lt;a class="reference external" href="http://kennethreitz.com/joining-arc90-readability.html"&gt;I work for
Readability&lt;/a&gt;.
However, that's completely irrelevant. Readability is easily one of my
favorite tools ever.&lt;/p&gt;
&lt;p&gt;If I land on an article that's either ugly or too long to read at the
moment, I hit ` in Chrome. I'm presented with a highly polished,
content-only version of the article with elegant typography.&lt;/p&gt;
&lt;p&gt;Top notch browser plugins. First-class Typography. Offline HTML5 apps
for every device I own. A daily digest of my articles, sent to my Kindle
automatically? Yes, please.&lt;/p&gt;
&lt;p&gt;[ &lt;a class="reference external" href="http://readability.com"&gt;Readability&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="canon-35mm-f-1-4l"&gt;
&lt;h2&gt;Canon 35mm f/1.4L&lt;/h2&gt;
&lt;p&gt;One of the few things that gets me away from my machine is photography.
Check out &lt;a class="reference external" href="http://www.flickriver.com/photos/kennethreitz/"&gt;my Flickr
stream&lt;/a&gt;. It's very
much a hobby, but I quite enjoy it.&lt;/p&gt;
&lt;p&gt;My lens kit has gone through quite a few iterations. It took me a while,
but I'm finally got rid of my last zoom lens, and have moved on to all
primes. Zooms seem to suck creativity out of me. Constraints are good.&lt;/p&gt;
&lt;p&gt;My new favorite lens is the &lt;a class="reference external" href="http://www.amazon.com/Canon-35mm-1-4L-Angle-Cameras/dp/B00009R6WY"&gt;Canon EF 35mm
f/1.4L&lt;/a&gt;.
I'm blown away by this thing. It's exactly what I've been looking for. I
can't believe it hasn't been updated since 1992.&lt;/p&gt;
&lt;p&gt;I've noticed a bit of a fanastic subculture behind this lens since I got
it. If you ever take a look at the &lt;a class="reference external" href="http://www.flickriver.com/photos/whitehouse/popular-interesting/"&gt;White House's Flickr
Stream&lt;/a&gt;,
you'll see the excellent work of Pete Souza. He uses the 35L in almost
every indoor photo. Incredible.&lt;/p&gt;
&lt;p&gt;Before, I typically shot with my moderately telephoto &lt;a class="reference external" href="http://www.amazon.com/Canon-85mm-f1-2L-Lens-Cameras/dp/B000EW9Y4M"&gt;85mm
f/1.2L&lt;/a&gt;
(my photon vaccuum). I still use it on certain occasions, but the 35L is
really bringing my photography to a new level.&lt;/p&gt;
&lt;p&gt;The
&lt;a class="reference external" href="http://www.amazon.com/gp/product/B00009R6WY/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399373&amp;amp;creativeASIN=B00009R6WY"&gt;35L&lt;/a&gt;
&lt;em&gt;&amp;amp;&lt;/em&gt;
&lt;a class="reference external" href="http://www.amazon.com/gp/product/B000EW9Y4M/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=B000EW9Y4M"&gt;85L&lt;/a&gt;
are an unstoppable duo.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="webfaction"&gt;
&lt;h2&gt;WebFaction&lt;/h2&gt;
&lt;p&gt;I've never been a fan of shared hosting at all. These guys proved me
wrong.&lt;/p&gt;
&lt;p&gt;They really know their stuff. Python is a true first-class citizen on
their boxes: 2.4, 2.5, 2.6, 2.7, 3.1, 3.2 are all available, with
most of the popular supporting libraries (PIL, etc), out of the box. One
click installers for WordPress and more with 100% perfect permissions
set. Nginx-fronted Apache, giving you the best of both worlds. A
standard account gets you user-level SSH access to the box. Awesome.&lt;/p&gt;
&lt;p&gt;If I need to host a PHP or static app, they're my first stop.&lt;/p&gt;
&lt;p&gt;[ &lt;a class="reference external" href="http://www.webfaction.com?affiliate=kennethreitz"&gt;WebFaction&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="read-the-docs"&gt;
&lt;h2&gt;Read the Docs&lt;/h2&gt;
&lt;p&gt;A product of last year's DjangoDash, Read the Docs is the best Sphinx
documentation site around. It's &lt;a class="reference external" href="https://github.com/rtfd/readthedocs.org"&gt;open
source&lt;/a&gt; too.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://python-requests.org"&gt;python-requests.org&lt;/a&gt;,
&lt;a class="reference external" href="http://python-guide.org"&gt;python-guide.org&lt;/a&gt;, and
&lt;a class="reference external" href="http://tablib.org"&gt;tablib.org&lt;/a&gt; are all hosted on RTD. You should use
it too.&lt;/p&gt;
&lt;p&gt;[ &lt;a class="reference external" href="http://readthedocs.org/"&gt;Read the Docs&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bonus-things"&gt;
&lt;h2&gt;Bonus Things&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://johnmacfarlane.net/pandoc/pandoc-1.8.2.dmg"&gt;Binary Pandoc Installer for OSX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/kennethreitz/osx-gcc-installer"&gt;Xcode-less GCC Installer for OSX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary></entry><entry><title>Requests v0.5.1 Released</title><link href="http://www.kennethreitz.com/requests-v051-released.html" rel="alternate"></link><updated>2011-07-24T02:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-07-24:/requests-v051-released.html/</id><summary type="html">&lt;p&gt;Requests v0.5.1 was just released.&lt;/p&gt;
&lt;p&gt;If you're unfamiliar with &lt;strong&gt;Requests&lt;/strong&gt;, the HTTP Module for Humans, it
strives to keep things as simple and elegant as possible.
&lt;a class="reference external" href="http://python-requests.org"&gt;Learn more&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="community-update"&gt;
&lt;h2&gt;Community Update&lt;/h2&gt;
&lt;p&gt;I'm really happy with the direction that Requests is going. The repo is
approaching &lt;a class="reference external" href="https://github.com/kennethreitz/requests"&gt;400 watchers on GitHub&lt;/a&gt;
(trailing just behind the Pyramid framework), and has been downloaded over 1100
times from PyPi in the last month alone.&lt;/p&gt;
&lt;p&gt;Another big milestone: we now have 20 contributors! Many thanks to everyone involved :)&lt;/p&gt;
&lt;p&gt;If you head over to &lt;a class="reference external" href="http://python-requests.org"&gt;python-requests.org&lt;/a&gt;,
you'll be greeted by the new Requests mascot, Rez the sea turtle.&lt;/p&gt;
&lt;p&gt;This October, I'll be presenting at &lt;a class="reference external" href="http://py.codeconf.com/"&gt;PyCodeConf&lt;/a&gt;
in Miami, FL. Topics will include Requests' API design and how libraries
like it help to make Python more accessible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API Design and Pragmatic Python&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Unfortunately, solving simple problems with Python isn't always
&lt;tt class="docutils literal"&gt;import antigravity&lt;/tt&gt;. This talk will analyze the high barriers of
entry that clutter the Python landscape. We'll discuss ways to make
Python more accessible for newcomers and less of a headache for
seasoned veterans.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="new-features"&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;p&gt;The v0.5.x series has brought along some awesome features so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PATCH&lt;/tt&gt; Support!&lt;/li&gt;
&lt;li&gt;International Domain Name Support!&lt;/li&gt;
&lt;li&gt;Forced Basic Authentication (for 404'd responses; default)&lt;/li&gt;
&lt;li&gt;Querystrings available for all methods&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;python-requests.org&lt;/span&gt;&lt;/tt&gt; default User-Agent header&lt;/li&gt;
&lt;li&gt;Sexy HTTPBin Test Suite&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;settings.verbose&lt;/tt&gt; configurable stream for debugging and logging.&lt;/li&gt;
&lt;li&gt;Access response headers without fetching entire body (&lt;tt class="docutils literal"&gt;read()&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;Use lists as dicts for parameters w/ multiple values&lt;/li&gt;
&lt;li&gt;Dict-configurable Proxies&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Accept-Encoding:&lt;/span&gt; gzip&lt;/tt&gt; default on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="moving-forward"&gt;
&lt;h2&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;In the short-term, I plan to remove Request's dependency on Poster, and
replace the multi-part file upload functionality with internal code.&lt;/p&gt;
&lt;p&gt;Once Poster is removed, Python 3.1+ support will be added.&lt;/p&gt;
&lt;p&gt;Once the port to Python3 is complete, elegant HTTPS certificate verification
will be added.&lt;/p&gt;
&lt;p&gt;While those development tasks are being carried out, I'm planning on adding
some more exhaustive documentation to the website: tutorials, FAQ, use
cases recipes, scenarios, &amp;amp;c.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="source-code"&gt;
&lt;h2&gt;Source Code&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Requests&lt;/strong&gt; is open source (ISC Licensed), and will make your world a better place.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/kennethreitz/requests"&gt;Code on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://python-requests.org"&gt;python-requests.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary></entry><entry><title>GitHub Reflog v1.7.19</title><link href="http://www.kennethreitz.com/github-reflog-v1719.html" rel="alternate"></link><updated>2011-07-23T19:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-07-23:/github-reflog-v1719.html/</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="https://github.com/blog/883-github-reflog-v1-7-19"&gt;Original Post on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Welcome to the &lt;strong&gt;The GitHub Reflog&lt;/strong&gt; — the chronicle of remarkable
GitHub repos and community activity. For previous editions, check out
&lt;a class="reference external" href="https://github.com/kennethreitz/github-reflog"&gt;The Reflog Archive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This week, we're extending a warm welcome to &lt;a class="reference external" href="https://github.com/theleagueof"&gt;The League of Moveable
Type&lt;/a&gt;'s excellent open source fonts to
GitHub!&lt;/p&gt;
&lt;div class="section" id="featured-repo-of-the-week"&gt;
&lt;h2&gt;Featured Repo of the Week&lt;/h2&gt;
&lt;div class="section" id="id1"&gt;
&lt;h3&gt;&lt;a class="reference external" href="https://github.com/ryanmcgrath/wii-js"&gt;ryanmcgrath/wii-js&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Nintendo's ever-popular Wii console has a web browser, but little
development is done with it. This JavaScript project offers a stable,
robust, and documented API for wii/html interaction.&lt;/p&gt;
&lt;p&gt;While not entirely practical for actual application development, this
project aims to be a great avenue for teaching kids about programming.&lt;/p&gt;
&lt;p&gt;Wii-js supports up to four wiimotes interacting with a page at a time.
Check out &lt;a class="reference external" href="http://venodesigns.net/wii/"&gt;the demo page&lt;/a&gt; (on your wii)
to see it in action.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="awesome-repo-of-the-week"&gt;
&lt;h2&gt;Awesome Repo of the Week&lt;/h2&gt;
&lt;div class="section" id="id2"&gt;
&lt;h3&gt;&lt;a class="reference external" href="https://github.com/danlucraft/git.js"&gt;danlucraft/git.js&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is nothing short of awesome. A git implementation written in pure
JavaScript. Similar to the
&lt;a class="reference external" href="https://github.com/jelmer/dulwich"&gt;Dulwich&lt;/a&gt; project, for Python.&lt;/p&gt;
&lt;p&gt;Git.js is MIT licensed. It features both a command-line git client for
node.js and an in-browser repo API for accessing repos available via
HTTP.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="remarkable-repos"&gt;
&lt;h2&gt;Remarkable Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/j2labs/brubeck"&gt;j2labs/brubeck&lt;/a&gt;: A flexible
web framework for Python, powered by
&lt;a class="reference external" href="https://github.com/zedshaw/mongrel2"&gt;Mongrel2&lt;/a&gt;, Eventlet,
&lt;a class="reference external" href="https://github.com/zeromq/"&gt;ZeroMQ&lt;/a&gt;, and
&lt;a class="reference external" href="https://github.com/j2labs/dictshield"&gt;DictShield&lt;/a&gt;. To get a feel
for the framework, check out the &lt;a class="reference external" href="https://github.com/j2labs/listsurf"&gt;example
project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/arthuredelstein/clooj"&gt;arthuredelstein/clooj&lt;/a&gt;:
a lightweight IDE for Clojure, written in Clojure. Powered by Swing,
Clooj is cross platform and can be used as both a standalone
application or embedded editor.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/jceb/vim-orgmode"&gt;jceb/vim-orgmode&lt;/a&gt;: This
awesome plugin brings emacs' org-mode note-taking system to the vim
community. Access your notes on your iPhone with
&lt;a class="reference external" href="https://github.com/richard/mobileorg"&gt;mobileorg&lt;/a&gt; over WebDAV or
Dropbox.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/Khan/khan-mobile"&gt;Khan/khan-mobile&lt;/a&gt;: The
source code of the Khan Academy's new mobile app.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="promising-repos"&gt;
&lt;h2&gt;Promising Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/urbancoding/jenx"&gt;urbancoding/jenx&lt;/a&gt;: A
Jenkins build server monitor for Mac OS X, powered by MacRuby. This
app sits in your status bar and reports the status of all your
Jenkins builds. Click on a job, and it opens it up in your browser.
It even supports Growl!&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/jesusabdullah/pyee"&gt;jesusabdullah/pyee&lt;/a&gt;: A
port of node.js' popular EventEmitter system to Python. Simple and
strait forward.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/memo/iSteveJobs"&gt;memo/iSteveJobs&lt;/a&gt;: This
useless (but fun) project replaces all the faces detected in a webcam
feed with Steve Jobs. It is powered by the
&lt;a class="reference external" href="https://github.com/openframeworks/openFrameworks"&gt;openFrameworks&lt;/a&gt;
C++ Framework.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/kennethkufluk/Twitter-Matrix"&gt;kennethkufluk/Twitter-Matrix&lt;/a&gt;:
This HTML5 project takes a Twitter list's public feed, and displays
it. Matrix-style. Check out the &lt;a class="reference external" href="http://kenneth.kufluk.com/matrix/"&gt;demo
page&lt;/a&gt; to see it in action.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feedback is appreciated! Send any questions, suggestions, and anonymous
tips to &lt;a class="reference external" href="mailto:reflog&amp;#64;kennethreitz.com"&gt;reflog&amp;#64;kennethreitz.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For more open source news, check out &lt;a class="reference external" href="http://thechangelog.com"&gt;The
Changelog&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/explore"&gt;github/explore&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Legit: The Sexy Git CLI</title><link href="http://www.kennethreitz.com/legit-the-sexy-git-cli.html" rel="alternate"></link><updated>2011-06-27T02:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-06-27:/legit-the-sexy-git-cli.html/</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://mac.github.com"&gt;GitHub for Mac&lt;/a&gt; is not just a Git client. This &lt;a class="reference external" href="http://www.hackerne.ws/item?id=2684483"&gt;comment&lt;/a&gt; on Hacker News
says it best:&lt;/p&gt;
&lt;blockquote&gt;
They haven't re-created the git CLI tool in a GUI, they've created something different. They've created a tool that makes Git more accessible. Little things like auto-stashing when you switch branches will confuse git veterans, but it will make Git much easier to grok for newcomers because of the assumptions it makes about your Git workflow.&lt;/blockquote&gt;
&lt;p&gt;Why not bring this innovation back to the &lt;a class="reference external" href="http://www.amazon.com/gp/product/1430218339/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430218339"&gt;command line Git interface&lt;/a&gt;?&lt;/p&gt;
&lt;div class="section" id="enter-legit"&gt;
&lt;h2&gt;Enter Legit&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Legit&lt;/strong&gt; is a new tool that allows you to interface with a Git respository much
like you would with GitHub for Mac—from the command line.&lt;/p&gt;
&lt;p&gt;Switching branches becomes seamless. Any pending changes are automatically stashed
and restored. Same goes with syncing your repository. And merging (grafting). And branching (sprouting).&lt;/p&gt;
&lt;p&gt;Managing remote branches becomes as simple as &lt;tt class="docutils literal"&gt;publish branch&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;unpublish branch&lt;/tt&gt;. Simple.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Installing Legit is easy with pip (Python 2.6 or 2.7 required):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ pip install legit
&lt;/pre&gt;
&lt;p&gt;This makes the &lt;tt class="docutils literal"&gt;legit&lt;/tt&gt; command available. Run it within a repository.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Available commands&lt;/strong&gt;:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;sync [&amp;lt;branch&amp;gt;]&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Syncronizes the given branch. Defaults to current branch.
Stash, Fetch, Auto-Merge/Rebase, Push, and Unstash.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;branches&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Get a nice pretty list of available branches.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;switch &amp;lt;branch&amp;gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Switches to specified branch.
Automatically stashes and unstashes any changes.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;sprout [&amp;lt;branch&amp;gt;] &lt;span class="pre"&gt;&amp;lt;new-branch&amp;gt;&lt;/span&gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Creates a new branch off of the specified branch.
Defaults to current branch.
Swiches to it immediately.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;graft &amp;lt;branch&amp;gt; &lt;span class="pre"&gt;&amp;lt;into-branch&amp;gt;&lt;/span&gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Merges specified branch into the second branch, and removes it.
You can only graft unpublished branches.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;publish &amp;lt;branch&amp;gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Publishes specified branch to the remote.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;unpublish &amp;lt;branch&amp;gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Removes specified branch from the remote.&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="moving-forward"&gt;
&lt;h2&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Legit&lt;/strong&gt; is very much in &lt;em&gt;beta&lt;/em&gt;. I'm using it for real work already, so don't hesitate to try it out. As feedback and contributions come in, I expect the feature-set to evolve. We'll see. That's up to you.&lt;/p&gt;
&lt;p&gt;Static binaries will be available soon for all major platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="source-code"&gt;
&lt;h2&gt;Source Code&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Legit&lt;/strong&gt; is open source (BSD Licensed), powered by
&lt;a class="reference external" href="https://github.com/kennethreitz/clint"&gt;Clint&lt;/a&gt;, &lt;a class="reference external" href="http://pypi.python.org/pypi/GitPython/"&gt;GitPython&lt;/a&gt;,
and good intentions.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/kennethreitz/legit"&gt;Code on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary></entry><entry><title>Announcing HttpBin.org</title><link href="http://www.kennethreitz.com/announcing-httpbinorg.html" rel="alternate"></link><updated>2011-06-13T01:00:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-06-13:/announcing-httpbinorg.html/</id><summary type="html">&lt;p&gt;The development of &lt;a class="reference external" href="https://python-requests.org"&gt;Requests&lt;/a&gt;, the Python HTTP
Module for Humans, led to some annoying testing practices. Relying on random
websites and services in order to test different capabilities of the HTTP
client became annoying quickly.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://postbin.org"&gt;PostBin.org&lt;/a&gt; was perfect for testing POST request
behavior, but is usless for other situations. I was hoping to extend its
functionality to other request types, but it turns out that PostBin runs
on the Google App Engine platform. No.&lt;/p&gt;
&lt;p&gt;Thus, &lt;a class="reference external" href="http://httpbin.org"&gt;httpbin.org&lt;/a&gt; was born.&lt;/p&gt;
&lt;div class="section" id="example-endpoints"&gt;
&lt;h2&gt;Example Endpoints&lt;/h2&gt;
&lt;p&gt;To get a feel for what &lt;strong&gt;HttpBin&lt;/strong&gt; does, here are a few endpoint examples:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;$ curl &lt;span class="pre"&gt;http://httpbin.org/ip&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{&amp;quot;origin&amp;quot;: &amp;quot;::ffff:24.127.96.129&amp;quot;}
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;$ curl &lt;span class="pre"&gt;http://httpbin.org/user-agent&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{&amp;quot;user-agent&amp;quot;: &amp;quot;curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3&amp;quot;}
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;$ curl &lt;span class="pre"&gt;http://httpbin.org/get&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{
   &amp;quot;args&amp;quot;: {},
   &amp;quot;headers&amp;quot;: {
      &amp;quot;Accept&amp;quot;: &amp;quot;*/*&amp;quot;,
      &amp;quot;Connection&amp;quot;: &amp;quot;close&amp;quot;,
      &amp;quot;Content-Length&amp;quot;: &amp;quot;&amp;quot;,
      &amp;quot;Content-Type&amp;quot;: &amp;quot;&amp;quot;,
      &amp;quot;Host&amp;quot;: &amp;quot;httpbin.org&amp;quot;,
      &amp;quot;User-Agent&amp;quot;: &amp;quot;curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3&amp;quot;,
      &amp;quot;X-Forwarded-For&amp;quot;: &amp;quot;::ffff:24.127.96.129&amp;quot;,
      &amp;quot;X-Forwarded-Protocol&amp;quot;: &amp;quot;&amp;quot;
   },
   &amp;quot;origin&amp;quot;: &amp;quot;::ffff:24.127.96.129&amp;quot;,
   &amp;quot;url&amp;quot;: &amp;quot;http://httpbin.org/get&amp;quot;
}
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;$ curl &lt;span class="pre"&gt;-I&lt;/span&gt; &lt;span class="pre"&gt;http://httpbin.org/status/418&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="literal-block"&gt;
HTTP/1.1 418 I'M A TEAPOT
Server: nginx/0.7.67
Date: Mon, 13 Jun 2011 04:25:38 GMT
Connection: close
x-more-info: http://tools.ietf.org/html/rfc2324
Content-Length: 135
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="moving-forward"&gt;
&lt;h2&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HttpBin&lt;/strong&gt; will be packaged and released on PyPi soon, for local development
use and requests-tests runs on &lt;a class="reference external" href="http://ci.kennethreitz.com"&gt;ci.kennethreitz.com&lt;/a&gt;.
I need to determine a portable pattern for this.&lt;/p&gt;
&lt;p&gt;In the coming weeks, I'd like to add a few new new endpoints: &lt;tt class="docutils literal"&gt;/deflate&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/basic-auth&lt;/span&gt;&lt;/tt&gt;, &lt;em&gt;&amp;amp;c&lt;/em&gt;. Contributions are welcome.&lt;/p&gt;
&lt;p&gt;I'm considering adding optional request logging / history to the service,
powered by Redis. A new &lt;tt class="docutils literal"&gt;/post&lt;/tt&gt; request, for example, would be redirected to
a new URL (e.g. &lt;tt class="docutils literal"&gt;/post/c1548ed&lt;/tt&gt;) that can be POSTed to repetitively. This
will give &lt;strong&gt;HttpBin&lt;/strong&gt; feature parity with postbin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="source-code"&gt;
&lt;h2&gt;Source Code&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HttpBin&lt;/strong&gt; is open source (ISC Licensed), powered by
&lt;a class="reference external" href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt;, &lt;a class="reference external" href="http://werkzeug.pocoo.org/"&gt;Werkzeug&lt;/a&gt;,
and good intentions.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/kennethreitz/httpbin"&gt;Code on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://httpbin.org"&gt;httpbin.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary></entry><entry><title>Joining Arc90 + Readability</title><link href="http://www.kennethreitz.com/joining-arc90-readability.html" rel="alternate"></link><updated>2011-05-27T22:35:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-05-27:/joining-arc90-readability.html/</id><summary type="html">&lt;p&gt;I'm extremely happy to announce that I am joining the &lt;a class="reference external" href="http://arc90.com"&gt;Arc90&lt;/a&gt; team to work on Readabilty!&lt;/p&gt;
&lt;p&gt;Arc90 is a NYC-based software consultancy firm, r&amp;amp;d lab, and product incubator.
The company is a design-driven group, built around skills rather than
hierarchy. They strive to create the &lt;em&gt;best software possible&lt;/em&gt;; passion and design
pours out of everything they ship. I love that.&lt;/p&gt;
&lt;p&gt;As a self-professed software aficionado, I couldn't have picked a more
inspiring group of people to work with. I immediately accepted their offer
without any hesitation.&lt;/p&gt;
&lt;p&gt;Unfortunately, my previous employer and I have parted ways for various reasons,
stemming from the standard major-corp intellectual property agreement (IPA). I
couldn't agree to the new terms because of the restrictions it would impose on
my passion — open source.&lt;/p&gt;
&lt;p&gt;For those interested, I &lt;strong&gt;highly recommend&lt;/strong&gt; &lt;a class="reference external" href="http://www.amazon.com/gp/product/B0043D2E3Q/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399349&amp;amp;creativeASIN=B0043D2E3Q"&gt;Intellectual Property and Open Source&lt;/a&gt;
by Van Lindberg. If you do any open source software development of any kind,
you absolutely &lt;em&gt;must read this book&lt;/em&gt;.&lt;/p&gt;
&lt;div class="section" id="readability"&gt;
&lt;h2&gt;Readability&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://readability.com"&gt;Readability&lt;/a&gt; is easily one of the highest quality
web applications around. I use it every day.&lt;/p&gt;
&lt;p&gt;Simply put, it is a beautiful application that allows you to curate a personal reading list of articles you find online.&lt;/p&gt;
&lt;p&gt;Let's say, you encounter a thought-provoking article hosted on the typical ad-ridden website with terrible typography. Activate the Readability browser addon (or bookmarklet) and the page is transformed into a typographically elegant version of the page, containing only the article content. You can then happily read the content of the article or save for later enjoyment.&lt;/p&gt;
&lt;p&gt;Users pay a self-set monthly subscription fee ($5+). 70% of your subscription
is distributed amongst the creators of the content you have saved. The
remaining 30% goes back to Readability.  Users receive an incredible reading
experience, and the content creators get generously reimbursed for their hard
work.&lt;/p&gt;
&lt;p&gt;Beautiful.&lt;/p&gt;
&lt;p&gt;Marco Arment, creator of Instapaper, loves what Readability is accomplishing:&lt;/p&gt;
&lt;blockquote&gt;
Trust me, these guys really know their stuff, and their heads are in the right place: there are no sinister motives or shady practices. It works exactly the way you’d expect, and is one of the most positive, constructive efforts I’ve seen in the online publishing world in a long time.&lt;/blockquote&gt;
&lt;p&gt;I couldn't be more excited.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>GitHub Reflog v1.5.16</title><link href="http://www.kennethreitz.com/github-reflog-v1516.html" rel="alternate"></link><updated>2011-05-16T22:35:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-05-16:/github-reflog-v1516.html/</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="https://github.com/blog/856-github-reflog-v1-5-16"&gt;Original Post on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Welcome to the &lt;strong&gt;The GitHub Reflog&lt;/strong&gt; — the weekly chronicle of
remarkable GitHub repos and community activity. For previous
editions, check out
&lt;a class="reference external" href="https://github.com/kennethreitz/github-reflog"&gt;The Reflog Archive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to the awesome work of Alexander Marshalov, the Reflog
archive is now being
&lt;a class="reference external" href="https://github.com/Amper/github-reflog"&gt;translated into Russian&lt;/a&gt;!&lt;/p&gt;
&lt;div class="section" id="featured-repo-of-the-week"&gt;
&lt;h2&gt;Featured Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/yostudios/Spritemapper"&gt;yostudios/Spritemapper&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Spritemapper is a command-line application that generates CSS
sprites from your existing CSS files. It utilizes advanced
techniques, like simulated annealing, to merge the referenced PNG
images into one and generate a new CSS file utilizing the new
sprite map.&lt;/p&gt;
&lt;p&gt;It also contains its own PNG and CSS parser. All you need is a
Python interpreter. If you've ever had to debug a PIL installation,
you know how important this is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="awesome-repo-of-the-week"&gt;
&lt;h2&gt;Awesome Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/jstrait/beats"&gt;jstrait/beats&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This project is nothing short of amazing.&lt;/p&gt;
&lt;p&gt;BEATS is a command-line audio sequencer, written in Ruby.&lt;/p&gt;
&lt;p&gt;Songs are programmed in YAML. The input files define instruments
(samples), bar sequences, and the full song structure. The whole
song can then be exported to LPCM WAV for later enjoyment /
mixing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="remarkable-repos"&gt;
&lt;h2&gt;Remarkable Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/tweetdeck/TDOAuth"&gt;tweetdeck/TDOAuth&lt;/a&gt;:
A small and elegant OAuth v1.0 implementation for iOS applications.
Written by Max Howell, of
&lt;a class="reference external" href="https://github.com/mxcl/homebrew"&gt;homebrew&lt;/a&gt; fame, this
BSD-licensed implementation strives to be a major improvement over
the other OAuth solutions available to Objective-C developers.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/sporst/SWFREtools"&gt;sporst/SWFREtools&lt;/a&gt;:
A toolset for everse engineering and performing security audits on
Adobe Flash Player and compiled SWF files. It features an SFW
Parser, SWF Minimizer, Flash Debugger, and Metrics Generator. This
GPLv2 licensed project is powered by both Java and Python.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/leftnode/get-shit-done"&gt;leftnode/get-shit-done&lt;/a&gt;:
A small script for toggling the blocking of a list of configured
domains on your system, so you can Get Shit Done™.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/microsoft-dpe/watoolkitios-lib"&gt;microsoft-dpe/watoolkitios-lib&lt;/a&gt;:
This set of libraries, written by Microsoft, allows Objective-C
developers to utilize the Azure Cloud Storage platform from an iOS
application. Check out the
&lt;a class="reference external" href="https://github.com/microsoft-dpe/watoolkitios-samples"&gt;example application repo&lt;/a&gt;
to see it in action.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/enonic/cms-ce"&gt;enonic/cms-ce&lt;/a&gt;: New
community edition of the Enonic CMS, bsaed on Java's Spring
Framework and JEE. Unlike the commercial version, the AGPLv3
licensed Community Edition lacks a plugin engine and LDAP/AD
support.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/wbsun/kgpu"&gt;wbsun/kgpu&lt;/a&gt;: This
extremely ambitious project allows the Linux kernel to offload
data-parallel computations to a CUDA-enabled GPU. It aims to &amp;quot;make
the Linux kernel truly parallelized: not only processing multiple
requests concurrently, but can also partition a single large
requested computation into tiles and do them on GPU cores.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/jiminoc/goose"&gt;jiminoc/goose&lt;/a&gt;:
Instapaper-like HTML content and article extractor, from Gravity
Labs. Written in Java, this Apache v2 licensed project will take
any url you throw at it, and return the content.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="promising-repos"&gt;
&lt;h2&gt;Promising Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/bobthecow/coda-cli"&gt;bobthecow/coda-cli&lt;/a&gt;:
Command-line tool for launching and Panic's Coda editor (similar to
TextMate's &lt;tt class="docutils literal"&gt;mate&lt;/tt&gt; command), making it a full *nix citizen. Check
out the &lt;a class="reference external" href="http://justinhileman.info/coda-cli/"&gt;project page&lt;/a&gt; to
see usage examples.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/skammer/vim-css-color"&gt;skammer/vim-css-color&lt;/a&gt;:
This epic plugin bring color to your Vim installation's CSS colors.
It currently supports RGB, RGBA, and HTML Color Names. (Note:
256-color terminal required).&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/bradfitz/campher"&gt;bradfitz/campher&lt;/a&gt;:
You can now run Perl on top of the Go stack. Seriously. This
esoteric project has quite a bit of ambition and an awesome sense
of humor.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/wavded/humane-js"&gt;wavded/humane-js&lt;/a&gt;:
An unobtrusive browser notification system, aimed to be as simple
as possible. This fully themeable system is compatibly with all JS
frameworks and browsers. Check out the
&lt;a class="reference external" href="http://wavded.github.com/humane-js/"&gt;demo page&lt;/a&gt; to see it in
action.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/brixen/poetics"&gt;brixen/poetics&lt;/a&gt;: A
native CoffeeScript interpreter, running directly on the Rubinius
VM. Need I say more?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feedback is appreciated! Send any questions, suggestions, and
anonymous tips to &lt;a class="reference external" href="mailto:reflog&amp;#64;kennethreitz.com"&gt;reflog&amp;#64;kennethreitz.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For more open source news, check out
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/explore"&gt;github.com/explore&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Requests v0.4.0 Released</title><link href="http://www.kennethreitz.com/requests-v040-released.html" rel="alternate"></link><updated>2011-05-15T22:35:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-05-15:/requests-v040-released.html/</id><summary type="html">&lt;p&gt;Requests v0.4.0 was released late last night!&lt;/p&gt;
&lt;p&gt;If you're unfamiliar with &lt;strong&gt;Requests&lt;/strong&gt;, it is an HTTP Module for Python that
strives to keep things as simple as possible. &lt;a class="reference external" href="http://python-requests.org"&gt;Learn more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is being used internally at Twitter, Inc and The Library of Congress.
If your company (or project) is using Requests internally, send me an email!&lt;/p&gt;
&lt;p&gt;Since the initial release, 3 months ago, Requests quickly became my most popular
Python project. It's approaching
&lt;a class="reference external" href="https://github.com/kennethreitz/requests/watchers"&gt;200 Watchers&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/kennethreitz/requests"&gt;on GitHub&lt;/a&gt;, and has a number
of happy repetitive users:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;&lt;strong&gt;Daniel Greenfeld&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Nuked a 1200 LOC spaghetti code library with 10 lines of code thanks to &amp;#64;kennethreitz’s request library. Today has been AWESOME!&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Kenny Meyers&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Python HTTP: When in doubt, or when not in doubt, use Requests. Beautiful, simple, Pythonic.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Rich Leland&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Requests is awesome. That is all.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Steve Pike&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;I can never remember how to do it the regular way. import requests; requests.get() is just so easy!&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="section" id="community-update"&gt;
&lt;h2&gt;Community Update&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Requests&lt;/strong&gt; now has it's own documentation website: &lt;a class="reference external" href="http://python-requests.org"&gt;python-requests.org&lt;/a&gt;, hosted by the excellent &lt;a class="reference external" href="http://readthedocs.org/"&gt;Read the Docs&lt;/a&gt; project. The User and API docs are still a work in progress.&lt;/p&gt;
&lt;p&gt;I decided to change the project tagline from &lt;em&gt;&amp;quot;Most Python HTTP Modules suck.
This one doesn't.&amp;quot;&lt;/em&gt; to &lt;em&gt;&amp;quot;Python HTTP Requests for Humans.&amp;quot;&lt;/em&gt;. While I did enjoy
the bit of personality that the previous tagline brought to the project,
there's no need for the passive agression. Only Positivity going forward.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="new-features"&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;p&gt;Version 0.4.0 features the new &lt;tt class="docutils literal"&gt;Response.history&lt;/tt&gt; attribute, which contains a
list of requests leading up to the response. If you ask for a URL, and it
bounces off of 3x 301 Redirects, those 3 requests will reside in the
&lt;tt class="docutils literal"&gt;Response.history&lt;/tt&gt; atrribute.&lt;/p&gt;
&lt;p&gt;Requests now features a wonderful Case-insensitive Header Dictionary,
so you can handle unpredictable response headers easily. One server will
respond with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;content-encoding&lt;/span&gt;&lt;/tt&gt;, while another will respond with
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Content-Encoding&lt;/span&gt;&lt;/tt&gt;. &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;r.header['content-encoding']&lt;/span&gt;&lt;/tt&gt; will return the proper
value in both scenarios.&lt;/p&gt;
&lt;p&gt;Requests now transparently supports Unicode URLs (e.g. &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;'http://ko.wikipedia.org/wiki/위키백과:대문'&lt;/span&gt;&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;We also automatically decompresses GZip'd Encoded responses, without the need
to send up an &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Accept-encoding&lt;/span&gt;&lt;/tt&gt; header.&lt;/p&gt;
&lt;p&gt;Urllib2 has a major recursion issue when HTTP BASIC Authentication is
required, but bad credentials were provided. Requests now handles this
scenario properly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="links"&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;GitHub:&lt;/dt&gt;
&lt;dd&gt;&lt;a class="reference external" href="https://github.com/kennethreitz/requests"&gt;https://github.com/kennethreitz/requests&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;PyPi:&lt;/dt&gt;
&lt;dd&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/requests"&gt;http://pypi.python.org/pypi/requests&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;PyPi Mirror:&lt;/dt&gt;
&lt;dd&gt;&lt;a class="reference external" href="http://pip.kreitz.co/pypi/requests/0.4.0/"&gt;http://pip.kreitz.co/pypi/requests/0.4.0/&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;Continuous Integration:&lt;/dt&gt;
&lt;dd&gt;&lt;a class="reference external" href="http://ci.kennethreitz.com/job/tablib-tests/"&gt;http://ci.kennethreitz.com/job/tablib-tests/&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;[&lt;a class="reference external" href="http://github.com/kennethreitz/requests"&gt;Source on GitHub&lt;/a&gt;]
[&lt;a class="reference external" href="http://pypi.python.org/pypi/requests"&gt;PyPi Listing&lt;/a&gt;]&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>New Blog: Finally Static!</title><link href="http://www.kennethreitz.com/new-blog-finally-static.html" rel="alternate"></link><updated>2011-04-21T02:45:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-04-21:/new-blog-finally-static.html/</id><summary type="html">&lt;p&gt;I've been wanting to convert my website from a WordPress-powered
application to a static one for a long time now. I tried a few different
systems, but nothing was flexible enough for my needs.&lt;/p&gt;
&lt;p&gt;I almost sat down and wrote something myself, but luckly I found
Alex Metaireau's incredible
&lt;a class="reference external" href="http://docs.notmyidea.org/alexis/pelican/"&gt;Pelican&lt;/a&gt; project. So, now
my website is statically generated with a combination of all my
favorite tools: ReStructured Text, Jinja2, Python, Git, and Jenkins.&lt;/p&gt;
&lt;p&gt;The move is far from perfect, but I'm glad I finally did it. All existing
comments are gone. There's no longer a mobile version. Many of the old
blog posts are malformed (and a big chunk should just be removed entirely).&lt;/p&gt;
&lt;p&gt;But, these things will happen in time. It feels good to start fresh.&lt;/p&gt;
</summary></entry><entry><title>GitHub Reflog v1.4.20</title><link href="http://www.kennethreitz.com/github-reflog-v1420.html" rel="alternate"></link><updated>2011-04-20T19:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-04-20:/github-reflog-v1420.html/</id><summary type="html">&lt;p&gt;Welcome to the &lt;strong&gt;The GitHub Reflog&lt;/strong&gt; — the weekly chronicle of
remarkable GitHub repos and community activity. For previous
editions, check out
&lt;a class="reference external" href="https://github.com/kennethreitz/github-reflog"&gt;The Reflog Archive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This week, we welcome Python's
&lt;a class="reference external" href="https://github.com/simplejson/simplejson/"&gt;simplejson&lt;/a&gt; module
and &lt;em&gt;The Joy of Clojure&lt;/em&gt;
&lt;a class="reference external" href="https://github.com/joyofclojure/book-source"&gt;code examples&lt;/a&gt; to
GitHub!&lt;/p&gt;
&lt;div class="section" id="featured-repo-of-the-week"&gt;
&lt;h2&gt;Featured Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/maccman/spine"&gt;maccman/spine&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Spine is a micro MVC framework for building JavaScript
applications. While similar in concept to
&lt;a class="reference external" href="https://github.com/documentcloud/backbone"&gt;Backbone.js&lt;/a&gt;, Spine
contains some key differences. It offers class inheritance,
controllers, a model system with a full ORM, and HTML5 local
storage support.&lt;/p&gt;
&lt;p&gt;Spine comes with demo
&lt;a class="reference external" href="https://github.com/maccman/spine.todos"&gt;todo system&lt;/a&gt; and
&lt;a class="reference external" href="https://github.com/maccman/spine.contacts"&gt;contact manager&lt;/a&gt;
applications to give you a feel of its capabilities. It currently
powers the JavaScript for the open source campfire-esque
&lt;a class="reference external" href="https://github.com/maccman/holla"&gt;Holla&lt;/a&gt; project.&lt;/p&gt;
&lt;div class="figure align-center"&gt;
&lt;img alt="" src="https://github.com/kennethreitz/github-reflog/raw/52de8843ddf4fec679320a29646055952457abda/ext/spine-todo.png" /&gt;
&lt;/div&gt;
&lt;p&gt;Check out the
&lt;a class="reference external" href="http://maccman.github.com/spine/"&gt;elegant documentation&lt;/a&gt; to
learn more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="awesome-repo-of-the-week"&gt;
&lt;h2&gt;Awesome Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/aarongough/flea"&gt;aarongough/flea&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Flea is a mini Lisp interpreter written in Ruby, inspired by
portions of Scheme. Obviously, this isn't designed to be used in
production for any reason. The purpose of the project is to simply
showcase the versatility of dynamic languages like Ruby.&lt;/p&gt;
&lt;p&gt;Run &lt;tt class="docutils literal"&gt;$ gem install flea&lt;/tt&gt; to give it a spin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="remarkable-repos"&gt;
&lt;h2&gt;Remarkable Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/anchepiece/statuspanic"&gt;anchepiece/statuspanic&lt;/a&gt;:
A clone of Panic's infamous
&lt;a class="reference external" href="http://www.panic.com/blog/2010/03/the-panic-status-board/"&gt;Status Board&lt;/a&gt;,
powered by PHP. It features bar charts, weather widgets, and a
countdown timer. Head over to the
&lt;a class="reference external" href="http://allynbauer.com/software/statuspanic/"&gt;example installation&lt;/a&gt;
to see it in action.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/hanwen/go-fuse"&gt;hanwen/go-fuse&lt;/a&gt;:
Native FUSE bindings for the Go programming language. Go-fuse
strives to be as fast as possible. Support for individual
filesystems isn't included (at this time), but example
implementations of zipfs and unionfs are.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/gmarik/vundle"&gt;gmarik/vundle&lt;/a&gt;: A true
plugin manager for VIM. Inspired by the ever popular
&lt;a class="reference external" href="https://github.com/tpope/vim-pathogen"&gt;pathogen&lt;/a&gt; for VIM and
&lt;a class="reference external" href="https://github.com/carlhuda/bundler"&gt;bundler&lt;/a&gt; for Ruby, Vundle
gives you the ability to search, install, update, and configure
your scripts, all from interactive mode.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="promising-repos"&gt;
&lt;h2&gt;Promising Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/boxedice/python-daemon"&gt;boxedice/python-daemon&lt;/a&gt;:
A simple Python daemonizer class. This project allows your Python
application to continue running in the background as a daemon.
Features include scheduling, a standard PID file interface, and
support for Unix, Linux and OS X.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/88mph/wpadmin"&gt;88mph/wpadmin&lt;/a&gt;: Command
line tool for WordPress administration, written in PHP. Currently,
it can manage user accounts and configuration values. In the near
future, you'll also be able to publish posts and pages right from
your terminal. There's a small todo list, so pull requests are
welcome!&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/disqus/mule"&gt;disqus/mule&lt;/a&gt;: A full
distributed test runner framework for Python, powered by Celery.
Beware, it's undergoing heavy development and is far from stable.
When it's ready, it will include out of the box support for xunit,
multiprocessing, and unittest2.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/seppo0010/redislite"&gt;seppo0010/redislite&lt;/a&gt;:
SQLite-style local database for Redis instead of SQL. This BSD
licensed project is is still in its early stages, but will be
extremely useful once it is complete. Definitely keep your eye on
it.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/dbyrne/4clojure"&gt;dbyrne/4clojure&lt;/a&gt;: An
interactive tutorial website for beginners learning Clojure
(similar to
&lt;a class="reference external" href="https://github.com/alexmchale/try.redis"&gt;Try Redis&lt;/a&gt;). There's a
bit of work to be done still, so check out the
&lt;a class="reference external" href="https://github.com/dbyrne/4clojure/issues"&gt;issues page&lt;/a&gt; for ways
to help.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feedback is appreciated! Send any questions, suggestions, and
anonymous tips to &lt;a class="reference external" href="mailto:reflog&amp;#64;kennethreitz.com"&gt;reflog&amp;#64;kennethreitz.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For more open source news, check out
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/explore"&gt;github.com/explore&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>GitHub Reflog v1.4.12</title><link href="http://www.kennethreitz.com/github-reflog-v1412.html" rel="alternate"></link><updated>2011-04-12T19:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-04-12:/github-reflog-v1412.html/</id><summary type="html">&lt;p&gt;Welcome to the fourth edition of &lt;strong&gt;The GitHub Reflog&lt;/strong&gt; — the weekly
chronicle of remarkable GitHub repos and community activity. For
previous editions, check out
&lt;a class="reference external" href="https://github.com/kennethreitz/github-reflog"&gt;The Reflog Archive&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="featured-repo-of-the-week"&gt;
&lt;h2&gt;Featured Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/apenwarr/sshuttle"&gt;apenwarr/sshuttle&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This nifty project got quite a bit of press this week, and has
already become indispensable part of my toolkit. Sshuttle calls
itself a &amp;quot;Poor Man's VPN&amp;quot;. It allows you to connect to a remote
machine as a non-privileged user and forward every port on its
network to your local machine. Once enabled, all traffic is being
routed through the server. If the server has network access to
machines that your machine cannot, you can now access those boxes
as if they were on your local network.&lt;/p&gt;
&lt;p&gt;Port forwarding with OpenSSH is hardly new, but sshuttle forwards
&lt;em&gt;all&lt;/em&gt; ports instead of only ones you specify. The only dependency
on the server is OpenSSH itself.&lt;/p&gt;
&lt;p&gt;Liftoff!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="awesome-repo-of-the-week"&gt;
&lt;h2&gt;Awesome Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/asarazan/Narwhalingus-EP"&gt;asarazan/Narwhalingus-EP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#64;asarazan found a great new use for GitHub this week. His band, The
Bristol 7's, decided to
&lt;a class="reference external" href="http://thebristol7s.wordpress.com/2011/04/10/fork-us-on-github/"&gt;publish their EP&lt;/a&gt;
under the Creative Commons license. In the spirit of open source,
he decided to put it up on GitHub!&lt;/p&gt;
&lt;p&gt;The repo includes final mixes as well as the individual audio
tracks for remixing. Pull requests welcome!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="remarkable-repos"&gt;
&lt;h2&gt;Remarkable Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/jonromero/music-as-data"&gt;jonromero/music-as-data&lt;/a&gt;:
This Clojure project offers a live programming environment for
generating music sequences. It allows you to treat the sequences as
data and apply transformations to them in live environments. Check
out the &lt;a class="reference external" href="http://mad.emotionull.com/"&gt;project page&lt;/a&gt; to learn
more.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/37signals/pow"&gt;37signals/pow&lt;/a&gt;: This
new project from 37 Signals is a zero-config development server for
Rack applications. Once you run its super simple installer, go to
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.pow&lt;/span&gt;&lt;/tt&gt; and make a symlink to your app's directory. And, that's
it! The app is now available locally at &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;http://appname.dev&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/DanielWaterworth/raphters"&gt;DanielWaterworth/raphters&lt;/a&gt;:
This new framework is for developing web applications in C. Yes,
you read correctly. If you're a C aficionado that has always
dreamed of building a modern webapp in your favorite language,
Raphters is a great place to start. It provides a simple API for
handling cookies, sessions, and templates. The resulting
applications can be deployed with FastCGI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="promising-repos"&gt;
&lt;h2&gt;Promising Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/cldwalker/tux"&gt;cldwalker/tux&lt;/a&gt;: Tux is
a Ruby shell interface for Sinatra. It gives you a simple interface
to interact with all parts of your application from the
commandline. It can directly call your helpers and views, or
generate your own request/response data.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/ded/Ender.js"&gt;ded/Ender.js&lt;/a&gt;: This new
JavaScript module is actually 8 minimal utilities smashed into one:
&lt;a class="reference external" href="https://github.com/ded/klass"&gt;klass&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/ded/qwery"&gt;qwery&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/ded/bonzo"&gt;bonzo&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/fat/bean"&gt;bean&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/ded/script.js"&gt;script.js&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/ded/Reqwest"&gt;reqwest&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/ded/emile"&gt;emile&lt;/a&gt;, and
&lt;a class="reference external" href="https://github.com/documentcloud/underscore/"&gt;underscore.js&lt;/a&gt;.
Running in at only 8KB, Ender.js combines the of all of these
powerful modules into one elegant API. Features include: a class
system, custom selector engine, DOM manipulation, events system,
asynchronous dependency loading, simple animations, and a robust
extension API. The codebase is powered by git-submodules and can be
rebuilt with Node.js.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feedback is appreciated! Send any questions, suggestions, and
anonymous tips to &lt;a class="reference external" href="mailto:reflog&amp;#64;kennethreitz.com"&gt;reflog&amp;#64;kennethreitz.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For more open source news, check out
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/explore"&gt;github.com/explore&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>GitHub Reflog v1.4.04</title><link href="http://www.kennethreitz.com/github-reflog-v1404.html" rel="alternate"></link><updated>2011-04-04T19:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-04-04:/github-reflog-v1404.html/</id><summary type="html">&lt;p&gt;Welcome to the third edition of &lt;strong&gt;The GitHub Reflog&lt;/strong&gt; — the weekly
chronicle of remarkable GitHub repos and community activity. For
previous editions, check out
&lt;a class="reference external" href="https://github.com/kennethreitz/github-reflog"&gt;The Reflog Archive&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="community-update"&gt;
&lt;h2&gt;Community Update&lt;/h2&gt;
&lt;p&gt;Last week, Apple's &lt;a class="reference external" href="https://github.com/MacRuby/"&gt;MacRuby&lt;/a&gt; project
began to officially migrate to GitHub for its development. This
week, the &lt;a class="reference external" href="https://github.com/eclipse/"&gt;Eclipse Foundation&lt;/a&gt; and
the &lt;a class="reference external" href="https://github.com/ghc/"&gt;Glasgow Haskell Compiler&lt;/a&gt; both
created official GitHub mirrors. GHC even accepts pull requests!&lt;/p&gt;
&lt;p&gt;Welcome, guys!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="featured-repo-of-the-week"&gt;
&lt;h2&gt;Featured Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/divegeek/uscode"&gt;divegeek/uscode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This small project from Shawn Willden is simple, but ambitious. It
is a repository that contains a complete, up-to-date version of the
United States Code, in the most hacker-friendly format possible:
version-controlled plaintext. The repo is updated regularly with
official modifications from the US Federal Government websites.
Curious to see what modifications were made? Run &lt;tt class="docutils literal"&gt;git diff&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The purpose of this repo is explore new ideas related to the
legislation process in the digital age. Check out
&lt;a class="reference external" href="https://github.com/divegeek/uscode#readme"&gt;the readme&lt;/a&gt; to learn
more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="awesome-repo-of-the-week"&gt;
&lt;h2&gt;Awesome Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/scoates/owty/"&gt;scoates/owty&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sean Coates found a novel use for GitHub this week: comparing beer
recipes.&lt;/p&gt;
&lt;p&gt;He's using the new
&lt;a class="reference external" href="https://github.com/blog/817-behold-image-view-modes"&gt;image compare views&lt;/a&gt;
to showcase
&lt;a class="reference external" href="https://github.com/scoates/owty/commit/f6519da85f6cfac00db8e58a9c71dd61233c97f6#owty.jpg"&gt;the difference a little yeast makes&lt;/a&gt;
in his homebrewed cream ale.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/scoates/owty/commit/f6519da85f6cfac00db8e58a9c71dd61233c97f6#owty.jpg"&gt;|MERGE|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cheers! :sparkles: :beer: :sparkles:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="remarkable-repos"&gt;
&lt;h2&gt;Remarkable Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/dotcloud/cloudlets"&gt;dotcloud/cloudlets&lt;/a&gt;:
This project is awesome. It's a tool for creating small, universal
server images under version control. The resulting images can be
exported to &amp;quot;any bootable format known to man&amp;quot; for deployment in
virtually any environment. Formats include: Xen, KVM, EC2 AMI,
Tarballs, and ol' fashioned bootable CDs. Soon, cloudlets will
offer support for full VM generation (vmkdk, xen, and qemu) and
multi-image stacks. If you're looking to create turn-key server
images for your application or platform, this is a great place to
start.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/josevalim/elixir"&gt;josevalim/elixir&lt;/a&gt;:
This is a functional language runtime built on top of Erlang. It
provides object orientation, a Ruby-esque syntax, and can
interoperate seamlessly with standard Erlang code and datatypes.
The project is still under development, but already has a large
contributor and user base. If you'd like to assist in its
development, checkout the
&lt;a class="reference external" href="https://github.com/josevalim/elixir/blob/master/ROADMAP.md"&gt;project roadmap&lt;/a&gt;
and send a pull request.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/ilektrojohn/creepy"&gt;ilektrojohn/creepy&lt;/a&gt;:
Ever wonder what personal data is floating around the web for the
world to see? Checkout creepy. Point it to all of your social
network accounts, and it displays a map filled with your past
locations. Data is fetched from a number of social APIs and photo
services. It even goes as far as to parse Geo-location tags from
uploaded image EXIF data. Creepy!&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/jordansissel/fpm"&gt;jordansissel/fpm&lt;/a&gt;:
This is an interesting project. FPM, &amp;quot;Effing Package Management&amp;quot;,
takes out all the headaches of creating &lt;tt class="docutils literal"&gt;.deb&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;.rpm&lt;/tt&gt;
packages for your own consumption. It allows you to distribute your
application in any style and configuration you want, abandoning all
distro-specific best practices. The author designed it to be as
simple as possible: &amp;quot;Here's my install dir and here are some
dependencies; please make a package&amp;quot;. This may or may not be a good
idea. Give it a try and decide for yourself :)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="promising-repos"&gt;
&lt;h2&gt;Promising Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/javisantana/whitebrd.me"&gt;javisantana/whitebrd.me&lt;/a&gt;:
This brand new project looks very promising. It's a webapp that
provides realtime collaborative sketching. It's essentially
Etherpad but for simple drawings. To try it out, open up
&lt;a class="reference external" href="http://whitebrd.me/board/6734c820-5eb8-11e0-b7ba-4040510841d9"&gt;The Official GitHub Reflog Whiteboard™&lt;/a&gt;
and start sketching!&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/atomicobject/objection"&gt;atomicobject/objection&lt;/a&gt;:
This is an MIT licensed dependency injection framework for iOS and
OSX ObjectiveC applications. It strives to be as lightweight, yet
flexible, as possible. The project is still fairly young and has a
small todo list, so forks are encouraged.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/mikeal/spider"&gt;mikeal/spider&lt;/a&gt;: This
&lt;a class="reference external" href="https://github.com/joyent/node"&gt;node.js&lt;/a&gt; project is a simple
programmatic web spider, powered by jQuery. It has a very small
code base (~200 SLOC), yet offers custom user agent strings,
connection pools, and memory cache.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feedback is appreciated! Send any questions, suggestions, and
anonymous tips to &lt;a class="reference external" href="mailto:reflog&amp;#64;kennethreitz.com"&gt;reflog&amp;#64;kennethreitz.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For more open source news, check out
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/explore"&gt;github.com/explore&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>GitHub Reflog v1.3.28</title><link href="http://www.kennethreitz.com/github-reflog-v1328.html" rel="alternate"></link><updated>2011-03-28T19:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-03-28:/github-reflog-v1328.html/</id><summary type="html">&lt;p&gt;Welcome to the second edition of &lt;strong&gt;The GitHub Reflog&lt;/strong&gt;. This is a
new weekly chronicle of remarkable GitHub repos. For previous
articles, check out
&lt;a class="reference external" href="https://github.com/kennethreitz/github-reflog"&gt;The Reflog Archive&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="featured-repo-of-the-week"&gt;
&lt;h2&gt;Featured Repo of the Week&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/koggdal/ocanvas"&gt;koggdal/ocanvas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oCanvas is a middle layer for generating Canvas regions. Instead of
dealing directly with pixels, you manage a set of display objects.
oCanvas provides an elegant API and full event system for
manipulating these objects, performing all the hard work in the
background. From there you can create, manipulate, and animate to
your heart's content.&lt;/p&gt;
&lt;p&gt;Check out the polished &lt;a class="reference external" href="http://ocanvas.org/"&gt;demo page&lt;/a&gt; to see it
in action.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="remarkable-repos"&gt;
&lt;h2&gt;Remarkable Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/evanphx/gx"&gt;evanphx/gx&lt;/a&gt;: Gx is a Git
tool that assists in merge conflict resolution. If you're using Git
properly these are hard to come by, but every once in a while, a
merge conflict is unavoidable. Git's merge resolution interface is
a little difficult to deal with sometimes, so Gx gives you a simple
interface for handling those conflicts.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/BigZaphod/Chameleon"&gt;BigZaphod/Chameleon&lt;/a&gt;:
This project's massive undertaking is to replicate Apple's
&lt;a class="reference external" href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKit_Framework/_index.html"&gt;UIKit&lt;/a&gt;,
used extensively for writing iOS apps, for OSX. It's an cleanroom
implementation that mirrors the API exactly. The project is
currently 9 months in development has about 60% UIKit coverage.
Chameleon's best feature is that it allows you to build apps that
target both iOS and OSX with the same codebase. If you're
developing OSX applications, this is definitely with taking a look
at.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/jugyo/earthquake"&gt;jugyo/earthquake&lt;/a&gt;:
This is an awesome new Twitter client for your terminal. Written in
Ruby, Earthquake features proper OAuth authentication, streaming
support, terminal colors, and tab completion. It appears to have
been implemented specifically for the recent earthquakes in Japan.
It's always great to see the open source community continuously
&lt;a class="reference external" href="https://github.com/brendanlim/Tradui"&gt;stepping up&lt;/a&gt; to assist in
times of need.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/twigkit/tempo"&gt;twigkit/tempo&lt;/a&gt;: Tempo
is zero-dependency JavaScript template engine built on top of
old-fashioned HTML. It's designed to make rendering of JSON content
as simple as possible. It currently features nested data support,
boolean conditionals, and gracefully falls back if JavaScript isn't
available.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="promising-repos"&gt;
&lt;h2&gt;Promising Repos&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/shinh/maloader"&gt;shinh/maloader&lt;/a&gt;: This
project looks very promising. It's a x86-64 Mach-O executable
loader for Linux. It can run most of the Xcode toolchain from
Linux. It can currently run Xcode's gcc-4.2, otool, dyldinfo,
dwarfdump, cpp-4.2, dsymutil, and others. Maloader plans to support
commandline applications only at this time.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/antimatter15/player"&gt;antimatter15/player&lt;/a&gt;:
This unique MP3 player is an excellent showcase of HTML5's
capabilities. Point it to a folder on your system, and it
recursively finds MP3 files, parses the ID3 tag metadata, and plays
them from the browser. Check out
&lt;a class="reference external" href="http://antimatter15.github.com/player/player.html"&gt;the demo&lt;/a&gt; to
give it a try!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feedback is appreciated! Send any questions, suggestions, and
anonymous tips to &lt;a class="reference external" href="mailto:reflog&amp;#64;kennethreitz.com"&gt;reflog&amp;#64;kennethreitz.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For more open source news, check out
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/explore"&gt;github.com/explore&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>GitHub Reflog v1.3.21</title><link href="http://www.kennethreitz.com/github-reflog-v1321.html" rel="alternate"></link><updated>2011-03-21T19:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-03-21:/github-reflog-v1321.html/</id><summary type="html">&lt;p&gt;Welcome to the first edition of The GitHub Reflog. This is a
new weekly installment chronicling awesome GitHub repos, brought to
you by &lt;a class="reference external" href="https://github.com/kennethreitz"&gt;Kenneth Reitz&lt;/a&gt;, one of
the classy gentlemen behind
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt; and a ton of
&lt;a class="reference external" href="https://github.com/kennethreitz"&gt;open source projects&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="featured-repo-of-the-week"&gt;
&lt;h2&gt;Featured Repo of the Week&lt;/h2&gt;
&lt;div class="section" id="id1"&gt;
&lt;h3&gt;&lt;a class="reference external" href="https://github.com/devstructure/blueprint"&gt;devstructure/blueprint&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is one of the coolest projects I've seen in a long time.&lt;/p&gt;
&lt;p&gt;Simply put, Blueprint reverse engineers servers. It scans your
system, records installed packages from various managers (aptitude,
ruby's gem, python's pip, etc), archives software built from
source, and records configuration file changes. It then packages
your entire server configuration into a &lt;tt class="docutils literal"&gt;bootstrap.sh&lt;/tt&gt; file with
an attached archive. You can take that bootstrap package and run it
anywhere to replicate your server setup.&lt;/p&gt;
&lt;p&gt;Then, Blueprint takes it to the next level: it generates full
recipes/manifests for both
&lt;a class="reference external" href="https://github.com/opscode/chef"&gt;Chef&lt;/a&gt; and
&lt;a class="reference external" href="https://github.com/puppetlabs/puppet"&gt;Puppet&lt;/a&gt; with the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;blueprint-create&lt;/span&gt; &lt;span class="pre"&gt;{-C&lt;/span&gt; | &lt;span class="pre"&gt;-P}&lt;/span&gt;&lt;/tt&gt; command.&lt;/p&gt;
&lt;p&gt;Of course, QA is required for the resulting recipes, but it's a
definitely a great first step for streamlining your existing
systems.&lt;/p&gt;
&lt;p&gt;Bon appétit!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="awesome-repo-of-the-week"&gt;
&lt;h2&gt;Awesome Repo of the Week&lt;/h2&gt;
&lt;div class="section" id="id2"&gt;
&lt;h3&gt;&lt;a class="reference external" href="https://github.com/drbrain/meme/"&gt;drbrain/meme&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I CAN HAS MEME? Meme is an awesome Ruby gem for generating
memegenerator.net images from the command line. It features SPARTA,
PHILOSORAPTOR, KEANU, TROLLFACE, and many more. The resulting pull
requests are definitely
&lt;a class="reference external" href="https://github.com/drbrain/meme/pull/13"&gt;worth looking at&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ meme US_POINT 'I want you' 'to merge this'
&lt;/pre&gt;
&lt;img alt="https://d3nwyuy0nl342s.cloudfront.net/img/5e625c6296a67da465ffccdb382e318a6af02d63/687474703a2f2f692e696d6775722e636f6d2f64527542422e6a7067" src="https://d3nwyuy0nl342s.cloudfront.net/img/5e625c6296a67da465ffccdb382e318a6af02d63/687474703a2f2f692e696d6775722e636f6d2f64527542422e6a7067" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="remarkable-repos"&gt;
&lt;h2&gt;Remarkable Repos&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/taitems/Aristo-jQuery-UI-Theme"&gt;taitems/Aristo-jQuery-UI-Theme&lt;/a&gt;:&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;This is not a new project, but it received a lot of attention this
week. Aristo is a
&lt;a class="reference external" href="http://taitems.github.com/Aristo-jQuery-UI-Theme/"&gt;beautiful&lt;/a&gt;
theme for &lt;a class="reference external" href="https://github.com/jquery/jquery-ui"&gt;jQuery UI&lt;/a&gt; that
emulates the elegant style of the
&lt;a class="reference external" href="https://github.com/280north/cappuccino"&gt;Cappuccino&lt;/a&gt; JavaScript
framework. jQuery UI has a bad reputation for having
less-than-desirable themes available for its widgets. Aristo
strives to fix that.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/brainsik/virtualenv-burrito"&gt;brainsik/virtualenv-burrito&lt;/a&gt;:&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;This project simplifies the
&lt;a class="reference external" href="https://github.com/pypa/virtualenv"&gt;virtualenv&lt;/a&gt;/wrapper setup in
your Python development environment. Sprinters at last week's PyCon
2011 had to spend a large amount of time setting up their
environments before they could contribute. This project aims to
remove that overhead.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/maccman/ichabod"&gt;maccman/ichabod&lt;/a&gt;:&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;This project lets you run headless WebKit JavaScript tests from the
command line. It currently offers Jasmine and QUnit testing
support. It also gives you an interactive JavaScript console that
has access to the Ruby stack.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="promising-repos"&gt;
&lt;h2&gt;Promising Repos&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/twitter/commons"&gt;twitter/commons&lt;/a&gt;:&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Twitter's internal common libraries for the JVM. Readme and build
instructions haven't been written yet, but this looks like an
extensive library suite. Everything from a
&lt;a class="reference external" href="https://github.com/memcached/memcached"&gt;memcached&lt;/a&gt; interface to
an argument parser is included. Check out
&lt;a class="reference external" href="http://twitter.github.com/commons/apidocs/index.html"&gt;the documentation&lt;/a&gt;
to learn more.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/extend/cowboy"&gt;extend/cowboy&lt;/a&gt;:&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;This &amp;quot;Small, fast, modular HTTP server&amp;quot; is implemented 100% in Erlang.
It's an ambitious project that's still in the early development
stage. Contributors are welcome!&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feedback is appreciated! Send any questions, suggestions, and
anonymous tips to &lt;a class="reference external" href="mailto:reflog&amp;#64;kennethreitz.com"&gt;reflog&amp;#64;kennethreitz.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For more open source news, check out
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/explore"&gt;github/explore&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Requests: Python HTTP Module</title><link href="http://www.kennethreitz.com/requests-python-http-module.html" rel="alternate"></link><updated>2011-02-19T01:22:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-02-19:/requests-python-http-module.html/</id><summary type="html">&lt;p&gt;I’m happy to announce the release of my latest Python module: &lt;strong&gt;Requests&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;One of the most frustrating experiences I have to face, as a Python developer, is the pain of making HTTP requests. The available APIs are insane. I have to look up everything that I want to do and constantly refer to the documentation. I skip writing fun tools from time to time, simply because I don’t want to go through the pain of making a simple PUT request with Basic Authentication.&lt;/p&gt;
&lt;p&gt;Things shouldn’t be this way. &lt;a class="reference external" href="http://www.amazon.com/gp/product/0521725968/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bookforkind-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0521725968"&gt;Not in Python&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="enter-requests"&gt;
&lt;h2&gt;Enter Requests&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
import requests
&lt;/pre&gt;
&lt;p&gt;Let’s check out the awesome new Convore API.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; r = requests.get('https://convore.com/api/account/verify.json')
&amp;gt;&amp;gt;&amp;gt; r.status_code
401
&lt;/pre&gt;
&lt;p&gt;Oops, we need to be authenticated. Let’s add our credentials and try again.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; conv_auth = requests.AuthObject('requesttest', 'requesttest')
&amp;gt;&amp;gt;&amp;gt; r = requests.get('https://convore.com/api/account/verify.json', auth=conv_auth)
&amp;gt;&amp;gt;&amp;gt; r.status_code
200
&lt;/pre&gt;
&lt;p&gt;It worked! Let’s poke around.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; r.headers['content-type']
'application/json'

&amp;gt;&amp;gt;&amp;gt; r.content
'{&amp;quot;username&amp;quot;: &amp;quot;requeststest&amp;quot;, &amp;quot;url&amp;quot;: &amp;quot;/users/requeststest/&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;9408&amp;quot;, &amp;quot;img&amp;quot;: &amp;quot;censored-long-url&amp;quot;}'
&lt;/pre&gt;
&lt;p&gt;Requests is capable of much more than this, but the API stays this simple throughout.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="features"&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;Requests strives to be as simple yet powerful as possible. It’s designed to fit the 90% use case. You might not be able to add proxies, client caching, and raw socket access, but you will have everything you need most of the time:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Extremely simple GET, HEAD, POST, PUT, DELETE requests&lt;/li&gt;
&lt;li&gt;Receive simple response header dictionary, content, and status code&lt;/li&gt;
&lt;li&gt;Module-level HTTP Auth registry&lt;/li&gt;
&lt;li&gt;Eventlet/Greenlet support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The API is quite simple:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;5 main functions: get(), head(), post(), put(), and delete()&lt;/li&gt;
&lt;li&gt;Attach params/data&lt;/li&gt;
&lt;li&gt;Add HTTP Basic Authentication with a parameter&lt;/li&gt;
&lt;li&gt;Add a dictionary of HTTP headers with a parameter&lt;/li&gt;
&lt;li&gt;Add a CookieJar with a parameter&lt;/li&gt;
&lt;li&gt;Attach File uploads with a parameter&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install Requests, simply:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ pip install requests
&lt;/pre&gt;
&lt;p&gt;Or, if you must:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ easy_install requests
&lt;/pre&gt;
&lt;p&gt;But, you really shouldn’t do that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="roadmap"&gt;
&lt;h2&gt;Roadmap&lt;/h2&gt;
&lt;p&gt;Requests currently supports CPython 2.5, 2.6, 2.7, and PyPy-c v1.4.&lt;/p&gt;
&lt;p&gt;In the future, Python 3.x will be supported. There are no intentions to support Python 2.4 and older.&lt;/p&gt;
&lt;p&gt;If you’d like to help or have a feature suggestion, fork me!&lt;/p&gt;
&lt;p&gt;[&lt;a class="reference external" href="http://github.com/kennethreitz/requests"&gt;Source on GitHub&lt;/a&gt;]
[&lt;a class="reference external" href="http://pypi.python.org/pypi/requests"&gt;PyPi Listing&lt;/a&gt;]&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Tablib v0.9.4 Released</title><link href="http://www.kennethreitz.com/tablib-v094-released.html" rel="alternate"></link><updated>2011-02-18T01:22:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-02-18:/tablib-v094-released.html/</id><summary type="html">&lt;p&gt;Tablib v0.9.4 was released today.&lt;/p&gt;
&lt;p&gt;For those unfamiliar with Tablib, it’s my format-agnostic tabular data library. To learn more, see Tablib.org.&lt;/p&gt;
&lt;p&gt;Finally, we have Python 2.5 support! This should open some new possibilities, particularly for those of you on Google App Engine.&lt;/p&gt;
&lt;p&gt;This update brings:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python 2.5 Support&lt;/li&gt;
&lt;li&gt;Internal pre-2.7 OrderedDicts&lt;/li&gt;
&lt;li&gt;AnyJSON System&lt;/li&gt;
&lt;li&gt;Secret surprise for the PEP8-strict folks&lt;/li&gt;
&lt;li&gt;Various bug fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks to tox, the codebase is now continuously tested against CPython 2.5, 2.6, 2.7, and PyPy-c v1.4.&lt;/p&gt;
&lt;p&gt;The next steps are to add:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Tablib.ext Namespace Package (for django-tablib, tablib-extras, &amp;amp;c.)&lt;/li&gt;
&lt;li&gt;Hooks System (e.g. post-append, pre-export, &amp;amp;c. )&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;[&lt;a class="reference external" href="http://tablib.org"&gt;Tablib.org&lt;/a&gt;]
[&lt;a class="reference external" href="https://github.com/kenethreitz/tablib"&gt;Source on GitHub&lt;/a&gt;]
[&lt;a class="reference external" href="http://pypi.python.org/pypi/tablib"&gt;PyPi&lt;/a&gt;]&lt;/p&gt;
</summary></entry><entry><title>Tablib Community Update</title><link href="http://www.kennethreitz.com/tablib-community-update.html" rel="alternate"></link><updated>2011-01-31T01:22:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2011-01-31:/tablib-community-update.html/</id><summary type="html">&lt;p&gt;Just wanted to give everyone a quick update on the status of Tablib and its future. Updates will be more regular in the future.&lt;/p&gt;
&lt;p&gt;For those unfamiliar with Tablib, it’s my format-agnostic tabular data library. To learn more, see &lt;a class="reference external" href="http://tablib.org"&gt;Tablib.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since its release, Tablib has been installed over 2,500 times (from PyPi alone), has 124 watchers on GitHub, and multiple contributors. It is now being used in production at major corporations and development shops throughout the world, including: The Library of Congress, National Geographic, and Discovery Channel.. If your company is using Tablib, feel free to let me know!&lt;/p&gt;
&lt;p&gt;Typical case reports include: presenting customer data, statistical data export/manipulation, sampling systems, personal finance management/calculation, and much more.&lt;/p&gt;
&lt;p&gt;The community reaction to the initial release was more than I had hoped for. My Changelog article was trending for days on HackerNews, Reddit, and GitHub. This brought quite a few emails, bug reports, and contributions. I was quite surprised, considering documentation hadn’t even been written yet!&lt;/p&gt;
&lt;p&gt;Needless to say, the project has significantly matured since. New features and infrastructure include:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Extensive documentation (&lt;a class="reference external" href="http://tablib.org"&gt;http://tablib.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Extensive Unittesting + Continuous Integration System&lt;/li&gt;
&lt;li&gt;Transposition&lt;/li&gt;
&lt;li&gt;Databook support (e.g. Excel workbooks w/ multiple sheets)&lt;/li&gt;
&lt;li&gt;Row &amp;amp; Column appends&lt;/li&gt;
&lt;li&gt;Validation hooks&lt;/li&gt;
&lt;li&gt;Advanced unicode (Python 2.x)&lt;/li&gt;
&lt;li&gt;Row objects w/ tags&lt;/li&gt;
&lt;li&gt;Section separators&lt;/li&gt;
&lt;li&gt;Dataset sorting and filtering&lt;/li&gt;
&lt;li&gt;Pickling Support&lt;/li&gt;
&lt;li&gt;Improved XLS formatting w/ header frames and newline handling&lt;/li&gt;
&lt;li&gt;No dependencies, all modules needed are vendorized&lt;/li&gt;
&lt;li&gt;Advanced format support framework&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;A handful of these features have been provided by the work of a few generous contributors.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Luke Lee&lt;/li&gt;
&lt;li&gt;Luca Beltrame&lt;/li&gt;
&lt;li&gt;Josh Ourisman&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Also worth mentioning is the excellent &lt;a class="reference external" href="https://github.com/joshourisman/django-tablib"&gt;django-tablib&lt;/a&gt; extension by Joshua Ourisman. It allows you to seamlessly generate Tablib Datasets from Django QuerySets.&lt;/p&gt;
&lt;div class="section" id="the-future-of-tablib"&gt;
&lt;h2&gt;The Future of Tablib&lt;/h2&gt;
&lt;p&gt;Right now, Tablib’s biggest weakness, ironically, is tabular data’s biggest strength: big data. If you have experience dealing with big data in Python (e.g. 8GiB+ CSV files), I’d love to get your insight on how to proceed.&lt;/p&gt;
&lt;p&gt;I will doing a lighting presentation on Tablib at PyCon 2011 in Atlanta, GA this March. I hope to increase awareness, gather feedback/suggestions, and recruit big data developers to assist.&lt;/p&gt;
&lt;p&gt;Also planned is the tablib-extras project. The plan is to support various backends, like Google Fusion Tables, and a SQLAlchemy Mapper.&lt;/p&gt;
&lt;p&gt;[&lt;a class="reference external" href="http://tablib.org"&gt;Tablib.org&lt;/a&gt;]
[&lt;a class="reference external" href="https://github.com/kenethreitz/tablib"&gt;Source on GitHub&lt;/a&gt;]
[&lt;a class="reference external" href="http://pypi.python.org/pypi/tablib"&gt;PyPi&lt;/a&gt;]&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>ShowMe v1.0.0 Released</title><link href="http://www.kennethreitz.com/showme-v100-released.html" rel="alternate"></link><updated>2010-09-16T05:41:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-09-16:/showme-v100-released.html/</id><summary type="html">&lt;p&gt;This weekend, I released a new Python module to PyPi: ShowMe
v1.0.0. ShowMe is a simple set of function decorators that give you
easy diagnose common problems in your Python applications.&lt;/p&gt;
&lt;div class="section" id="basic-usage"&gt;
&lt;h2&gt;Basic Usage&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
&amp;#64;showme.trace
def complex\_function(a, b, c,\*\*kwargs):
    ....
&lt;/pre&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; complex_function('alpha', 'beta', False, debug=True)
calling haystack.submodule.complex_function() with
   args: ({'a': 'alpha', 'b': 'beta', 'c': False},)
   kwargs: {'debug': True}
&lt;/pre&gt;
&lt;p&gt;It currently supports:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Argument call tracing&lt;/li&gt;
&lt;li&gt;Execution Time (in seconds)&lt;/li&gt;
&lt;li&gt;CPU Execution Time&lt;/li&gt;
&lt;li&gt;Docstrings&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="roadmap"&gt;
&lt;h2&gt;Roadmap&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Add &lt;tt class="docutils literal"&gt;&amp;#64;showme.locals&lt;/tt&gt; Support&lt;/li&gt;
&lt;li&gt;Add &amp;#64;showme.globals Support&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
pip install showme
&lt;/pre&gt;
&lt;p&gt;[&lt;a class="reference external" href="http://github.com/kennethreitz/showme"&gt;Source on GitHub&lt;/a&gt;]&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Tablib Dataset Library v0.6.1 Released!</title><link href="http://www.kennethreitz.com/tablib-dataset-library-v061-released.html" rel="alternate"></link><updated>2010-09-13T01:22:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-09-13:/tablib-dataset-library-v061-released.html/</id><summary type="html">&lt;p&gt;I'm pleased to announce a new Python module:
&lt;a class="reference external" href="http://github.com/kennethreitz/tablib"&gt;Tablib&lt;/a&gt;. Tablib is a
simple module for working with tabular datasets. It allows you
create tables of data using standard Python datatypes, manipulate
them, and easily export to Excel, JSON, YAML, and CSV. **Basic
Usage**: import tablib&lt;/p&gt;
&lt;pre class="literal-block"&gt;
headers = ('first_name', 'last_name', 'gpa')
data = [('John', 'Adams', 90), ('George', 'Washington', 67)]

data = tablib.Dataset(*data, headers=headers)
&lt;/pre&gt;
&lt;p&gt;You can maniuplate your data like a standard Python list: &amp;gt;&amp;gt;&amp;gt;
data.append(('Henry', 'Ford', 83))&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; print data['first_name']
['John', 'George', 'Henry']

&amp;gt;&amp;gt;&amp;gt; del data[1]
&lt;/pre&gt;
&lt;p&gt;You can easily export your data to JSON, YAML, XLS, and CSV. &amp;gt;&amp;gt;&amp;gt;
print data.json [{&amp;quot;first_name&amp;quot;: &amp;quot;John&amp;quot;, &amp;quot;last_name&amp;quot;: &amp;quot;Adams&amp;quot;,
&amp;quot;gpa&amp;quot;: 90}, {&amp;quot;first_name&amp;quot;: &amp;quot;Henry&amp;quot;, &amp;quot;last_name&amp;quot;: &amp;quot;Ford&amp;quot;, &amp;quot;gpa&amp;quot;:
83}]&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; print data.yaml
- {age: 90, first_name: John, last_name: Adams}
- {age: 83, first_name: Henry, last_name: Ford}

&amp;gt;&amp;gt;&amp;gt; print data.csv
first_name,last_name,age
John,Adams,90
Henry,Ford,83

&amp;gt;&amp;gt;&amp;gt; open('people.xls', 'w').write(data.xls)
&lt;/pre&gt;
&lt;p&gt;Excel files with multiple sheets are also supported (via the
`DataBook` object).
[&lt;a class="reference external" href="http://github.com/kennethreitz/tablib"&gt;Source on GitHub&lt;/a&gt;]
[&lt;a class="reference external" href="http://pypi.python.org/pypi/tablib"&gt;PyPi Listing&lt;/a&gt;]&lt;/p&gt;
</summary></entry><entry><title>The Setup</title><link href="http://www.kennethreitz.com/the-setup.html" rel="alternate"></link><updated>2010-08-03T00:43:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-08-03:/the-setup.html/</id><summary type="html">&lt;p&gt;I'm Kenneth Reitz, one of the two co-founders of Züm Hosting. I'm a
passionate Python developer for &lt;a class="reference external" href="http://netapp.com"&gt;NetApp&lt;/a&gt;. I
typically spend my nights developing a number of open source
projects, and my weekends architecting the web.&lt;/p&gt;
&lt;div class="section" id="what-hardware-are-you-using"&gt;
&lt;h2&gt;What hardware are you using?&lt;/h2&gt;
&lt;p&gt;My sole machine is a 2010 MacBook Pro running a Core i7 processor
at 2.66 GHz w/ 8GB of DDR3
RAM. It's 15&amp;quot; non-reflective screen runs at a beautiful 1680 x
1050. It features both a 250GB SSD and 500 GB HDD, for a total of
750GB of local storage, thanks to the
&lt;a class="reference external" href="http://www.mcetech.com/optibay/"&gt;OptiBay&lt;/a&gt;. I often have it
hooked up to one of many 23&amp;quot; LCD monitors. For general audio, I
sport a pair of Bowers &amp;amp; Wilkins P5 Headphones. If I'm in a
high-fidelity mood, I listen through a pair of open-backed SR-60s
from Grado Labs. For telephony, I have an HTC Supersonic (EVO)
running running the Nighty Android 2.2 (Froyo) CyanogenMod v6. This
also functions as a perfectly portable hotspot. I read
documentation and play arcade games on a 64GB Apple iPad (wifi). I
play a PSP Go solely for Castlevania: Symphony of the Night. I have
a large number of very powerful
&lt;a class="reference external" href="http://www.linode.com/?r=7bd5ecafdec13147c6019ca1c90884dbf994d67f"&gt;Linode&lt;/a&gt;
servers at my disposal for various projects and builds. My system
is backed up regularly to a cheap 1TB Western Digital drive. My
media archives are backed up to a 1.5TB Seagate drive. My media
exists on a NAS attached to my Netgear WNR3500L router. My code is
backed up to various Git repositories local and across the net. All
web projects and databases of relevance are backed up to Amazon S3
on a nightly basis, along with all my tweets, Flickr photos, and
Gmail messages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="and-what-software"&gt;
&lt;h2&gt;And what software?&lt;/h2&gt;
&lt;p&gt;I develop and
live on the latest build of Snow Leopard. My main Python
environment is the latest 2.7 release, along with well managed
virtualenvs for all other releases
&lt;a class="reference external" href="http://blog.mfabrik.com/2010/07/16/easily-install-all-python-versions-under-linux-and-osx-using-collective-buildout-python/"&gt;via Buildout&lt;/a&gt;.
I also employ a very large number of virtual machines, via VMWare
Fusion 3. I have a particularly efficient XP VM that is always up,
providing me with OneNote 2010. I'd do anything for Mactopia to
port OneNote to OS X. Anything. My development environment consists
of TextMate + PeepOpen, [most recently] PyCharm, SequelPro,
Titanium Mobile, Transmit, and GitX. I love using
&lt;a class="reference external" href="http://www.tuffcode.com/"&gt;HTTPScoop&lt;/a&gt; for request sniffing. My
favorite command-line utilities are: Terminal.app w/ Zsh + Git,
JoelTheLion's &lt;a class="reference external" href="http://github.com/joelthelion/autojump"&gt;autojump&lt;/a&gt;,
Defunkt's &lt;a class="reference external" href="http://github.com/defunkt/hub"&gt;Hub&lt;/a&gt; and
&lt;a class="reference external" href="http://github.com/defunkt/gist"&gt;Gist&lt;/a&gt;, Mcxl's
&lt;a class="reference external" href="http://mxcl.github.com/homebrew/"&gt;homebrew&lt;/a&gt;, nicksieger's
&lt;a class="reference external" href="http://github.com/nicksieger/jsonpretty"&gt;jsonpretty&lt;/a&gt;, and
Rtomayko's &lt;a class="reference external" href="http://github.com/rtomayko/bcat"&gt;bcat&lt;/a&gt;. On servers, I
typically run the latest Ubuntu Server release, or CentOS (but only
if I have to). I carry out heavy-duty writing with
&lt;a class="reference external" href="http://www.the-soulmen.com/ulyssescore/"&gt;Ulysses Core&lt;/a&gt;.
&lt;a class="reference external" href="http://www.acqualia.com/soulver/"&gt;Soulver&lt;/a&gt; is the best
number-crunching application around. I don't know how I lived
without it. My audio production work is carried out in Adobe
Audition CS3 and FL Studio 9. I use Adobe CS5 Master Collection for
light design work and photo retouching. Photoshop Lightroom for
kosher photography dark room work. I've been meaning to get into
Fireworks for wireframing, but haven't had the time as of late. As
for architecture work, I utilize OmniGraffle for diagraming,
Mockingbird / Balsamiq for mockups, and MindNode Pro for
mind-mapping. For note taking, as mentioned, I use OneNote 2010.
Nothing compares, except my Soft Large Squared Moleskine Notebook.
My tasks are managed with
&lt;a class="reference external" href="http://culturedcode.com/things/"&gt;Things.app&lt;/a&gt;. I can't wait till
they roll out proper syncing. If they don't do it fast enough, I'll
be switching to Macman's
&lt;a class="reference external" href="http://www.taskforceapp.com/"&gt;Taskforce&lt;/a&gt;. I use Kindle for
purchased books, and iBooks for PDF reading on the iPad. I consume
Google Reader via &lt;a class="reference external" href="http://reederapp.com/ipad/"&gt;Reeder&lt;/a&gt;, the most
beautiful application I have ever used. For Remote Desktop I use
&lt;a class="reference external" href="http://cord.sourceforge.net/"&gt;CoRD.app&lt;/a&gt;. Backups are performed
by &lt;a class="reference external" href="http://arrsync.sourceforge.net/"&gt;arRsync.app&lt;/a&gt;, a beautiful
interface for rsync. My desktop's windows are managed well with
&lt;a class="reference external" href="http://www.irradiatedsoftware.com/cinch/"&gt;Cinch.app&lt;/a&gt;. My music
library is provided by Spotify at offline, 320KBPS Ogg Vorbis
goodness. In the rare occasion that Spotify is missing an artist, I
use 320KBPS MP3s and FLAC recordings for the ultra-special tracks
(e.g. Liquid Tension Experiment). I buy my MP3s from the
(wonderful) Amazon MP3 Store. I keep my video library nice and
organized in iTunes, regardless of format, with
&lt;a class="reference external" href="http://www.iflicksapp.com/"&gt;iFlicks&lt;/a&gt;. I stream 1080 videos,
NetFlix, and BlueRay Disks with a Play Station 3 Slim. I play
emulated retro video games Wii. Best $200 I've ever spent. For
communication, I use iChat + Chax, Linkinus, Echofon, and Skype.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-would-be-your-dream-setup"&gt;
&lt;h2&gt;What would be your dream setup?&lt;/h2&gt;
&lt;p&gt;No more chords.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Unix Exit Status Code Reference</title><link href="http://www.kennethreitz.com/unix-exit-status-code-reference.html" rel="alternate"></link><updated>2010-07-13T19:51:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-07-13:/unix-exit-status-code-reference.html/</id><summary type="html">&lt;p&gt;I always find myself constantly Googling the list of unix status
codes (typically defined in &lt;tt class="docutils literal"&gt;sysexits.h&lt;/tt&gt;).&lt;/p&gt;
&lt;pre class="literal-block"&gt;
0 # successful termination 64 # base value for error messages
64 # command line usage error
65 # data format error
66 # cannot open input
67 # addressee unknown
68 # host name unknown
69 # service unavailable
70 # internal software error
71 # system error (e.g., can't fork)
72 # critical OS file missing
73 # can't create (user) output file
74 # input/output error
75 # temp failure; user is invited to retry
76 # remote error in protocol
77 # permission denied
78 # configuration error
&lt;/pre&gt;
</summary></entry><entry><title>Terminal Productivity App: AutoJump</title><link href="http://www.kennethreitz.com/terminal-productivity-app-autojump.html" rel="alternate"></link><updated>2010-07-07T03:20:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-07-07:/terminal-productivity-app-autojump.html/</id><summary type="html">&lt;p&gt;On average, I'd say I spend 65% of the workday in a terminal
session. About 95% of that time is within the same same 4
directories. &lt;tt class="docutils literal"&gt;cd foo&lt;/tt&gt; &amp;amp; &lt;tt class="docutils literal"&gt;cd bar&lt;/tt&gt; can get old. &lt;strong&gt;AutoJump&lt;/strong&gt;
is a &amp;quot;cd command that learns&amp;quot;. It tracks shell history to detect
which directories you spend the most time in, and allows you to
&lt;em&gt;jump&lt;/em&gt; to them without any directory context. It even supports
Zsh tab completion. :)&lt;/p&gt;
&lt;p&gt;From this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
cd /Users/kreitz/repos/public/gistapi\
&lt;/pre&gt;
&lt;p&gt;To this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
j gistapi
&lt;/pre&gt;
&lt;p&gt;Life is good.&lt;/p&gt;
&lt;p&gt;[&lt;a class="reference external" href="http://wiki.github.com/joelthelion/autojump/"&gt;Project Page&lt;/a&gt;]
[&lt;a class="reference external" href="http://github.com/joelthelion/autojump"&gt;Source on GitHub&lt;/a&gt;]&lt;/p&gt;
</summary></entry><entry><title>Ventures: Python Development at NetApp</title><link href="http://www.kennethreitz.com/ventures-python-development-at-netapp.html" rel="alternate"></link><updated>2010-05-26T18:15:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-05-26:/ventures-python-development-at-netapp.html/</id><summary type="html">&lt;p&gt;For the past year I've been employed at
&lt;a class="reference external" href="http://clutch-inc.com"&gt;Clutch, Inc&lt;/a&gt; in Winchester, Virginia, as
a Systems Engineer and Web Developer. I've spent most of my time
there developing content-based websites and web applications in
PHP, advanced JavaScript, Grails, and the like. I even had the
opportunity to develop the occassional Python application for
server-side data manipulation/migration. But alas, all good things
must come to an end.&lt;/p&gt;
&lt;p&gt;To that end, I have accepted a new position as a Senior Python Developer at
&lt;a class="reference external" href="http://www.netapp.com"&gt;Network Appliance&lt;/a&gt; (RTP Campus), starting
next week.&lt;/p&gt;
&lt;p&gt;One of the best parts of this opportunity will be my
ability to work remotely from my hometown of Winchester, Virginia.
I'll be setting up office in
&lt;a class="reference external" href="http://brightcowork.com"&gt;Bright Cowork&lt;/a&gt; on the walking mall.&lt;/p&gt;
&lt;p&gt;While moving from service-oriented web development to internal
tool/application development will be a change of pace, it's a very
welcome one, and I look forward to every moment of it.&lt;/p&gt;
&lt;p&gt;I plan to leave my web development efforts to my various open source projects
and client work, but on an as-need basis. My next step is to to
focus my personal efforts on a new market entirely: iPhone app
development &amp;amp; the iTunes store.&lt;/p&gt;
</summary></entry><entry><title>GistAPI.py v0.1 Released</title><link href="http://www.kennethreitz.com/gistapipy-v01-released.html" rel="alternate"></link><updated>2010-05-16T21:41:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-05-16:/gistapipy-v01-released.html/</id><summary type="html">&lt;p&gt;Today I released GistAPI.py v0.1.2. It features a highly-optimized
Gist object model and API wrapper which allows you to consume Gists
in your next Python application. GitHub just rolled out a miniature
pre-release of the
&lt;a class="reference external" href="http://develop.github.com/p/gist.html"&gt;Gist API&lt;/a&gt; last month, so
API functionality is pretty limited at the moment. More features
will be added as soon as the API is updated. ## Usage from gistapi
import *&lt;/p&gt;
&lt;pre class="literal-block"&gt;
gist = Gist('d4507e882a07ac6f9f92')

gist.description          # 'Example Gist for gist.py'
gist.created_at           # '2010/05/16 10:51:15 -0700'
gist.public               # False
gist.filenames            # ['exampleEmptyFile', 'exampleFile']
gist.files['exampleFile'] # 'Example file content.'
&lt;/pre&gt;
&lt;p&gt;&lt;a class="reference external" href="http://github.com/kennethreitz/gistapi.py/"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;
</summary></entry><entry><title>Semantic Versioning</title><link href="http://www.kennethreitz.com/semantic-versioning.html" rel="alternate"></link><updated>2010-05-09T08:46:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-05-09:/semantic-versioning.html/</id><summary type="html">&lt;p&gt;While listening to this week's episode of
&lt;a class="reference external" href="http://thechangelog.com"&gt;The Changelog&lt;/a&gt;, I came across Tom
Preston-Werner's
&lt;a class="reference external" href="http://semver.org/"&gt;Semantic Versioning Specification&lt;/a&gt;. I love
what I found. For many years, the open source community has been
plagued with version number dystonia. Numbers vary so greatly from
project to project, they are practically meaningless. This
specification seeks to put an end to this madness with a small set
of practical guidelines for you and your colleagues to use in your
next project. Included is a helpful guideline for correlating
repository tagging. In good taste, Mojombo also opened up the
website. If you'd like to contribute to the site, just fork the
repository, make your changes, and send a pull request. The way it
should be. [&lt;a class="reference external" href="http://semver.org/"&gt;Semantic Versioning&lt;/a&gt;]
[&lt;a class="reference external" href="http://github.com/mojombo/semver.org"&gt;Source on GitHub&lt;/a&gt;]&lt;/p&gt;
</summary></entry><entry><title>Dev Tool: Ghost   #manage /etc/hosts</title><link href="http://www.kennethreitz.com/dev-tool-ghost-manage-etchosts.html" rel="alternate"></link><updated>2010-03-08T08:15:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-03-08:/dev-tool-ghost-manage-etchosts.html/</id><summary type="html">&lt;p&gt;The Ruby community has really been blowing me away lately with
their array of indispensable web development tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ghost&lt;/strong&gt; is no exception to this rule. It is a simple command line
application for adding and removing 127.0.0.1 entries in your
&lt;cite&gt;/etc/hosts&lt;/cite&gt; file. I can't believe I hadn't thought of this
sooner.&lt;/p&gt;
&lt;div class="section" id="example-usage"&gt;
&lt;h2&gt;Example Usage&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
$ ghost add mydevsite.local [Adding]
mydevsite.local -&amp;gt; 127.0.0.1

$ ghost add staging-server.local
67.207.136.164 [Adding] staging-server.local -&amp;gt; 67.207.136.164

$ ghost list
Listing 2 host(s): mydevsite.local -&amp;gt; 127.0.0.1
staging-server.local -&amp;gt; 67.207.136.164

$ ghost delete mydevsite.local
[Deleting] mydevsite.local
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
$ gem install ghost
&lt;/pre&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Yes, it's really that easy. Make sure to checkout the
&lt;a class="reference external" href="http://github.com/bjeanes/ghost"&gt;GitHub Repo&lt;/a&gt; to contribute!&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Spotify in the US? Yes please.</title><link href="http://www.kennethreitz.com/spotify-in-the-us-yes-please.html" rel="alternate"></link><updated>2010-01-17T19:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2010-01-17:/spotify-in-the-us-yes-please.html/</id><summary type="html">&lt;p&gt;I spent about 8 hours last night obtaining a Premium Spotify
account in the US, and I've never been happier. As you know,
&lt;a class="reference external" href="http://spotify.com"&gt;Spotify&lt;/a&gt; is only available in the UK, Spain,
and France. So, the only way to signup for an account it to take a
trip overseas... virtually.&lt;/p&gt;
&lt;div class="section" id="step-1-signup-for-a-virtual-private-server"&gt;
&lt;h2&gt;Step 1: Signup for a virtual private server&lt;/h2&gt;
&lt;blockquote&gt;
Signup for a &lt;a class="reference external" href="http://linode.com"&gt;Linode&lt;/a&gt; account, and buya 360 VPS.
Linode allows you to choose a datacenter when you buy a VPS, and
luckily, they have a datacenter in the UK. This will run you $20 a
month.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="step-2-install-ubuntu-and-boot-your-vps"&gt;
&lt;h2&gt;Step 2: Install Ubuntu and Boot Your VPS&lt;/h2&gt;
&lt;blockquote&gt;
Install Ubuntu Server on your new british hackbox. You can SSH in
to test it out. Have fun. Make sure openssh-server is installed. ##&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="step-3-edit-hosts-file"&gt;
&lt;h2&gt;Step 3: Edit Hosts File&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Append the following lines to your &lt;tt class="docutils literal"&gt;/etc/hosts&lt;/tt&gt; file:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
127.0.0.1 spotify.com
127.0.0.1 www.spotify.com
[your vps ip] hackbox
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="step-4-open-a-reverse-ssh-forwarding-tunnel"&gt;
&lt;h2&gt;Step 4: Open a Reverse SSH Forwarding Tunnel&lt;/h2&gt;
&lt;blockquote&gt;
&lt;pre class="literal-block"&gt;
sudo ssh -C
root&amp;#64;hackbox -L 443:spotify.com:443 sudo ssh -C root&amp;#64;hackbox -L
80:spotify.com:480
&lt;/pre&gt;
&lt;p&gt;Congratulations! You're now a Brit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="step-5-create-an-account"&gt;
&lt;h2&gt;Step 5: Create an Account&lt;/h2&gt;
&lt;blockquote&gt;
While creating an account, you are prompted for you postal code. I
did some
&lt;a class="reference external" href="http://www.google.com/search?hl=en&amp;amp;safe=off&amp;amp;client=safari&amp;amp;rls=en&amp;amp;q=winchester+hampshire+office&amp;amp;aq=f&amp;amp;oq=&amp;amp;aqi="&gt;google-fu&lt;/a&gt;
and used &lt;tt class="docutils literal"&gt;SO23 8TH&lt;/tt&gt; as my postal code for Winchester, Hampshire
UK. &lt;a class="reference external" href="http://spotify.com/en/download/"&gt;Download the client&lt;/a&gt;.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="step-6-enjoy"&gt;
&lt;h2&gt;Step 6: Enjoy :)&lt;/h2&gt;
&lt;blockquote&gt;
You now have unlimited access to a library of
~8,000,000 tracks, as if they were on your own computer. Once every
two weeks, you'll have to reopen your SSH tunnels and login at
&lt;a class="reference external" href="http://spotify.com"&gt;spotify.com&lt;/a&gt; to prove you'll be good to go.&lt;/blockquote&gt;
&lt;p&gt;This restriction is lifted if you signup for a Premium account. I
highly recommend this, as it allows you to listen to your music at
320 kbps. I'd tell you how, but I'd rather enjoy the fruits of my
hard labor.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Do You Develop Software or Experiences?</title><link href="http://www.kennethreitz.com/do-you-develop-software-or-experiences.html" rel="alternate"></link><updated>2009-12-20T07:05:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-12-20:/do-you-develop-software-or-experiences.html/</id><summary type="html">&lt;p&gt;I read an
&lt;a class="reference external" href="http://www.antipope.org/charlie/blog-static/2009/12/21st_century_phone.html"&gt;interesting article&lt;/a&gt;
today on Apple's marketing strategy. A certain section stood out to
me, regarding their hardware manufacturing: &amp;gt; Apple is an
experience company. They're a high-end marque; if they &amp;gt; were in
the automobile business, they'd be BMW, Mercedes, and &amp;gt; Porsche
rolled into one. They own about 12% of the PC market in the &amp;gt;
USA... but 91% of the high end of the PC market (laptops over $999,
&amp;gt; desktops over $699).&lt;/p&gt;
&lt;p&gt;— Charlie Stross of
&lt;a class="reference external" href="http://www.antipope.org/charlie/blog-static/2009/12/21st_century_phone.html"&gt;Antipope.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;## The Point: &lt;a class="reference external" href="http://sethgodin.typepad.com/"&gt;Seth Godin&lt;/a&gt; and
&lt;a class="reference external" href="http://37signals.com/"&gt;37Signals&lt;/a&gt; both recommend marketing
yourself to the early adopters and geeks. Apple, however, does the
opposite. They market themselves to the middle market — the
incredibly non-technical. The geeks come on their own, with no
marketing needed. They love it. And this makes Apple *enormously*
successful. **Develop your software/experience for the
masses**. Make the geeks love it, but make them find it on their
own. Just a thought.&lt;/p&gt;
</summary></entry><entry><title>Facebook Lite Open to Public!</title><link href="http://www.kennethreitz.com/facebook-lite-open-to-public.html" rel="alternate"></link><updated>2009-09-10T22:05:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-09-10:/facebook-lite-open-to-public.html/</id><summary type="html">&lt;p&gt;It's official, &lt;a class="reference external" href="http://lite.facebook.com"&gt;Facebook Lite&lt;/a&gt; was
opened up to the US public about 10 minutes ago.&lt;/p&gt;
&lt;p&gt;This slimmed down version of Facebook is wonderful for those of us
on slow internet connections (or tethering from our iPhones), this
is a dream come true.&lt;/p&gt;
&lt;p&gt;Reminds me of the good ol' days, when I had to go to
&lt;a class="reference external" href="http://gmu.facebook.com"&gt;http://gmu.facebook.com&lt;/a&gt; to see my facebook friends.&lt;/p&gt;
&lt;p&gt;Here you can see it in action:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://s3.amazonaws.com/media.kennethreitz.com/facebook-lite-1.png"&gt;|image|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://lite.facebook.com"&gt;Try it out now!&lt;/a&gt;&lt;/p&gt;
</summary></entry><entry><title>Your Degree Is Worthless; Collaborate.</title><link href="http://www.kennethreitz.com/your-degree-is-worthless-collaborate.html" rel="alternate"></link><updated>2009-09-01T21:17:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-09-01:/your-degree-is-worthless-collaborate.html/</id><summary type="html">&lt;p&gt;I’ve always been a self-motivated learner as well as a free
thinker. I was never one to get involved in cliques or social
ladders. Despite the fact that I was raised being constantly told
that grades were the single most important thing in my life, I
could never accept that. So I didn’t. I just did enough to get by.
I didn’t pay attention much in class. I had no reason to. Class was
beyond boring. So I’d spend all hours of the night hacking away on
my computer, soaking in all I could, and most of the school day
sleeping during class when I could get away with it. When there was
a test, I’d try my hardest to stay awake, answer the questions as
best I could – typically earning a low C in my Honors/AP Classes,
and a low B in my “Ordinary” Classes. I found a good balance. Why
would I study for 30 hours a week to get better grades when I could
get by with 0 hours? So, I graduated. And I did the next logical
thing: I went to college. Ahh, college. The most important decision
you could ever make in your life. The time to “make it or break
it”. Where every young man goes to be become a man. So I went.
While high-school never engaged me, I assumed that courses about
career-relevant subjects would interest me in a university setting.
I was wrong. I was very, very wrong.&lt;/p&gt;
&lt;div class="section" id="college-life"&gt;
&lt;h2&gt;College Life&lt;/h2&gt;
&lt;p&gt;I studied Plato, Homer, and Socrates, Turing Machines, and
Single-State-Automata. I analyzed the progression of American
Popular Music from the 1920s to today. I learned how to draw, play
the marimba properly, and splatter paint on walls. I attempted
jujitsu. Wonderful life experience. But what does any of this have
to do with setting the foundation of a career? Nothing. At all. Of
course, the higher up you go, the more relevant the courses get to
your chosen major. But I didn’t want to wait. Especially when I was
paying $20,000 a year for this. It was mostly useless information.
The average college education in America costs 9 cents a minute.
Every minute. Every day. A complete waste. And I was working 35
hours a week as a graphics design intern, working at odd hours of
the night, attempting to pay for all of this. It was impossible,
and I was unengaged.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-plunge"&gt;
&lt;h2&gt;The Plunge&lt;/h2&gt;
&lt;p&gt;So, after totally losing
interest in class or anything related to it, I gave up and dropped
out. I didn’t want to get further in debt. So I moved back home,
defeated, and tried my hardest to get my life back in order. I got
my high-school job back at McDonald’s. I worked harder than I ever
have in my life. I didn’t have anything else better to do, so I
worked as much as I could all the time. I worked one 65 hour week -
but that got old really fast. I was again, unengaged. Then, one
day, I quit McDonald’s without notice. Not best practice of
course, but I didn’t want to spend any more time there. It’s
strange what a terrible work environment it is. After a few short
weeks, you begin to think there isn’t anything outside those walls.
It was clear that it wasn’t getting me anywhere, so I set out with
my laptop to try to find something better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="how-it-all-turned-around"&gt;
&lt;h2&gt;How It All Turned Around&lt;/h2&gt;
&lt;p&gt;I spent a lot of time on some freelance
websites, where you bid for odd jobs, usually settling for some
ridiculously low amount of money here and there. That didn’t last
long. I remembered coming across a guy on Twitter from my hometown,
Winchester, Virginia, who was quite into the internet and
technology. That’s pretty rare in these parts, so I looked him up.
What I found was a local &lt;a class="reference external" href="http://brightcowork.com"&gt;cowork&lt;/a&gt;
center. I went and checked out the cowork, and what I found blew my
mind. In this little building off the historic old-town walking
mall was a room. Inside: the COO of a major internet company, tech
consultants, graphic designers, writers, author, bloggers,
freelancers, and so much more. I met everyone in and around town. I
sat in on think tank lunches. People cared about what I had to say.
We collaborated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="collaboration-is-everything"&gt;
&lt;h2&gt;Collaboration is Everything.&lt;/h2&gt;
&lt;p&gt;For the first time in my life, I was meeting
interesting people with awesome experience, willing to share and
collaborate what they have learned with me. And I did the same. I
soaked in endless amounts of information. One simple room full of a
few people turned on some switch in me that the education system
had failed to do year after year after year: teach me something. I
was finally engaged. *Fully* engaged. As soon as I realized that,
my entire life changed. I started thriving on my own, getting
dozens of clients. Suddenly, I had a life with significantly less
stress and worry. No tuition fees! I realized how valuable my
skills were and how I didn’t have to be part of the institution if
I didn’t want to be. I rose above. I am now a Web Applications
Developer at a respectful technology firm. No degree. No debt. Only
an open mind. I gain more knowledge and experience in a single
workday than I did during my entire college career. I’m in the real
world. And I’m loving every minute of it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="in-conclusion"&gt;
&lt;h2&gt;In Conclusion&lt;/h2&gt;
&lt;p&gt;Looking back, I’m comfortable saying that dropping
out of college has been the best decision I’ve ever made. If I
would have gone through the entire education program, what would I
have to show for it? $150,000 in debt, a piece of paper, and four
years less of your life. No real experience. No connections. Just a
piece of paper. And nothing more. Please bear these things in mind
before you decide to spend $150,000 on a bachelor’s degree in a
field you’re not so certain about. Personally, I’d rather spend
that money on something that will actually benefit me: like a
house.&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>The Call for an Open Source Social Network</title><link href="http://www.kennethreitz.com/the-call-for-an-open-source-social-network.html" rel="alternate"></link><updated>2009-08-16T20:16:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-08-16:/the-call-for-an-open-source-social-network.html/</id><summary type="html">&lt;p&gt;Lately, I've been tossing some ideas around that I feel would
benefit the Social Web as a whole. It’s been going through some
rough times lately, and I think it’s time for a change. Or so I
thought. My first idea was to create a site that was rather
decentralized, allowing all of your content to exist on other
sites, but still allowing for you to interact without locking a
user in. As it turns out, this site already exists. It is called
&lt;a class="reference external" href="http://friendfeed.com/kennethreitz"&gt;FriendFeed&lt;/a&gt;.
&lt;em&gt;`I love FriendFeed &amp;lt;http://kennethreitz.com/blog/friendfeed-is-awesome/&amp;gt;`_&lt;/em&gt;.
About a week after I decided that I wanted to get into it,
&lt;a class="reference external" href="http://kennethreitz.com/blog/friendfeed-is-awesome/"&gt;Facebook decided to purchase it&lt;/a&gt;.
How sad. They claim that it will still be up and running, but we’ll
see if that proves to be the case (I have my fingers crossed).
Pownce (which was powered by Python / Django) was shut down when it
was purchased. I pray this not be the case. Think about this now:
&lt;strong&gt;Why is that even an option&lt;/strong&gt;? Social networking is all about
community and building tribes – So why do we need to have an
organization in charge of our chosen communication platform?
&lt;strong&gt;Here is my proposal&lt;/strong&gt;: Create a community-driven,
community-developed, and community-controlled social networking
site that is truly open source. The community could take care of
everything from feature development to content control. No random
shutting down, buy-outs, or merges. No more random change of
Privacy Policies or Content Ownership battles. No more worries. The
only group of people who would be benefitted would be the community
itself, not some company. An open minded network full of open
minded people working for the better of the community. # The Open
Web of Flow&lt;/p&gt;
&lt;div class="section" id="step-one-solid-platform-choice"&gt;
&lt;h2&gt;&lt;strong&gt;Step One&lt;/strong&gt;: Solid Platform Choice&lt;/h2&gt;
&lt;p&gt;The platform choice is the most important. You've seen what happens
when the wrong tool is chosen for the job: look at Twitter: Bad
Planning. We're all familiar with the Fail Whale but we shouldn't.
At all. So what do we use? There's an array of options. .NET? HAHA!
Did you know that there's even
&lt;a class="reference external" href="http://membertomember.com/"&gt;a social platform built on top of Microsoft's Sharepoint&lt;/a&gt;?
I bet you didn't. I've installed it a number of times. It's
fantastic (for people who need it). But we don't. At all. What type
of open source project aside Mono is driven by NET developers
anyway? They are in an entirely different mindset than us. Anyway,
the answer is obvious: Django on a LAMP Stack (Linux + Apache +
MySql + Python). We can all agree that Python is freaking amazing.
And it's certianly not going anywhere any time soon. I think google
has proven time-and time again that Python is the language for just
about any job. And when Google's unlayden-swallow project is
complete, all (typically negligible) performance issues will be
eliminated. Done. ### &lt;strong&gt;Step Two&lt;/strong&gt;: Basic Information Architecture&lt;/p&gt;
&lt;p&gt;We need to decide how the whole system will work. FriendFeed has an
excellent system in place. Lets use it. Users can tie everything in
from all of their other websites and steam it on their profile, and
display it all on one page. Everything's streamlined, commentable,
hookable, and readily accessible. Google Profiles rock. But that is
definitely an abandoned project. Lets mix that with a
FriendFeed-style activity stream. Done. ### &lt;strong&gt;Step Three&lt;/strong&gt;:
Sustainability, Audience, and Accessibility&lt;/p&gt;
&lt;p&gt;How will we pay for it? How will we get people to contribute? How
will be get people to use it? Answer: Twitter is getting old and
it's getting old fast. It's time for something new. Lets blow them
away and they will ALL hop on board. Allow for easy
external-account migration and account creation and we'll be
golden. ### &lt;strong&gt;Step Four&lt;/strong&gt;: Technical Planning and Engineering&lt;/p&gt;
&lt;p&gt;This is all the stuff end users don't have to worry about.
Performance. Design. System Administration. Database Engineering.
The geek stuff. I mean come on guys, how awesome would it be to be
able to make a commit to the Twitter live SVN Branch? Epically
awesome. ### &lt;strong&gt;Step Five&lt;/strong&gt;: Community + Collaboration&lt;/p&gt;
&lt;p&gt;Once the community gets going, there will be no stopping it. In
conclusion, think about what we have to lose? Are you with me?&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>What's In a Design?</title><link href="http://www.kennethreitz.com/whats-in-a-design.html" rel="alternate"></link><updated>2009-08-09T05:16:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-08-09:/whats-in-a-design.html/</id><summary type="html">&lt;p&gt;Disclaimer: I am &lt;strong&gt;not&lt;/strong&gt; an Apple fanboy. Apple makes a fortune off
of &lt;a class="reference external" href="http://www.squidoo.com/sheeple"&gt;speeple&lt;/a&gt;. An Apple FanBoy
blindly follows everything the cult leader, Steve Jobs has to say.
They go out and purchase every iProduct that Apple realeases and
does so with a smile on their face, not realizing that over the
course of four years, they have
&lt;a class="reference external" href="http://calacanis.com/2009/08/08/the-case-against-apple-in-five-parts/"&gt;spent about $20,000&lt;/a&gt;
on Apple products alone. They leak photos of an upcoming product
with incredibly low resolution so the masses can pick and decipher
the image, spending countless hours just trying to imagine what
that mysterious new button does. And people do it! They completely
take advantage, but rightfully so. Who could blame them? They are,
after all, a business. It would be foolish for them not to, because
that FanBoy pays thousands of dollars to watch a 3 hour long
commercial, and they love it! They love OSX for no apparent reason
other than they are told to. They go out and buy every single new
iPhone the day that it comes out, when there's clearly nothing
wrong with the one they had. Year after year, they pour more and
more money into their investment in nothing more than a brand that
they thing will change who they are as a person. They want to be
Steve Jobs. They write endless posts about how much money they
spend on Apple products every month, and just can't wait to get
their hands on the next one. This is not that post and I am not
that guy. &lt;img alt="image" src="http://pcmacsmackdown.com/wp-content/uploads/2009/01/apple-logo1.jpg" /&gt; I do, however, believe that my recently purchased
&lt;a class="reference external" href="http://kennethreitz.com/blog/i-finally-got-a-macbook/"&gt;13&amp;quot; Unibody MacBook Pro is the greatest laptop ever manufactured&lt;/a&gt;
on Earth to date. But not because Apple made it. That's irrelevant.
Now please, don't get me wrong: I love Apple. And that's because,
they have a &lt;strong&gt;superior&lt;/strong&gt; operating system and they put an
extraordinary amount of design and thought into every nook and
cranny of every system that they release. This system is designed
well. &lt;em&gt;Incredibly&lt;/em&gt; well. On a side note, I firmly believe that OSX
is the greatest desktop operating system of all time, and I see no
chance of this changing any time soon. From many different
standpoints (End User, Prosumer, Developer, Newbie) this holds
true. I am a fan and follower of one thing and one thing only:
Design. And, for now, Apple hands-down has the greatest sense of
design, both software and hardware in my opinion. But if something
else comes along made by someone else, I'll be sure to give that a
try with an open mind. :)&lt;/p&gt;
</summary></entry><entry><title>I Finally Got a MacBook</title><link href="http://www.kennethreitz.com/i-finally-got-a-macbook.html" rel="alternate"></link><updated>2009-08-07T05:56:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-08-07:/i-finally-got-a-macbook.html/</id><summary type="html">&lt;p&gt;Yesterday I stopped by the Apple store in Fair Oaks Shopping Center
in Fairfax, VA and finally purchased a MacBook. I've been wanting
one for quite a while – ever since I fell deeply in love with OS X
after adopting an old 12&amp;quot; G4 PowerBook I've been using for the past
5 months.&lt;/p&gt;
&lt;p&gt;I decided to get the 2.5 GHz 13&amp;quot; MacBook Pro. This will be my
full-time machine for the next 4+ years hopefully. With specs this
good and a case this sturdy, I see no reason why it shouldn't last
me for years to come.&lt;/p&gt;
&lt;p&gt;I am thoroughly pleased with the purchase so far. If you've been
planning on getting a MacBook, &lt;em&gt;now is the time to get one&lt;/em&gt;. The
base line 13&amp;quot; Aluminum Pro model is only $1100 right now –&amp;nbsp;cheaper
than most of the refurbished polycarbonates with lower specs.
Anyway, I'll post lists of my software choices (including TextMate
Plugins and Bundles) soon for those interested. Stay tuned!&lt;/p&gt;
</summary></entry><entry><title>Back to What I Really Love</title><link href="http://www.kennethreitz.com/back-to-what-i-really-love.html" rel="alternate"></link><updated>2009-07-21T11:46:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-07-21:/back-to-what-i-really-love.html/</id><summary type="html">&lt;p&gt;A couple of months ago, I took a position at a company that tailors
Microsoft SharePoint solutions. The business model was very strong
(and successful), the work was challenging, and there was lots of
opportunity. At the end of the day though, I just couldn't get past
one thing: Microsoft and.NET. This is not stuff that I wanted to
spend the rest of my life. The company offered very generous
compensation for Microsoft Certification – but what good does that
do me? I could do it, but it would only be for the money. I love
working with software of all kinds, but the development I was doing
did not sharpen my skills in any way. So, I decided that the longer
I stayed, the more I would simply be delaying my leaving. So
another opportunity came up, and I decided to take it. I am now a
developer working with PHP, Symfony, Java, Groovy, Grails, Apache,
and more. The list grows every day. Now life is good. It's never
been better in fact.&lt;/p&gt;
</summary></entry><entry><title>Wasted Talent</title><link href="http://www.kennethreitz.com/wasted-talent.html" rel="alternate"></link><updated>2009-07-15T18:30:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-07-15:/wasted-talent.html/</id><summary type="html">&lt;p&gt;I'd say that 95% percent of the students that I met at George Mason
University my Freshman year had &lt;em&gt;no idea&lt;/em&gt; why they were even there.
This is so sad.&lt;/p&gt;
&lt;p&gt;For me, going to college was more about getting out of the house
than anything else. And it worked. I did get out of the house. And
I learned a lot. I found my passion.&lt;/p&gt;
&lt;p&gt;Other students worked their butts off trying to take as many
credits as possible, and when asked what they want to do for a
living they don't have the slightest idea. Why would you go to
college if you don't even know what you want to major in? I would
think that spending all that money would be in order to achieve a
goal, but apparently not.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;They are just along for the ride.&lt;/em&gt;&lt;/p&gt;
</summary></entry><entry><title>Fallibilism</title><link href="http://www.kennethreitz.com/fallibilism.html" rel="alternate"></link><updated>2009-07-15T05:11:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-07-15:/fallibilism.html/</id><summary type="html">&lt;p&gt;Everyone seems to think that they are always right. It's pretty
funny when you think about it. Because they aren't. At all. That's
why I'm a falliblist. I believe that others are often right, and
since I'm human, and prone to error, I'll always consider
&lt;em&gt;anything&lt;/em&gt; that anyone else has to say.
But hey, &lt;em&gt;I could be wrong&lt;/em&gt;. :)&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://xkcd.com/610/"&gt;|image|&lt;/a&gt;&lt;/p&gt;
</summary></entry><entry><title>Revolution vs. Innovation</title><link href="http://www.kennethreitz.com/revolution-vs-innovation.html" rel="alternate"></link><updated>2009-07-15T01:08:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-07-15:/revolution-vs-innovation.html/</id><summary type="html">&lt;p&gt;I've been thinking alot about this cloud-computing &amp;quot;movement&amp;quot; that
has been a buzz word for the past year and half or so. Being able
to access anything from anywhere? Awesome, but
&lt;em&gt;I can do that now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I don't really get it why everyone's like &amp;quot;oh this will totally
change computing as we know it&amp;quot;. I beg to differ. Perhaps it will
change the way we develop, or organize. But not how Desktops sell.
Or eliminate the need for desktop software. The desktop is not
going to die. Not from Azure, at least.&lt;/p&gt;
&lt;p&gt;Amazon has EC2, Microsoft has Azure, and Google has AppEngine.
These are fantastic tools, &lt;em&gt;but they are nothing new –&lt;/em&gt; Just
something someone else thought up, executed properly – followed
through and improved upon.&lt;/p&gt;
&lt;p&gt;Bill Gates came up with the idea of a true Software Company. This
was revolutionary. Apple took Bill's model, and innovated. They
improved upon it. And look at what's happening.&lt;/p&gt;
&lt;p&gt;I really doubt that Google's new OS is going to bring us anything
we don't have already. I do think, however, that
&lt;em&gt;it will build on things we already have.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When Chrome came out, it didn't offer anything that we didn't
already have. Sure it's a fantastic browser, and I don't want to
discount that. But the ability to run &amp;quot;web apps&amp;quot; as applications is
nothing new. I had been using
&lt;a class="reference external" href="http://labs.mozilla.com/2007/10/prism/"&gt;Mozilla's Prism&lt;/a&gt; for at
least a year before Chrome was announced. And on OSX I had been
using &lt;a class="reference external" href="http://fluidapp.com/"&gt;FluidApp&lt;/a&gt;, which is like Prism on
Crack.&lt;/p&gt;
&lt;blockquote&gt;
It seems like the smart thing to do in the tech world nowadays is
to follow through with great ideas – even if they aren't yours.&lt;/blockquote&gt;
&lt;p&gt;Mozilla's team came up with the idea of running web apps at
application with SSB's (single site browsers), but implementation
of Prism was slow, and incredibly buggy. They didn't follow
through. Google did. and Google won.&lt;/p&gt;
&lt;p&gt;Maybe I don't need to come up with a revolutionary idea. Maybe I
just need to be innovative.&lt;/p&gt;
</summary></entry><entry><title>What Seperates?</title><link href="http://www.kennethreitz.com/what-seperates.html" rel="alternate"></link><updated>2009-07-15T00:28:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-07-15:/what-seperates.html/</id><summary type="html">&lt;p&gt;I want my thoughts to be heard. I want to share the things I find
on the web every day. I want to be a part of a community. I want to
lead the community.&lt;/p&gt;
&lt;p&gt;That's why I'm here, and that's why I'm writing this.&lt;/p&gt;
</summary></entry><entry><title>Instapaper: Best Web App Ever Created</title><link href="http://www.kennethreitz.com/instapaper-best-web-app-ever-created.html" rel="alternate"></link><updated>2009-07-13T22:54:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-07-13:/instapaper-best-web-app-ever-created.html/</id><summary type="html">&lt;p&gt;Out of all the startup applications that I have ever used,
&lt;a class="reference external" href="http://instapaper.com"&gt;Instapaper&lt;/a&gt; (from the creators of
micro-blogging site &lt;a class="reference external" href="http://tumblr.com"&gt;Tumblr&lt;/a&gt;) is by far the
most innovative and useful. I use it on a daily basis. It not only
saves me hours upon hours of time, but it allows me to focus more
on the task at hand and boosts my productivity levels through the
roof.&lt;/p&gt;
&lt;p&gt;Whenever I'm surfing the web, I have a bad habit of clicking open
new tabs almost constantly. It's not uncommon for me to easily have
over 60 tabs open, and in the process of sorting through all these
wonderful links, the task at hand drowns in a sea of information.&lt;/p&gt;
&lt;p&gt;Well, I don't have this problem anymore, thanks to Instapaper. When
I find something interesting online now, and it's not related to
the task at hand, I hit the nifty &amp;quot;read later&amp;quot; bookmarklet. This
ads it to my list of unread marertial on Instapaper.com. I can go
there at any time and read any of the pages that I didnt' have time
to read before!&lt;/p&gt;
&lt;p&gt;Seriously guys, this is amazing.&lt;/p&gt;
&lt;p&gt;What's better yet, is that they have an iPhone app. I can read my
synched list of hundreds of unread pages at any time in
Kindle-quality formated pages. Even without an internet
connection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surely life doesn't get better than this.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;`Instapaper &amp;lt;http://instapaper.com&amp;gt;`_&lt;/strong&gt;&lt;/p&gt;
</summary></entry><entry><title>The Universal Flaw in Commercial-Based OS's</title><link href="http://www.kennethreitz.com/the-universal-flaw-in-commercial-based-oss.html" rel="alternate"></link><updated>2009-07-10T21:24:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-07-10:/the-universal-flaw-in-commercial-based-oss.html/</id><summary type="html">&lt;p&gt;Designers and Developers around the world, I present to you the
flaw prevalent in all of today's commercial operating systems. This
is not a security hole, nor is it a CPU-capping bug. It's more of a
world-view. We're simply looking at things the wrong way.
&lt;strong&gt;What ever happened to the days when a computer was a *tool*, rather than an *experience*?&lt;/strong&gt;
Nowadays, computers are viewed by the public as a way of expressing
oneself. Don't get me wrong, a computer can be all of that and
more. Certainly, I find a level of solace and self-identity in my
software/hardware setup. But, a computer, more primarily, is so
much more than that. A computer, in today's modern consumerist
mindset, is a box that runs applications that are made by other
people. You will use the applications either because you think it
will enhance your quality of life, make you more productive, cure
you from boredom, or just be plain &lt;em&gt;neat&lt;/em&gt;. No other options exist,
just the software that big-name companies produce. Sure, this
method does sell well and, in the scheme of things, makes a company
a large amount of money in a short amount of time (which is the
point of a business, is it not?), but perhaps those big-name
companies should think a little more long-term for the sake of us
all. What does this method truly accomplish? It makes people buy
lots of computers that have power way beyond practicality. This, in
term, makes software development freeze. In case you haven't
noticed, we can't do much with computers nowadays that we couldn't
do 10 years ago, except perhaps check our bank accounts online, and
that's hardly a major breakthrough rather than an new-found
application to keep everyone's interest. It self-destructs in the
end when you think about it. And this, my friends, is the central
heart of our problem. In our &amp;quot;ever-changing&amp;quot; world of computer
software, there is little to be found that is truly new or
exciting. We have a bad habit of putting a new face on an old
concept and calling it by a different name, when, in reality, we've
run out of good ideas.&lt;/p&gt;
</summary></entry><entry><title>Django Remote Development Server</title><link href="http://www.kennethreitz.com/django-remote-development-server.html" rel="alternate"></link><updated>2009-05-08T04:03:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-05-08:/django-remote-development-server.html/</id><summary type="html">&lt;p&gt;&lt;img alt="image" src="http://media.kennethreitz.com/images/django-logo.png" /&gt; If you've worked with Django much at all, I'm sure you've
had this problem: wanting to access the built-in development
webserver remotely. Typically, this integrated mini-server ignores
all requests from any IP Address other than 127.0.0.1 . If you run
the following command, however, it will be accessible remotely.
VERY useful for remote dev work.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
./manage.py runserver 0.0.0.0:8000
&lt;/pre&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://technorati.com/tag/Development"&gt;Development&lt;/a&gt;,
&lt;a class="reference external" href="http://technorati.com/tag/Django"&gt;Django&lt;/a&gt;,
&lt;a class="reference external" href="http://technorati.com/tag/Python"&gt;Python&lt;/a&gt;&lt;/p&gt;
</summary></entry><entry><title>Remote TextMate Development via SSH and Rsync</title><link href="http://www.kennethreitz.com/remote-textmate-development-via-ssh-and-rsync.html" rel="alternate"></link><updated>2009-05-08T00:39:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-05-08:/remote-textmate-development-via-ssh-and-rsync.html/</id><summary type="html">&lt;p&gt;I am a huge fan of
&lt;a class="reference external" href="http://kennethreitz.com/blog/if-textmate-42/"&gt;TextMate&lt;/a&gt;. In my
opinion, it is by far the greatest text editor ever conceived by
mankind. It has a couple of shortcomings, however. One of which is
that it has no built-in FTP or SFTP support. Remote file editing is
a bit of a bear here if you like to view folders in the project
drawer on the side. &lt;img alt="image" src="http://media.kennethreitz.com/images/textmate-logo.png" /&gt;
&lt;strong&gt;Options for remote editing with TextMate:&lt;/strong&gt; - Cyberduck FTP
client - MacFUSE + SSHFS - Rsync + SSH&lt;/p&gt;
&lt;div class="section" id="cyberduck"&gt;
&lt;h2&gt;Cyberduck&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The `Cyberduck &amp;lt;http://david.olrik.dk/files/Synchronize_remote_directory_rsync_ssh.zip&amp;gt;`_ option is very very useful. While in the FTP client, you simply click &amp;quot;Edit in TextMate&amp;quot; and the client will download the file for you, open it in your editor, and – here's the awesome part – it automatically uploads the file every time you save it. This works great when working with one file at a time. The drawback, however, is when working with large projects. Toggling between many files can be an albatross without the project drawer (cyberduck understandably doesn't allow you to edit an entier folder), so MacFUSE is the next logical choice.&lt;/strong&gt;
## MacFUSE + SSHFS&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.pqrs.org/tekezo/macosx/sshfs/"&gt;MacFUSE&lt;/a&gt; + SSHFS works
great, and allows you to mount an SSH folder as a mountpoint on
your local system. VERY USEFUL. You can open this folder with
TextMate. This is perfect for smaller projects. However, with
larger projects, this makes opening the folder in TextMate almost
unbearable as it checks the status of every single file. Too slow
:P ## Rsync + SSH&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So here's the final solution: Rsync + SSH. This allows me to automatically sync my working copy with my server and allow for snappy file interactions without having insane latencies for starting up and bandwidth hogging!&lt;/strong&gt;
To remotely sync over SSH, run the following code: rsync -avz -e
ssh &lt;a class="reference external" href="mailto:remoteuser&amp;#64;remotehost"&gt;remoteuser&amp;#64;remotehost&lt;/a&gt;:/remote/dir /target/dir/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hint&lt;/strong&gt;: If your remote working copy is a subverson checkout, you
can add --cvs-exclude&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;&amp;lt;string&amp;gt;&lt;/tt&gt;, line 2); &lt;em&gt;&lt;a href="#id1"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Duplicate explicit target name: &amp;quot;textmate&amp;quot;.&lt;/div&gt;
&lt;p&gt;into the rsync parameters, and it will exclude the &amp;quot;.svn&amp;quot; folders!
You can then open this directory in TextMate and make all the
changes you want, and then sync after ! There is also a wonderful
TextMate Bundle for
&lt;a class="reference external" href="http://david.olrik.dk/files/Synchronize_remote_directory_rsync_ssh.zip"&gt;Remote Rsync + SSH within TextMate&lt;/a&gt;.
&lt;a class="reference external" href="http://technorati.com/tag/Development"&gt;Development&lt;/a&gt;,
&lt;a class="reference external" href="http://technorati.com/tag/OSX"&gt;OSX&lt;/a&gt;,
&lt;a class="reference external" href="http://technorati.com/tag/rsync"&gt;rsync&lt;/a&gt;,
&lt;a class="reference external" href="http://technorati.com/tag/TextMate"&gt;TextMate&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Crossing Over to the Dark Side</title><link href="http://www.kennethreitz.com/crossing-over-to-the-dark-side.html" rel="alternate"></link><updated>2009-05-06T13:49:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-05-06:/crossing-over-to-the-dark-side.html/</id><summary type="html">&lt;p&gt;Well, I've done it. I've crossed over. To .NET.&lt;/p&gt;
&lt;p&gt;I will continue to be a complete open-source junkie of course, but
during the work hours, I will no longer be working with PHP and
Python. I will now be working with .NET and SharePoint.&lt;/p&gt;
&lt;p&gt;I was presented with a rather good reason for this actually:&lt;/p&gt;
&lt;p&gt;&amp;quot;Using SharePoint gives our clients a tremendous amount of security
– they can trust that if, for whatever reason, something were to
happen to us, their software could still be serviced by someone
else.&amp;quot; That's certainly justifiable and understandable. That's a
pretty good idea actually. I like it.&lt;/p&gt;
&lt;p&gt;After looking into ASP.NET, I was actually quite surprised. The
code is a lot cleaner than PHP. It looks rather powerful actually.&lt;/p&gt;
&lt;p&gt;Anyway, that's why I've crossed over. No hard feelings :)&lt;/p&gt;
</summary></entry><entry><title>Software Development vs. Computer Science</title><link href="http://www.kennethreitz.com/software-development-vs-computer-science.html" rel="alternate"></link><updated>2009-05-05T20:52:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-05-05:/software-development-vs-computer-science.html/</id><summary type="html">&lt;p&gt;Most developer job applications that I see have a &amp;quot;BS in Computer
Science or equivalent experience&amp;quot; requirement.&lt;/p&gt;
&lt;p&gt;During my studies in Computer Science at
&lt;a class="reference external" href="http://kennnethreitsz.com/was-college-worth-it/"&gt;George Mason University&lt;/a&gt;,
though short, I learned a number of things. One of them was what a
waste it was to learn such higher math in my field. I want to
develop software, not develop the most cunning-edge
earth-shattering algorithms. I don't want to reinvent ssh or find a
better way to implement pgp keys. Of course, those things are
necessary in certain fields, but not in mine.&lt;/p&gt;
&lt;p&gt;I was taught that Programming is to Computer Science as a Telescope
is to Astronomy. Its a tool to get to a means. If this is true,
than why wasn't I thought how to make software?&lt;/p&gt;
&lt;p&gt;Many Software Developers also have degrees in Electrical
Engineering. Why is this? A CS degree doesn't seem to quite fit
either. Perhaps we should make a separate degree for Software
Development?&lt;/p&gt;
&lt;p&gt;Computer Science should be separated from Software Development.
They should be two different Degrees.&lt;/p&gt;
&lt;p&gt;When I realized this, I started spending my time focusing on design
rather than math. I learned a great deal of things from color
theory to relational spacing and I found myself a new home: web
design. It's a beautiful field. I started to spend my own time
learning software development, rather than spending hours studying
Calc 2.&lt;/p&gt;
</summary></entry><entry><title>The Ultimate RSS Feed Reader</title><link href="http://www.kennethreitz.com/the-ultimate-rss-feed-reader.html" rel="alternate"></link><updated>2009-04-23T01:35:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-04-23:/the-ultimate-rss-feed-reader.html/</id><summary type="html">&lt;p&gt;What would the ultimate RSS Reader have? Hmmm.... &lt;strong&gt;Features:&lt;/strong&gt; -
Easy-to-manage import/export - Available anywhere and in a variety
of formats - Easy access to both urls and inline-viewing abilities
- Customizable fonts - Takes up less than 200 MB of RAM (this rules
out all Adobe Air Applications) - Auto feed sniffing from urls -
The ability to play podcasts and other media that is thrown at it
(unlike the PSP) - Syncing for offline viewing - Expendable&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Closest contender&lt;/em&gt;: &lt;strong&gt;Google Reader&lt;/strong&gt;! It offers all of this
functionality and more. It makes my world a better place to live.
&lt;strong&gt;`Google Reader &amp;lt;http://reader.google.com&amp;gt;`_&lt;/strong&gt;&lt;/p&gt;
</summary></entry><entry><title>Contact Syncing for Massive Productivity Booster</title><link href="http://www.kennethreitz.com/contact-syncing-for-massive-productivity-booster.html" rel="alternate"></link><updated>2009-03-25T06:12:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-03-25:/contact-syncing-for-massive-productivity-booster.html/</id><summary type="html">&lt;p&gt;Google significantly increased my quality of life recently. How?
Let me explain. While I am a firm believer that cloud computing
should &lt;em&gt;never&lt;/em&gt; be viewed as a replacement for the current desktop/
model, I must say that I am now a &lt;strong&gt;huge&lt;/strong&gt; fan of storing my data
on the internet. Not all of my data, keep in mind, but information
that needs to be accessed by multiple computers, of course – but
that goes without saying.&lt;/p&gt;
&lt;p&gt;I have always had the problem of not being able to keep track of
all my data. I switch computers and operating systems so often, I
can't keep track of my contacts at all. And when I update one, I
have to go through and update many different databases – not the
most efficient method.&lt;/p&gt;
&lt;p&gt;So, the ultimate solution is – obviously – to consolidate all of my
contacts into one database. I used to keep all of my contacts on my
Samsung Blackjack cellphone. This worked well, since I could easily
sync it with a computer. This caused a problem, however: I could
only sync it with one system. If I was at work or on another
system, I had no way to get to my friend's email addresses.&lt;/p&gt;
&lt;p&gt;Last month, Google Contacts started to support Exchange Syncing,
which happens to work &lt;em&gt;flawlessly&lt;/em&gt; with my Windows Mobile 6.1
install.&lt;/p&gt;
&lt;p&gt;My life will never be the same. Thank you, Google. I am eternally
grateful.&lt;/p&gt;
&lt;p&gt;More details soon!&lt;/p&gt;
</summary></entry><entry><title>Python + Regular Expressions</title><link href="http://www.kennethreitz.com/python-regular-expressions.html" rel="alternate"></link><updated>2009-03-17T05:30:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2009-03-17:/python-regular-expressions.html/</id><summary type="html">&lt;p&gt;Have you ever needed to parse through large amounts of text looking
for a specific pattern? Patterns like “one capital letter followed
by three numbers” or “dd/mm/yyyy”? This is known as Pattern
Matching. Regular Expressions allow easy syntax for pattern
matching, and is an invaluable skill to add to one’s toolkit, no
matter what your area of expertise/practice is. Whether you’re
writing a Compiler, Form Validator, Text Editor, Django Project, or
Language Translator, Regular Expressions will always prove to be
invaluable. Here is a very basic overview of some syntax: ‘\d’
represents a digit. ‘\s’ represents whitespace. ‘.’ represents any
character. If you have worked with Python for very long, you are
probably already familiar with the concept. Take a look at the
following code:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
print(&amp;quot;Rounded = %05d&amp;quot; % (42))
&lt;/pre&gt;
&lt;p&gt;This makes sure that the digit printed has 5 digits, and will
automatically add 0’s to compensate. If you understand this
concept, then you shouldn’t have a problem. Perl-style Regular
Expressions are a very widely-accepted implementation, and Python
has built in support for this mini-language! It’s easily
accessible, so let’s get started. The included ‘re’ module will
give us everything we need to get started: import re&lt;/p&gt;
&lt;p&gt;Lets give our new module a try! It will enable you to do anything
you could ever want with regular expressions. Here’s a quick
example of some basic use:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import re

string0 = 'Kenneth Reitz is a cool guy!'
regExp = r’kenneth[- ]?reitz’

if re.match(regExp, string0, re.IGNORECASE):
   print “True”
else:
   print “False”
&lt;/pre&gt;
&lt;p&gt;This script takes the string &lt;tt class="docutils literal"&gt;'Kenneth Reitz is a cool guy'&lt;/tt&gt;, and
searches for &lt;tt class="docutils literal"&gt;'kenneth reitz'&lt;/tt&gt; inside of it. If ‘kenneth reitz’ is
found within string0 (re.match compares the expression with the
string), the script will print &lt;tt class="docutils literal"&gt;True&lt;/tt&gt;, if not, it will print
&lt;tt class="docutils literal"&gt;False&lt;/tt&gt;. Additional parameters can be passed to the re.match
function when needed. Note the &lt;tt class="docutils literal"&gt;re.IGNORECASE&lt;/tt&gt; flag used here –-
This tells the function be case-insensitive. Once you master the
regular expression syntax, you’ll realize how truly powerful they
can be. The options become limitless and the usefulness becomes
undeniable. Here’s another example:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import re

string0 = '10.03.1988'
regExp = r'^\d\d[./]\d\d[./]\d\d\d\d?$'

if re.match(regExp, string0):
   print 'True'
else:
   print 'False/
&lt;/pre&gt;
&lt;p&gt;When run, this script prints out &lt;tt class="docutils literal"&gt;True&lt;/tt&gt;. If we were to change
string0 to &lt;tt class="docutils literal"&gt;‘10.03.88’&lt;/tt&gt;, it would print &lt;tt class="docutils literal"&gt;False&lt;/tt&gt;. Simple, isn’t it?
Now, while a True/False return could be useful in certain
applications (i.e. form validation), most of the time, we’re going
to want to have a bit more information in order for our checks to
be useful. We can tell Python to show us the data that matches our
query. To do this, we’re going to have to break our expression up
into different groups. In the date we have defined, there are three
obvious groups we could separate this into: the day, month, and
year. While defining a Regular Expression, you can use parentheses
to define groups: &lt;tt class="docutils literal"&gt;regExp = &lt;span class="pre"&gt;r’^()././$’&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;This separates our expression into 3 separate groups. Python also
supports turning a Regular Expression string into an
heavily-supported object with the re.compile() function. Once you
define a string as a Regular Expression object, you can use the
built in methods to preform powerful parsing. Now we can ask python
what is in those groups:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import re

string0 = ‘10.03.1988’

regExp = re.compile(‘^()././$’)
regExpMatches = regExp.match(string0)

if re.match(regExp, string0):
   print(“Day: %s\nMonth: %s\nYear: %s” % (regExpMatches.group(1), \
     regExpMatches.group(2), regExpMatches.group(3)))
else:
   print(“Invalid Date.”)
&lt;/pre&gt;
&lt;p&gt;When executed, this script parses through our validated date,
breaks it down into groups, and prints the following:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Day: 10
Month: 03
Year: 1988
&lt;/pre&gt;
&lt;p&gt;The possibilities are limitless! Here’s a quick run-down of the re
module’s functions, strait from the Python documentation for
reference: match: Match a regular expression pattern to the
beginning of a string. search: Search a string for the presence of
a pattern. sub: Substitute occurrences of a pattern found in a
string subn: Same as sub, but also return the number of
substitutions made. split: Split a string by the occurrences of a
pattern. findall: Find all occurrences of a pattern in a string.
compile: Compile a pattern into a RegexObject. purge: Clear the
regular expression cache. escape: Backslash all non-alphanumerics
in a string.&lt;/p&gt;
&lt;p&gt;Remember, you can always type help(re) (after importing the re
module) into the Python interpret to take a quick look at the
module’s built-in documentation. Good luck and happy coding!&lt;/p&gt;
</summary></entry><entry><title>A New Spin to Software Platform Design</title><link href="http://www.kennethreitz.com/a-new-spin-to-software-platform-design.html" rel="alternate"></link><updated>2008-11-11T19:31:00Z</updated><author><name>Kenneth Reitz</name></author><id>tag:www.kennethreitz.com,2008-11-11:/a-new-spin-to-software-platform-design.html/</id><summary type="html">&lt;p&gt;*I wrote this article two years ago, before I found OS X. I wish I
would have known then.* As I've said before, I find many reasons
to believe that modern commercialized software platforms are
severely lacking in many, many areas. This should not come as a
surprise to anyone. Perhaps basic utility-inclusion is not the only
solution though. Perhaps the basic priority structure and ethics
that development and marketing teams utilize should be forced into
question.&lt;/p&gt;
&lt;p&gt;Essentially, most major computer software corporations, are, all in
all, trying to make money. No matter how hard you try to find a way
around this, or justify why these companies try to do the things
that they do, the only answer is money. These companies are simply
trying to make a quick buck. This concept has worked incredibly
well for years, but we seem to have a bit of a problem with
foresight. After a while, people get rather bored with the same old
concepts being presented to them in new and exciting ways. This is
why Microsoft needs to release a new operating system every once in
a while. Microsoft's current problem is that the masses are
beginning to realize their other options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So here's my proposal for the long-term design and marketing strategy 2.0:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An operating system should first be a place of power, consistency,
stability, scalability, and flexibility. Included would be a robust
and fully scriptable toolset which can be manipulated and presented
both graphically and statistically.&lt;/p&gt;
&lt;p&gt;Second, the user interface should be very well thought out and
planned, with ample room for improvement down the road. Its purpose
should first be a place of usability, workflow, and creativity.
Task-related workflow and presentation customization, accessible to
all types of users, is crucial to the success of the UI. Second,
the User Interface should be a mode of personal expression and
aesthetic preference. This should never take precedence over the
overall stability, usability, or general usefulness of a desktop
system, for any given reason.&lt;/p&gt;
&lt;p&gt;Lastly, the user application platform system needs to be designed.
A centralized repository of applications is an incredibly efficient
method for application distribution. This repository would be a
dynamic, centralized database of application software and packages
that are intended for different groups of people. Most major Linux
distributions use this heavily, as well as Apple for it's iPod and
iPhone applications, and it has been proven to work well.&lt;/p&gt;
&lt;p&gt;Any of these rules should have the ability to be broken easily by
advanced power users for technical reasons/needs. This should be in
no way advertised or demonstrated.&lt;/p&gt;
&lt;p&gt;Anyone up for the challenge?&lt;/p&gt;
</summary></entry></feed>
