<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Alex Clark - Python Web Developer</title><link href="http://aclark.net/blog/" rel="alternate"></link><link href="http://aclark.net/blog/feeds/all.atom.xml" rel="self"></link><id>http://aclark.net/blog/</id><updated>2013-04-22T12:00:00-04:00</updated><entry><title>New Pyramid Site</title><link href="http://aclark.net/blog/2013/04/22/new-pyramid-site/" rel="alternate"></link><updated>2013-04-22T12:00:00-04:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-04-22:2013/04/22/new-pyramid-site/</id><summary type="html">&lt;img alt="https://raw.github.com/ACLARKNET/aclarknet/master/screenshot.png" src="https://raw.github.com/ACLARKNET/aclarknet/master/screenshot.png" style="width: 98%;" /&gt;
&lt;p&gt;For the first time in 10 years, &lt;a class="reference external" href="http://aclark.net"&gt;aclark.net&lt;/a&gt; is not powered by Plone. Nothing against Plone: it's still one of the greatest loves of my life (inasmuch as you can love a software and community, as I do).&lt;/p&gt;
&lt;div class="section" id="why"&gt;
&lt;h2&gt;Why&lt;/h2&gt;
&lt;p&gt;This was not the result of a revolutionary plan, rather more of an evolution. It happened like this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;As soon as Plone 4.3a1 was released (a year ago?) I deployed a new Plone site to aclark.net with it, featuring a &lt;strong&gt;Diazo&lt;/strong&gt; (new Plone theming engine) theme.&lt;/li&gt;
&lt;li&gt;Around the same time I became obsessed with deploying to Heroku, and also gained an interest in &lt;strong&gt;Python 3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A few months ago, I got tired of paying $11/month to host my Plone site so I converted the site to &lt;strong&gt;static HTML&lt;/strong&gt; and moved it to &lt;strong&gt;GitHub pages&lt;/strong&gt;. But the result was flawed because maintenance involved editing duplicate copies of the website content (e.g. both clients.html and clients/foo.html contained the same text describing &amp;quot;foo&amp;quot;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So when it came time to do more than a few casual edits, I knew I had to find a new approach. That's when various elements of the Universe conspired to lead me in a new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="how"&gt;
&lt;h2&gt;How&lt;/h2&gt;
&lt;div class="section" id="pyramid"&gt;
&lt;h3&gt;Pyramid&lt;/h3&gt;
&lt;p&gt;I spent a lot of time (~ 1 year) developing &lt;a class="reference external" href="http://pythonpackages.com"&gt;pythonpackages.com&lt;/a&gt; in Pyramid, but the result was a mess (code-wise). I'm in the process of rewriting and open sourcing it, but it's slow going. So what better way to get started than to do a small-ish site in Pyramid for fun?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="about-me"&gt;
&lt;h3&gt;about.me&lt;/h3&gt;
&lt;p&gt;I also recently gave in and created an &lt;a class="reference external" href="http://about.me/alex.clark"&gt;about.me site&lt;/a&gt;. I was impressed by their content editing features, and my ability to create a page that looked OK using them.&lt;/p&gt;
&lt;p&gt;In my about.me profile, I used a picture of me and a picture of DC I took in early 2012. When it came time to redo aclark.net I felt like I really wanted to capture the simplicity of the about.me site, so I used the same photo in the background.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bootstrap"&gt;
&lt;h3&gt;Bootstrap&lt;/h3&gt;
&lt;p&gt;Bootstrap is old news at this point, but I really enjoy using it and I particularly like that they have added more example templates. So I combined my background photo with one of &lt;a class="reference external" href="http://twitter.github.io/bootstrap/getting-started.html#examples"&gt;their example templates&lt;/a&gt; and a new site idea was born. As I'm not a particularly talented visual artist, my ability to produce something that looked OK (with code this time) was exciting.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="what"&gt;
&lt;h2&gt;What&lt;/h2&gt;
&lt;p&gt;Until I added a contact form, the site was entirely unremarkable. There are views and routes and templates, typical fare for a web framework. Here is the entire &amp;quot;main routine&amp;quot;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
from pyramid.session import UnencryptedCookieSessionFactoryConfig
from pyramid.config import Configurator
from .redir import blog
from .redir import blog_entry
from .redir import blog_slash
from .views import contact
from .views import default
import deform_bootstrap


def main(global_config, **settings):
    &amp;quot;&amp;quot;&amp;quot;
    Oppan wsgi style! Configure and return WSGI application.
    &amp;quot;&amp;quot;&amp;quot;
    my_session_factory = UnencryptedCookieSessionFactoryConfig('itsaseekreet')
    config = Configurator(session_factory=my_session_factory)
    config.add_route('blog', '/blog')
    config.add_route('blog_entry', '/blog/{entry:.*}')
    config.add_route('blog_slash', '/blog/')
    config.add_route('contact', '/contact')
    config.add_route('clients', '/clients')
    config.add_route('projects', '/projects')
    config.add_route('services', '/services')
    config.add_route('team', '/team')
    config.add_route('testimonials', '/testimonials')
    config.add_route('root', '/')
    config.add_static_view(
        'static', 'aclarknet:static', cache_max_age=3600)
    config.add_view(blog, route_name='blog')
    config.add_view(blog_entry, route_name='blog_entry')
    config.add_view(blog_slash, route_name='blog_slash')
    config.add_view(
        default,
        renderer='aclarknet:templates/clients.mak',
        route_name='clients')
    config.add_view(
        contact,
        renderer='aclarknet:templates/contact.mak',
        route_name='contact')
    config.add_view(
        default,
        renderer='aclarknet:templates/projects.mak',
        route_name='projects')
    config.add_view(
        default,
        renderer='aclarknet:templates/root.mak',
        route_name='root')
    config.add_view(
        default,
        renderer='aclarknet:templates/services.mak',
        route_name='services')
    config.add_view(
        default,
        renderer='aclarknet:templates/testimonials.mak',
        route_name='testimonials')
    config.add_view(
        default,
        renderer='aclarknet:templates/team.mak',
        route_name='team')
    config.include(deform_bootstrap)
    return config.make_wsgi_app()
&lt;/pre&gt;
&lt;div class="section" id="contact-form"&gt;
&lt;h3&gt;Contact form&lt;/h3&gt;
&lt;p&gt;But then I wanted a contact form. Which lead me to wanting an elegant way to send mail via Heroku. Which lead me to discover &lt;a class="reference external" href="http://sendgrid.com/"&gt;SendGrid&lt;/a&gt;. Which lead me create some primitive marketing features I am quite proud of and excited about.&lt;/p&gt;
&lt;p&gt;I still ended up sending mail &amp;quot;the old way&amp;quot; via GMail. But now I send two mails: one to &lt;a class="reference external" href="mailto:info&amp;#64;aclark.net"&gt;info&amp;#64;aclark.net&lt;/a&gt; to alert our staff about the lead (using GMail). And one to the lead acknowledging their submission (using SendGrid). SendGrid keeps a record of all the leads we've contacted, amongst other &amp;quot;fancy marketing features&amp;quot;. Here's the relevant view code:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import deform
import smtplib

from email.mime.text import MIMEText

from .config import FORM_ERROR
from .config import FORM_SUCCESS

from .config import MIME_ONE_RECIPIENT
from .config import MIME_ONE_SUBJECT
from .config import MIME_TWO_MESSAGE
from .config import MIME_TWO_SUBJECT

from .config import GMAIL_HOSTNAME
from .config import GMAIL_PASSWORD
from .config import GMAIL_USERNAME

from .config import SENDGRID_HOSTNAME
from .config import SENDGRID_PASSWORD
from .config import SENDGRID_USERNAME

from .forms import ContactFormSchema


def contact(request):
    &amp;quot;&amp;quot;&amp;quot;
    Create and render deform form containing colander schema. Provide
    sendgrid integration for marketing.
    &amp;quot;&amp;quot;&amp;quot;
    button = deform.Button('Send', css_class='span9 btn-block btn-large')
    schema = ContactFormSchema().bind(request=request)
    form = deform.Form(schema, buttons=(button, ))
    if 'Send' in request.POST:
        items = request.POST.items()
        try:
            appstruct = form.validate(items)
        except deform.ValidationFailure:
            return {
                'form': form.render(),
                'request': request,
            }
        # This is the form contents
        email = appstruct['email']
        message = appstruct['message']

        # This is the mail to info&amp;#64;aclark.net
        mime_document_one = MIMEText(message)
        mime_document_one['Subject'] = MIME_ONE_SUBJECT
        mime_document_one['To'] = MIME_ONE_RECIPIENT
        mime_document_one['From'] = email
        mime_document_one = mime_document_one.as_string()

        # This is the mail to the new lead
        mime_document_two = MIMEText(MIME_TWO_MESSAGE)
        mime_document_two['Subject'] = MIME_TWO_SUBJECT
        mime_document_two['To'] = email
        mime_document_two['From'] = MIME_ONE_RECIPIENT
        mime_document_two = mime_document_two.as_string()

        try:
            # This is the mail to info&amp;#64;aclark.net
            smtp_server = smtplib.SMTP(GMAIL_HOSTNAME)
            smtp_server.starttls()
            smtp_server.login(GMAIL_USERNAME, GMAIL_PASSWORD)
            smtp_server.sendmail(email, MIME_ONE_RECIPIENT, mime_document_one)
            smtp_server.quit()

            # This is the mail to the new lead
            smtp_server = smtplib.SMTP(SENDGRID_HOSTNAME)
            smtp_server.starttls()
            smtp_server.login(SENDGRID_USERNAME, SENDGRID_PASSWORD)
            smtp_server.sendmail(MIME_ONE_RECIPIENT, email, mime_document_two)
            smtp_server.quit()
            request.session.flash(FORM_SUCCESS)
        except:
            request.session.flash(FORM_ERROR, 'errors')
        return {
            'form': form.render(appstruct={}),
            'request': request,
        }
    return {
        'form': form.render(),
        'request': request,
    }


def default(request):
    &amp;quot;&amp;quot;&amp;quot;
    This is the default view, to be used with most routes since we do not
    provide any content editing ability yet. Even then, maybe a default view
    would still be helpful.
    &amp;quot;&amp;quot;&amp;quot;
    return {}
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="who-cares"&gt;
&lt;h2&gt;Who cares&lt;/h2&gt;
&lt;p&gt;The best thing about all of this being able to run the site &lt;strong&gt;100% for free on Heroku&lt;/strong&gt;. Also:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python 3 compat!&lt;/li&gt;
&lt;li&gt;Free caching via CloudFlare&lt;/li&gt;
&lt;li&gt;Free ping service from Pingdom keeps the site from &amp;quot;going to sleep&amp;quot; (HT: natea).&lt;/li&gt;
&lt;li&gt;Updating the site fits my workflow. If I'm the content editor, I don't necessarily need or want to use Plone to edit my content. I can save Plone for my clients, and focus on &lt;strong&gt;what makes them happy&lt;/strong&gt; with their CMS system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary><category term="Django"></category><category term="Mozilla"></category><category term="Plone"></category><category term="Python"></category></entry><entry><title>The Story of Pillow</title><link href="http://aclark.net/blog/2013/03/15/the-story-of-pillow/" rel="alternate"></link><updated>2013-03-15T17:00:00-04:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-03-15:2013/03/15/the-story-of-pillow/</id><summary type="html">&lt;p&gt;On March 4, 2013 I got an email from the Python Software Foundation (PSF):&lt;/p&gt;
&lt;blockquote&gt;
This email notification is being sent to you to inform you of the PSF Board’s decision to fund the facilitation of a Python 3 compatible release of the Python Imaging Library for the amount of $1,300 USD. Please see the resolution that was passed unanimously on March 4, 2013 via email below:&lt;/blockquote&gt;
&lt;p&gt;Yay! That was in response to &lt;a class="reference external" href="https://github.com/python-imaging/psf-grant-proposal"&gt;my proposal&lt;/a&gt; asking for funding to finish a Pillow 2.0.0 release. In that proposal, I presented the &amp;quot;story of Pillow&amp;quot; which I'd like to present again now, for anyone interested:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tired of seeing the proliferation of third party packagings of the Python Imaging Library, in 2010 Alex Clark took Hanno Schlicting's repackaging and used it to create a fork of the Python Imaging Library on GitHub. He subsequently released that fork to PyPI as Pillow 1.0. The ability to add additional development library paths to setup.py (e.g. 64 bit library and headers directories) and make releases quickly eventually led to widespread adoption of Pillow.&lt;/p&gt;
&lt;p&gt;A little over a year later on 2011-09-08, Takayuki Shimizukawa uploaded the first Windows (win32) eggs. Since then, every Pillow release included Windows eggs thanks to Takayuki. And on 2013-02-02, the first 64-bit Windows eggs (amd64) were uploaded to PyPI by Takayuki.&lt;/p&gt;
&lt;p&gt;For the first 3 years, the fork focused on packaging fixes only. Now a Python 3 compatible pull request from Brian Crowell has been merged, and the final stages of release preparation are underway. In early 2013, Barry Warsaw created an Ubuntu Personal Package Archive and tested it with Python 3. And the Fedora Project is now planning to include Pillow with their release of Fedora 19. Finally, the Pillow project has promised a Python 3 compatible release of Pillow by PyCon 2013.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That release is now done! And I have had an absolute blast working on Pillow full time over the course of the last week or so. So much so, that I'm going to propose you help me continue to have fun and be productive with Pillow… but more on that later. First, about the new release.&lt;/p&gt;
&lt;div class="section" id="about-2-0-0"&gt;
&lt;h2&gt;About 2.0.0&lt;/h2&gt;
&lt;img alt="https://raw.github.com/ACLARKNET/blog/gh-pages/images/story-of-pillow.png" src="https://raw.github.com/ACLARKNET/blog/gh-pages/images/story-of-pillow.png" /&gt;
&lt;p&gt;This release marks the first &amp;quot;serious effort&amp;quot; I have put into Pillow. While I've always enjoyed working on it in my spare time, I knew that there was no way I could finish it in time for PyCon 2013 (as I promised) without getting some financial assistance.&lt;/p&gt;
&lt;p&gt;Enter: The PSF, who graciously offered to fund my work (and the work of one other contributor). Once I had funding in place, I knew exactly what needed to be done:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;So much time has passed since the fork, no one seemed to care if we made image code changes (we were originally a packaging fork), so this release contains &lt;strong&gt;EVERY PATCH EVER SUBMITTED TO PIL&lt;/strong&gt; but not released until now. I'm exaggerating, but we really crammed a lot of &amp;quot;goodness&amp;quot; in to the 2.0.0 release along with Python 3 support which is what prompted the release in the first place.&lt;/li&gt;
&lt;li&gt;In order to fully test, I fine-tuned my tox environment on Mac OS X (tox is awesome) as well as fired up a new Windows VM (and used an already-existing Linux VM). Additionally, other folks joined in to test on their environments (most notably Christophe Gohlke and Eric Soroos). You'll find the results here: &lt;a class="reference external" href="https://github.com/python-imaging/Pillow#platform-support"&gt;https://github.com/python-imaging/Pillow#platform-support&lt;/a&gt;. That means: &lt;strong&gt;THIS RELEASE HAS BEEN FULLY, EXTENSIVELY, AND EXHAUSTIVELY DEVELOPED AND TESTED&lt;/strong&gt;. Aside from the possible inconvenience of Pillow 2.0.0 dropping 2.4 and 2.5 support (use Pillow 1.x if you need Python 2.4,2.5), you should not have any trouble with it. If you do, please open a ticket here: &lt;a class="reference external" href="https://github.com/python-imaging/Pillow/issues"&gt;https://github.com/python-imaging/Pillow/issues&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;As important as quality software is to me, quality presentation is almost equally important. (That's developer-eye quality, not designer-eye quality. ;-)) So I spent a lot of time cleaning up and enhancing the more subtle aspects of the release e.g. README.rst, docs/* (including the pythondoc documentation and HISTORY.txt and CONTRIBUTORS.txt). The pythondoc documentation has been converted to re-structured text and is hosted on ReadTheDocs: &lt;a class="reference external" href="http://pillow.readthedocs.org/en/latest/"&gt;http://pillow.readthedocs.org/en/latest/&lt;/a&gt;. The website has been updated to include an &lt;strong&gt;actual&lt;/strong&gt; image generated by PIL :-) &lt;a class="reference external" href="http://python-imaging.github.com/"&gt;http://python-imaging.github.com/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you enjoy and use Pillow 2.0.0. If you'd like to see me continue to devote significant time to maintaining Pillow, please &lt;a class="reference external" href="http://gittip.com/aclark4life"&gt;consider a gittip&lt;/a&gt;! Thank you.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="Django"></category><category term="Plone"></category><category term="Python"></category></entry><entry><title>Trading Places Trading Scene Explained</title><link href="http://aclark.net/blog/2013/02/23/trading-places-trading-scene-explained/" rel="alternate"></link><updated>2013-02-23T20:30:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-02-23:2013/02/23/trading-places-trading-scene-explained/</id><summary type="html">&lt;p&gt;Every time I watch the movie &lt;a class="reference external" href="http://www.imdb.com/title/tt0086465"&gt;Trading Places&lt;/a&gt;, I have to search the internet for an explanation of the climactic commodities trading scene. It usually takes me about 20 minutes to (re-)understand it, then another 10 minutes to explain it to my wife. Although there are &lt;a class="reference external" href="http://www.wisebread.com/explaining-the-climax-scene-of-trading-places"&gt;plenty&lt;/a&gt; &lt;a class="reference external" href="http://www.popmodal.com/video/1277/Trading-Places-Final-Exchange-Scene-amp-Explanation"&gt;of&lt;/a&gt; &lt;a class="reference external" href="http://www.dangerouslogic.com/trading_places.html"&gt;great&lt;/a&gt; &lt;a class="reference external" href="http://justurbanism.com/2011/03/26/how_the_trading_places_final_scene_works/"&gt;answers&lt;/a&gt; available, none of them really &amp;quot;speak&amp;quot; to me; so I decided to write my own. The goal for me is to be able to (re-)read my explanation and understand it enough to explain to someone else in less than 5 minutes.&lt;/p&gt;
&lt;p&gt;This scene is tricky for non-stockbrokers to understand because you need to know a lot about trading, and you also need to know some important plot details. Rather than continue to look everything up on the internet each time, I figured I'd write this blog entry instead.&lt;/p&gt;
&lt;div class="section" id="important-plot-detail-1"&gt;
&lt;h2&gt;Important Plot Detail #1&lt;/h2&gt;
&lt;p&gt;The Crop Reports, real and fake. In the movie, the Dukes plan to cheat. But the &amp;quot;good guys&amp;quot; (Valentine and Winthrope) foil them by replacing their stolen, ill-gotten crop report with a fake. This allows the &amp;quot;good guys&amp;quot; to win. To understand the reverse-swindle, you must understand the crop reports (real and fake) and the market repercussions of each:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="38%" /&gt;
&lt;col width="31%" /&gt;
&lt;col width="31%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Report&lt;/strong&gt;
&lt;strong&gt;(FAKE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Report&lt;/strong&gt;
&lt;strong&gt;(REAL)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Weather&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BAD&lt;/td&gt;
&lt;td&gt;GOOD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Harvest&lt;/strong&gt;
&lt;strong&gt;(i.e. #&lt;/strong&gt;
&lt;strong&gt;oranges)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Prices&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="important-plot-detail-2"&gt;
&lt;h2&gt;Important Plot Detail #2&lt;/h2&gt;
&lt;p&gt;Remember, the Dukes plan to cheat AKA &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Cornering_the_market"&gt;&amp;quot;corner the market&amp;quot;&lt;/a&gt;. And as &lt;a class="reference external" href="http://www.dangerouslogic.com/trading_places.html"&gt;Chris Carter&lt;/a&gt; says:&lt;/p&gt;
&lt;blockquote&gt;
The (Duke's) agent wants to own as many contracts as possible before the crop report is revealed, since (he thinks) once it is, the price will go up and he can sell at a profit. Trading begins with a price of 102 cents per pound, which translates into $15,300 per contract. Once everyone sees that the Dukes' agent is trying to corner the market, they all want a piece of it, forcing the price up since more people are buying than selling.&lt;/blockquote&gt;
&lt;p&gt;I'll repeat that last part: when trading opens before the true crop report is revealed &lt;strong&gt;more people are buying than selling.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="important-plot-detail-3"&gt;
&lt;h2&gt;Important Plot Detail #3&lt;/h2&gt;
&lt;p&gt;The &amp;quot;good guys&amp;quot; know the truth i.e. that the current buying trend is based on the Duke's actions which are based on false information. That brings us to another important point: the &amp;quot;good guys&amp;quot; realize an opportunity to &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Short_%28finance%29"&gt;&amp;quot;sell short&amp;quot;&lt;/a&gt;. Or as &lt;a class="reference external" href="http://www.dangerouslogic.com/trading_places.html"&gt;Chris Carter&lt;/a&gt; puts it:&lt;/p&gt;
&lt;blockquote&gt;
They are betting they will be able to buy the contracts later at a lower price so they come out making money but not holding any contracts at the end of trading.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="light-bulb"&gt;
&lt;h2&gt;Light bulb&lt;/h2&gt;
&lt;p&gt;Ding! Ding! Ding! So after all this, here's what's really happening: &lt;strong&gt;the &amp;quot;good guys&amp;quot; successfully carry out a short sale, with the help of the &amp;quot;bad guys&amp;quot; who are trying to corner the market but acting on false information&lt;/strong&gt;. Or as &lt;a class="reference external" href="http://www.dangerouslogic.com/trading_places.html"&gt;Chris Carter&lt;/a&gt; puts it, after the real crop report is published:&lt;/p&gt;
&lt;blockquote&gt;
They (the &amp;quot;good guys&amp;quot;) need to buy--a lot--to zero their position, and the crowd is more than willing to oblige.&lt;/blockquote&gt;
&lt;p&gt;Finally, the &amp;quot;good guys&amp;quot; are able to buy enough to contracts to fulfill the number of &amp;quot;short&amp;quot; sales they made. And they are able to purchase them for much less then they made the &amp;quot;short&amp;quot; sales for. Profit!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does it make sense now? If not, let me know in the comments.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>Built with Plone, Powered by GitHub Pages</title><link href="http://aclark.net/blog/2013/02/23/built-with-plone-powered-by-github-pages/" rel="alternate"></link><updated>2013-02-23T12:00:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-02-23:2013/02/23/built-with-plone-powered-by-github-pages/</id><summary type="html">&lt;p&gt;Is Plone the next great static website generator? Probably not, but it definitely could be&lt;/p&gt;
&lt;p&gt;I am always looking for ways to improve, streamline and otherwise hack my e-life. And this post is about all of the above.
&lt;a class="reference external" href="https://raw.github.com/ACLARKNET/blog/gh-pages/images/httrack.png"&gt;https://raw.github.com/ACLARKNET/blog/gh-pages/images/httrack.png&lt;/a&gt;
Plone in the cloud&lt;/p&gt;
&lt;p&gt;Plone is still too &amp;quot;heavy&amp;quot; to easily run &amp;quot;in the cloud&amp;quot; (except via &lt;a class="reference external" href="http://ploud.com"&gt;http://ploud.com&lt;/a&gt;, HT), but it's getting there. In particular, I find this effort by David Bain very inspiring:&lt;/p&gt;
&lt;blockquote&gt;
&lt;a class="reference external" href="https://github.com/pigeonflight/stack-python-plone"&gt;https://github.com/pigeonflight/stack-python-plone&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;And based on my experiments and research on Heroku:&lt;/p&gt;
&lt;blockquote&gt;
&lt;a class="reference external" href="https://github.com/aclark4life/zope2-heroku"&gt;https://github.com/aclark4life/zope2-heroku&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;The only &amp;quot;real&amp;quot; remaining issue seems to be packaging; we need this PLIP to happen sooner, rather than later:&lt;/p&gt;
&lt;blockquote&gt;
&lt;a class="reference external" href="https://dev.plone.org/ticket/13283"&gt;https://dev.plone.org/ticket/13283&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Cheating&lt;/p&gt;
&lt;p&gt;In the meantime, one way you can cheat is to export the contents of your Plone site with httrack then host the results for free on GitHub Pages (i.e. &amp;quot;the cloud&amp;quot;)&lt;/p&gt;
&lt;p&gt;This process if far from perfect [1], but in a pinch it can work. And it recently worked very well for me so I thought I'd share. See:&lt;/p&gt;
&lt;blockquote&gt;
&lt;a class="reference external" href="http://aclark.net"&gt;http://aclark.net&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/ACLARKNET/aclarknet.github.com"&gt;https://github.com/ACLARKNET/aclarknet.github.com&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;These links are my website, and GitHub Pages repository respectively. The website was created with Plone (&lt;a class="reference external" href="https://github.com/ACLARKNET/new_style"&gt;https://github.com/ACLARKNET/new_style&lt;/a&gt;) then exported via httrack, then uploaded to GitHub Pages (to the gh-pages branch of any repo except &amp;lt;{org,user}&amp;gt;&amp;gt;.github.com repos).
[1] httrack got &amp;quot;stuck&amp;quot; on my &amp;#64;&amp;#64;search links, and I've got a lot of duplicate content now. Fortunately I don't mind editing lots and lots of text files :-).
Conclusion&lt;/p&gt;
&lt;p&gt;In doing this, I was able to turn off my $11/month &amp;quot;website and IRC server&amp;quot; which makes the CFO happy. And in a year or so with Plone 5, hopefully I'll be able to return to the cloud and edit content &amp;quot;live&amp;quot; again.&lt;/p&gt;
&lt;p&gt;What do you think about Plone as a static site generator and/or Plone in the cloud? Let me know in the comments below.&lt;/p&gt;
</summary><category term="Plone"></category></entry><entry><title>I love checkoutmanager and dotfiles</title><link href="http://aclark.net/blog/2013/02/08/i-love-checkoutmanager-and-dotfiles/" rel="alternate"></link><updated>2013-02-08T12:00:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-02-08:2013/02/08/i-love-checkoutmanager-and-dotfiles/</id><summary type="html">&lt;p&gt;&lt;em&gt;An ode to my OS X development workstation setup&lt;/em&gt; &lt;a class="footnote-reference" href="#id11" id="id1"&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am big on setting up my development environment, and enjoying the environment I work in. And I'm very thankful to the folks who make my life easier, including the authors of:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.ohloh.net/p/python/contributors/summary"&gt;Python&lt;/a&gt;: Python Core Developers&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/dotfiles"&gt;dotfiles&lt;/a&gt;: Jon Bernard&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/checkoutmanager"&gt;checkoutmanager&lt;/a&gt;: Reinout Van Rees&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also love &lt;strong&gt;repetition&lt;/strong&gt;. So picture if you will, a new &lt;strong&gt;Macbook Air or Pro&lt;/strong&gt; ready to serve as my development workstation. I like to perform, and study, the steps required to turn a new laptop in to my development workstation. So here we go. In this article, I will walk through the steps required to turn a new machine in to my developer workstation. Do follow along!&lt;/p&gt;
&lt;div class="section" id="shell"&gt;
&lt;h2&gt;Shell&lt;/h2&gt;
&lt;p&gt;One of the first things I do on a new system is change my shell to &lt;strong&gt;Zsh&lt;/strong&gt; in &lt;tt class="docutils literal"&gt;System Preferences &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Users &amp;amp; Groups &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Current User &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Right Click &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Advanced &lt;span class="pre"&gt;Options...&lt;/span&gt;&lt;/tt&gt;. Don't forget to &lt;tt class="docutils literal"&gt;Click the lock to make changes&lt;/tt&gt; first.&lt;/p&gt;
&lt;img alt="https://raw.github.com/ACLARKNET/blog/gh-pages/images/zsh.png" src="https://raw.github.com/ACLARKNET/blog/gh-pages/images/zsh.png" /&gt;
&lt;div class="section" id="zsh"&gt;
&lt;h3&gt;Zsh&lt;/h3&gt;
&lt;p&gt;Why &lt;strong&gt;Zsh&lt;/strong&gt;? One of my favorite features is &lt;strong&gt;shared history between open sessions&lt;/strong&gt;. So I can run a command in one window, and then run the same command from another window by fetching it from the history (with CTRL-R).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="xcode"&gt;
&lt;h2&gt;XCode&lt;/h2&gt;
&lt;p&gt;After I take possession of my new laptop (running &lt;strong&gt;Mountain Lion&lt;/strong&gt;, the newest OS X at the time of this writing), I head to the App Store to download XCode. &lt;a class="footnote-reference" href="#id12" id="id2"&gt;[2]&lt;/a&gt; Among many other things, XCode gives me the GNU C Compiler and allows me to type &amp;quot;gcc&amp;quot; in my &lt;tt class="docutils literal"&gt;Applications &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Utilities &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Terminal&lt;/tt&gt;.&lt;/p&gt;
&lt;img alt="https://raw.github.com/ACLARKNET/blog/gh-pages/images/gcc.png" src="https://raw.github.com/ACLARKNET/blog/gh-pages/images/gcc.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;Python&lt;/h2&gt;
&lt;img alt="https://raw.github.com/ACLARKNET/blog/gh-pages/images/homebrew.png" src="https://raw.github.com/ACLARKNET/blog/gh-pages/images/homebrew.png" /&gt;
&lt;p&gt;Now I need a Python interpreter &lt;a class="footnote-reference" href="#id13" id="id4"&gt;[3]&lt;/a&gt;. For development I use the &lt;a class="reference external" href="https://github.com/collective/buildout.python"&gt;Collective Python Buildout&lt;/a&gt; but I also enjoy using &lt;a class="reference external" href="http://mxcl.github.com/homebrew/"&gt;Homebrew's&lt;/a&gt; Python 2.7. I use Homebrew for a variety of other things too (e.g. mobile-shell AKA mosh) so here we go:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ ruby -e &amp;quot;$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)&amp;quot;
&lt;/pre&gt;
&lt;p&gt;… follow instructions …&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ brew install python
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="git"&gt;
&lt;h2&gt;Git&lt;/h2&gt;
&lt;p&gt;I think OS X (or XCode) includes git, but just in case:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ brew install git
&lt;/pre&gt;
&lt;p&gt;Which reminds me, don't forget that installing the command line utilities in Mountain Lion's XCode requires an additional step in &lt;tt class="docutils literal"&gt;Preferences &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Downloads &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Command Line Tools &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Install&lt;/tt&gt;:&lt;/p&gt;
&lt;img alt="https://raw.github.com/ACLARKNET/blog/gh-pages/images/command-line-utils.png" src="https://raw.github.com/ACLARKNET/blog/gh-pages/images/command-line-utils.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;Dotfiles&lt;/h2&gt;
&lt;p&gt;At this point, I can begin to get serious about turning this new machine in to my developer workstation. And that means: &lt;strong&gt;installing my private ssh key&lt;/strong&gt; so I can check out code without typing a password, of course. Normally this would be tedious, but with git and dotfiles it's not so bad. This is what I do from my home directory:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ git clone https://super_secret_url/dotfiles.git Dotfiles
&lt;/pre&gt;
&lt;p&gt;I use https which requires a password for the first time only. Then I edit &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Dotfiles/.git/config&lt;/span&gt;&lt;/tt&gt; and change the repository URL to &lt;tt class="docutils literal"&gt;git&amp;#64;super_secret_url/dotfiles.git&lt;/tt&gt;. So every subsequent pull and push will require no password. And to &amp;quot;install&amp;quot; these dotfiles, I do &lt;a class="footnote-reference" href="#id16" id="id6"&gt;[6]&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ pip install dotfiles
$ dotfiles -s --force
&lt;/pre&gt;
&lt;p&gt;Note: the dotfiles command finds my dotfiles in the default directory &amp;quot;Dotfiles&amp;quot; and create symbolic links to them.&lt;/p&gt;
&lt;div class="section" id="distribute-pip"&gt;
&lt;h3&gt;Distribute &amp;amp; Pip&lt;/h3&gt;
&lt;p&gt;Homebrew's Python includes pip, but even if it didn't:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ curl -O http://python-distribute.org/distribute_setup.py
$ /usr/local/bin/python distribute_setup.py
$ {easy_install, pip install} dotfiles
&lt;/pre&gt;
&lt;p&gt;In other words, you can always install Distribute &lt;a class="footnote-reference" href="#id14" id="id7"&gt;[4]&lt;/a&gt;. After which you can use &lt;tt class="docutils literal"&gt;easy_install&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt; to install dotfiles. (You can read up on the differences. TL;DR: neither is &amp;quot;better&amp;quot; or &amp;quot;worse&amp;quot;, it's just a question of which tradeoffs you are willing to make. I tend to use pip just because it's newer and I like its requirements.txt feature, but easy_install is still very well supported as part of the Distribute project.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id8"&gt;
&lt;h2&gt;Checkoutmanager&lt;/h2&gt;
&lt;p&gt;Now I need some things to develop. Since I work on a bunch of different projects, I need a way to keep track of what should be checked out at any given time. So I do this &lt;a class="footnote-reference" href="#id15" id="id9"&gt;[5]&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ pip install checkoutmanager
$ checkoutmanager co
&lt;/pre&gt;
&lt;p&gt;This creates and populates my &lt;tt class="docutils literal"&gt;~/Developer&lt;/tt&gt; directory with code. And it &amp;quot;just works&amp;quot; because I keep a &lt;tt class="docutils literal"&gt;.checkoutmanager.cfg&lt;/tt&gt; in my Dotfiles repository. It currently looks like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[aclark]
basedir = /Users/aclark/Developer/aclark
checkouts =
    git&amp;#64;github.com:aclark4life/aclark4life.github.com.git resume
    git&amp;#64;github.com:aclark4life/desktops.git
    git&amp;#64;github.com:aclark4life/hireme.git
    git&amp;#64;github.com:aclark4life/projects.git
    git&amp;#64;github.com:aclark4life/reinstall.git
    git&amp;#64;github.com:ACLARKNET/tweets.git
    git&amp;#64;github.com:aclark4life/usesthis.git
vcs = git

[alt]
basedir = /Users/aclark/Developer/alt
checkouts =
    git&amp;#64;github.com:alt-aclark-net/alt-aclark-net.github.com.git
    git&amp;#64;github.com:alt-aclark-net/dexter.git
    git&amp;#64;github.com:alt-aclark-net/headstraight.git
vcs = git

[buildout]
basedir = /Users/aclark/Developer/buildout
checkouts =
    git&amp;#64;github.com:collective/buildout.bootstrap.git
    git&amp;#64;github.com:buildout/buildout.git
    git&amp;#64;github.com:buildout/buildout.github.com.git
vcs = git

[distribute]
basedir = /Users/aclark/Developer
checkouts = ssh://hg&amp;#64;bitbucket.org/tarek/distribute
vcs = hg

[clients]
basedir = /Users/aclark/Developer
checkouts =
; Bunch o client repos
vcs = git

[clients-hg]
basedir = /Users/aclark/Developer
checkouts =
; Bunch o client repos
vcs = hg

[dcpython]
basedir = /Users/aclark/Developer/dcpython
checkouts =
    git&amp;#64;github.com:DCPython/dcpython.github.com.git
    git&amp;#64;github.com:DCPython/pyramid-tutorials.git
vcs = git

[misc]
basedir = /Users/aclark/Developer
checkouts =
    git&amp;#64;github.com:ACLARKNET/aclarknet.github.com.git blog
    git&amp;#64;github.com:ACLARKNET/new_style.git
    git&amp;#64;github.com:aclark4life/binfiles.git
;    git&amp;#64;github.com:aclark4life/pyramid_python_3.git
    git&amp;#64;github.com:aclark4life/vanity.git
    git&amp;#64;github.com:aclark4life/zope2-heroku.git
    git&amp;#64;github.com:aclark4life/zope2_bootstrap.git
    git&amp;#64;github.com:codekoala/django-axes.git
    git&amp;#64;github.com:collective/buildout.python
vcs = git

[pillow]
basedir = /Users/aclark/Developer/pillow
checkouts =
    git&amp;#64;github.com:python-imaging/Pillow.git
    git&amp;#64;github.com:python-imaging/python-imaging.github.com.git
vcs = git

[plethorasociety]
basedir = /Users/aclark/Developer/plethorasociety
checkouts =
    git&amp;#64;github.com:plethorasociety/plethorasociety.github.com.git
vcs = git

[plone]
basedir = /Users/aclark/Developer/plone
checkouts =
    git&amp;#64;github.com:aclark4life/Plone-Debug-Assistant.git
    git&amp;#64;github.com:aclark4life/collective.recipe.bluebream.git
    git&amp;#64;github.com:aclark4life/event_days_indexer.git
    git&amp;#64;github.com:aclark4life/hello_plone.git
    git&amp;#64;github.com:aclark4life/mr_migrator_demo.git
    git&amp;#64;github.com:aclark4life/parse2plone.git
    git&amp;#64;github.com:aclark4life/plone_1_fun.git
    git&amp;#64;github.com:aclark4life/plone_addon_upgrade.git
    git&amp;#64;github.com:aclark4life/plone_guide.git
    git&amp;#64;github.com:aclark4life/plone_workflow_events.git
    git&amp;#64;github.com:aclark4life/schemaextender-facetednav-demo.git
    git&amp;#64;github.com:aclark4life/silly_content_import.git
    git&amp;#64;github.com:aclark4life/transmogrify.extract.git
    git&amp;#64;github.com:aclark4life/transmogrify.regexp.git
    git&amp;#64;github.com:aclark4life/viewlets_dont_suck.git
    git&amp;#64;github.com:aclark4life/wordpress2plone.git
    git&amp;#64;github.com:collective/Products.AttachmentField.git
    git&amp;#64;github.com:collective/Products.CalendarX.git
    git&amp;#64;github.com:collective/Products.EventRegistration.git
    git&amp;#64;github.com:collective/Products.PloneSoftwareCenter.git
    git&amp;#64;github.com:collective/Products.ifQuotes.git
    git&amp;#64;github.com:collective/Products.naked_plone.git
    git&amp;#64;github.com:collective/buildout.plonetest.git
    git&amp;#64;github.com:collective/collective.contacts.git
    git&amp;#64;github.com:collective/collective.controlpanel.edit_css.git
    git&amp;#64;github.com:collective/collective.developermanual.git
    git&amp;#64;github.com:collective/collective.formtoy.git
    git&amp;#64;github.com:collective/collective.github.com.git
    git&amp;#64;github.com:collective/collective.googleanalytics.git
    git&amp;#64;github.com:collective/collective.package.git
    git&amp;#64;github.com:collective/collective.project.git
    git&amp;#64;github.com:collective/collective.recaptcha.git
    git&amp;#64;github.com:collective/collective.recipe.grp.git
    git&amp;#64;github.com:collective/collective.recipe.rsync.git
    git&amp;#64;github.com:collective/collective.rip.git
    git&amp;#64;github.com:collective/collective.stats.git
    git&amp;#64;github.com:collective/funnelweb.git
    git&amp;#64;github.com:collective/github-collective.git
    git&amp;#64;github.com:collective/mr.migrator.git
    git&amp;#64;github.com:collective/plonecom-buildout.git
    git&amp;#64;github.com:collective/plonecom.theme.git
    git&amp;#64;github.com:collective/plonetheme.coolblue.git
    git&amp;#64;github.com:collective/plonetheme.freshpick.git
    git&amp;#64;github.com:collective/plonetheme.grungeera.git
    git&amp;#64;github.com:collective/plonetheme.keepitsimple.git
    git&amp;#64;github.com:collective/plonetheme.unilluminated.git
    git&amp;#64;github.com:collective/transmogrify.filesystem.git
    git&amp;#64;github.com:plone/Installers-OS-X.git
    git&amp;#64;github.com:plone/Products.PloneOrg.git
    git&amp;#64;github.com:plone/admin-docs.git
    git&amp;#64;github.com:plone/buildout.coredev.git
    git&amp;#64;github.com:plone/planet.plone.org.git
    git&amp;#64;github.com:plone/plone.api.git
    git&amp;#64;github.com:plone/plone.github.com.git
    git&amp;#64;github.com:plone/ploneorg.admin.git
    git&amp;#64;github.com:plone/plonetheme.ploneorg.git
vcs = git

[pythonpackages]
basedir = /Users/aclark/Developer/pythonpackages
checkouts =
    git&amp;#64;github.com:aclark4life/buildout-apache-mysql.git
    git&amp;#64;github.com:aclark4life/buildout-munin.git
    git&amp;#64;github.com:aclark4life/buildout-mysql.git
    git&amp;#64;github.com:aclark4life/buildout-nginx.git
    git&amp;#64;github.com:aclark4life/buildout-plone-haproxy.git
    git&amp;#64;github.com:aclark4life/buildout-plone-varnish.git
    git&amp;#64;github.com:aclark4life/buildout-zenoss.git
    git&amp;#64;bitbucket.org:pythonpackages/pythonpackages.com.git vanity_app
    git&amp;#64;github.com:pythonpackages/buildout-apache-modwsgi.git
    git&amp;#64;github.com:pythonpackages/buildout-bluebream.git
    git&amp;#64;github.com:pythonpackages/buildout-django.git
    git&amp;#64;github.com:pythonpackages/buildout-jenkins.git
    git&amp;#64;github.com:pythonpackages/buildout-plone-getpaid.git
    git&amp;#64;github.com:pythonpackages/buildout-plone.git
    git&amp;#64;github.com:pythonpackages/buildout-wordpress.git
    git&amp;#64;github.com:pythonpackages/buildout-zope2.git
    git&amp;#64;github.com:pythonpackages/experimental.pythonpackages.git
    git&amp;#64;github.com:pythonpackages/github-services.git pythonpackages-github-services
    git&amp;#64;github.com:pythonpackages/pyramidpypi.git pythonpackages-index
    git&amp;#64;github.com:pythonpackages/pythonpackages-blog.git
    git&amp;#64;github.com:pythonpackages/pythonpackages-docs.git
    git&amp;#64;github.com:pythonpackages/pythonpackages-graphs.git
    git&amp;#64;github.com:pythonpackages/pythonpackages-paste.git
    git&amp;#64;github.com:pythonpackages/pythonpackages-scaffolds.git
    git&amp;#64;github.com:pythonpackages/pythonpackages.sendpickedversions.git
    git&amp;#64;github.com:pythonpackages/pythonpackages-whiskers.git
    git&amp;#64;github.com:pythonpackages/pythonpackages.git
vcs = git

[toys]
basedir = /Users/aclark/Developer/toys
checkouts =
    git&amp;#64;github.com:aclark4life/basic_pyramid_zodb.git
    git&amp;#64;github.com:aclark4life/github_repos_cloner.git
    git&amp;#64;github.com:aclark4life/other.git
    git&amp;#64;github.com:aclark4life/python_study.git
    git&amp;#64;github.com:aclark4life/django-hello.git
vcs = git
&lt;/pre&gt;
&lt;p&gt;Now it's time to bootstrap the Collective Python Buildout, which gives me &lt;strong&gt;all versions of Python, ever&lt;/strong&gt; &lt;a class="footnote-reference" href="#id17" id="id10"&gt;[7]&lt;/a&gt;. And off we go:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd Developer/buildout.python
$ python bootstrap.py
&lt;/pre&gt;
&lt;p&gt;Finally, there is some PATH configuration required to make all of this seemless. The Collective Python Buildout gets installed in /opt while brew's stuff is in /usr/local. My PATH config currently looks like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
export PATH=/usr/local/bin:/usr/local/sbin:/opt/local/bin:/Users/aclark/Developer/buildout.python/python-2.7/bin:$PATH
export PATH=~/Developer/binfiles:/usr/local/share/npm/bin:$PATH
&lt;/pre&gt;
&lt;p&gt;With the above configuration, I default to the Python 2.7 in the Collective Python Buildout. That means that is the &amp;quot;python&amp;quot; or &amp;quot;virtualenv&amp;quot; I get when I type those commands. I use the full path or expanded binary name when I need them e.g. /usr/local/bin/python or python3.3.&lt;/p&gt;
&lt;p&gt;That's it! I hope you will check out dotfiles and checkoutmanager for all your development needs.&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id11" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Not really an ode: &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Ode"&gt;http://en.wikipedia.org/wiki/Ode&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id12" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I know about Kenneth Reitz's XCode Command line Tools only, but if I recall correctly there is some &amp;quot;gotcha&amp;quot; that has bitten me more than once if I use that instead of the full XCode. I wish I could remember what it was now, but it's not coming to me. If it works for you though, great!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id13" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id4"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I know about the system Python, and for small things like checkoutmanager and dotfiles I don't mind using it. But there is merit in avoiding it because Apple treats it like &amp;quot;their&amp;quot; Python and makes decisions for you that you may prefer to make yourself. E.g. I believe they use a crippled version of the readline library.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id14" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id7"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Distribute is a more actively maintained fork of the venerable setuptools library (which itself is built on top of the Python standard library's distutils). Are we having fun yet?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id15" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id9"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I also alias checkoutmanager to cm :-)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id16" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id6"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I force because I want to replace the newly created .ssh dir with the one I keep in my Dotfiles repository.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id17" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id10"&gt;[7]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Well, 2.4 through 3.3 at last count.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</summary><category term="Django"></category><category term="Mozilla"></category><category term="Plone"></category><category term="Python"></category></entry><entry><title>Please Help Me Do Open Source Work</title><link href="http://aclark.net/blog/2013/01/31/please-help-me-do-open-source-work/" rel="alternate"></link><updated>2013-01-31T13:00:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-01-31:2013/01/31/please-help-me-do-open-source-work/</id><summary type="html">&lt;p&gt;&lt;em&gt;From my 'mid-life-crisis' series of blog entries :-)&lt;/em&gt;&lt;/p&gt;
&lt;img alt="https://raw.github.com/ACLARKNET/blog/gh-pages/images/open-source-work.png" src="https://raw.github.com/ACLARKNET/blog/gh-pages/images/open-source-work.png" /&gt;
&lt;div class="section" id="open-source-work"&gt;
&lt;h2&gt;Open Source Work&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Open Source Work&lt;/strong&gt; has paid my bills for a long time. Starting with &lt;a class="reference external" href="http://plone.org"&gt;Plone&lt;/a&gt; in the early 2000s, to &lt;a class="reference external" href="http://djangoproject.com"&gt;Django&lt;/a&gt; in the early 2010s, to now. And for this, I am very grateful. To be clear: it's not exactly the &lt;em&gt;Open Source Work&lt;/em&gt; that has paid my bills, it's the consulting work I've been able to secure as a result of my dedication and devotion to open source software and communities. Which is great! (Even more clear: my dedication and devotion to open source software and communities has made learning new skills fun. And those skills have paid my bills for the past 8 years.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR: Open Source Work is awesome. I'll likely spend my entire life doing it (in some capacity or another). And while Open Source Work does not pay, the experience is invaluable.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="saas-offering"&gt;
&lt;h2&gt;SaaS Offering&lt;/h2&gt;
&lt;p&gt;Along the way, I caught the &amp;quot;startup bug&amp;quot; and have been interested in building a SaaS offering that would at least pay my bills, if not make me fantastically wealthy. Enter 2012's: &lt;a class="reference external" href="http://pythonpackages.com"&gt;pythonpackages.com&lt;/a&gt;. The year I spent doing pythonpackages.com work was awesome. I learned a lot. Traveled. Met a lot of cool folks who seemed genuinely interested in my idea(s). But unfortunately, I never made a dime doing it. The lesson, among others, is that &lt;strong&gt;SaaS offerings are hard&lt;/strong&gt;. I am now semi-focused on a &amp;quot;reboot&amp;quot; of the pythonpackages.com idea(s), but that's going to take a while to get going.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR: Consulting *was* the dream. Now building a SaaS offering *is* the dream (among others). So where does Open Source Work fit in?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="play-as-work"&gt;
&lt;h2&gt;Play as Work&lt;/h2&gt;
&lt;p&gt;I've been &amp;quot;working for a living&amp;quot; since age 14. Back then, I was a busboy and dishwasher in my family's Italian restaurant, where I first learned to &lt;strong&gt;work hard and have fun doing it&lt;/strong&gt;. Since then, I've always worked hard, had fun, and taken few vacations (except for 1994-1998 when I was a full time CS student). I suspect I will always &amp;quot;work for a living&amp;quot; though as I get older, the line between work and play becomes even blurrier. Everyone wants to love or at least like their work. But very few are able to turn their play in to paid work. That's what I want to do. And I am very fortunate, I think, to know what I want to do in life. I know middle aged folk that still don't know the answer to that question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR: liking my work *was* the dream. Now turning the things I like to do into paid work *is* the dream. In 2013, I would like to spend more time doing Open Source Work, working on projects like&lt;/strong&gt; &lt;a class="reference external" href="http://github.com/buildout"&gt;Buildout&lt;/a&gt;, &lt;a class="reference external" href="http://dcpython.org"&gt;DC Python&lt;/a&gt;, &lt;a class="reference external" href="http://github.com/python-imaging"&gt;Pillow&lt;/a&gt;, &lt;a class="reference external" href="http://plone.org"&gt;Plone&lt;/a&gt;, &lt;a class="reference external" href="http://github.com/codekoala/django-axes"&gt;django-axes&lt;/a&gt;, &lt;a class="reference external" href="http://resume.aclark.net/projects/#collective"&gt;et al&lt;/a&gt;. &lt;strong&gt;If you have benefited from my work on any of these projects, directly or indirectly, please consider making a&lt;/strong&gt; &lt;a class="reference external" href="https://www.gittip.com/aclark4life"&gt;gittip donation&lt;/a&gt; &lt;strong&gt;to help me do more Open Source Work in 2013.&lt;/strong&gt;&lt;/p&gt;
&lt;script data-gittip-username="aclark4life"
src="https://www.gittip.com/assets/widgets/0002.js"&gt;
&lt;/script&gt;&lt;/div&gt;
</summary><category term="Django"></category><category term="Mozilla"></category><category term="Plone"></category><category term="Python"></category></entry><entry><title>Python 3 Porting</title><link href="http://aclark.net/blog/2013/01/10/python-3-porting/" rel="alternate"></link><updated>2013-01-10T19:15:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-01-10:2013/01/10/python-3-porting/</id><summary type="html">&lt;p&gt;&lt;em&gt;The 3 in 2013 is for Python 3&lt;/em&gt;&lt;/p&gt;
&lt;img alt="https://raw.github.com/ACLARKNET/blog/gh-pages/images/python-3-port.jpg" src="https://raw.github.com/ACLARKNET/blog/gh-pages/images/python-3-port.jpg" /&gt;
&lt;p&gt;I tend to like projects that everyone else &lt;strong&gt;hates&lt;/strong&gt;, e.g.:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Removing persistent Python objects associated with missing classes in ZODB.&lt;/li&gt;
&lt;li&gt;Making new releases for old software that is still useful but unmaintained.&lt;/li&gt;
&lt;li&gt;Running flake8 on 10s or 100s of source files and hand-fixing the results.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Part of this has to do with &lt;strong&gt;repetition&lt;/strong&gt;. I know how to do these things, and I like doing them. Over and over. If someone says, &amp;quot;my Data.fs file is broken&amp;quot; I get excited. Anyway, I hope you get the idea.&lt;/p&gt;
&lt;div class="section" id="i-am-your-man"&gt;
&lt;h2&gt;I am your man&lt;/h2&gt;
&lt;p&gt;Which brings me to the subject of this post: &lt;strong&gt;Python 3 Porting&lt;/strong&gt;. I've been helping out porting the Python Imaging Library to Python 3 (via the Pillow fork, where I am the release manager). And it strikes me as the type of thing I'd be very interested in doing professionally. So, if you or your company are in need of a &amp;quot;workhorse&amp;quot; to plow through old code and update it, &lt;a class="reference external" href="http://aclark.net/team/alex-clark"&gt;I am your man&lt;/a&gt;. Please do &lt;a class="reference external" href="mailto:info&amp;#64;aclark.net"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-s-in-it-for-you"&gt;
&lt;h2&gt;What's in it for you&lt;/h2&gt;
&lt;p&gt;Now I know what you are thinking: &lt;strong&gt;porting Python 2 software to Python 3 is a lot of work for little gain&lt;/strong&gt;. Maybe. Maybe not. I'm not going to try to convince you otherwise, however I will tell you this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For me, 2013 is &amp;quot;the year of Python 3&amp;quot;. I've now promised to deliver and maintain a &lt;strong&gt;Python 3 compatible PIL by PyCon 2013&lt;/strong&gt;. I now care about Python 3 (this was not true before).&lt;/li&gt;
&lt;li&gt;The Python 3 Wall of Shame is now the &lt;a class="reference external" href="https://python3wos.appspot.com/"&gt;Python 3 Wall of Superpowers&lt;/a&gt;. We are over the hump.&lt;/li&gt;
&lt;li&gt;Many popular Python web frameworks support or are about to support Python 3 e.g. CherryPy, Django, Pyramid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, there is no time like the present to &lt;strong&gt;take a serious look at Python 3&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="Django"></category><category term="Mozilla"></category><category term="Plone"></category><category term="Python"></category></entry><entry><title>Pillow Python 3</title><link href="http://aclark.net/blog/2013/01/10/pillow-python-3/" rel="alternate"></link><updated>2013-01-10T12:15:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-01-10:2013/01/10/pillow-python-3/</id><summary type="html">&lt;p&gt;PIL is on its way to &lt;strong&gt;Python 3&lt;/strong&gt; via Pillow. Support from Brian Crowell and others has been merged into master here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/python-imaging/Pillow/pull/35"&gt;https://github.com/python-imaging/Pillow/pull/35&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And work continues toward a pre &lt;strong&gt;PyCon 2013&lt;/strong&gt; release! Please help if you can:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ubuntu users, read through &lt;a class="reference external" href="https://github.com/python-imaging/Pillow/issues/18"&gt;https://github.com/python-imaging/Pillow/issues/18&lt;/a&gt; and provide assistance with testing this Ubuntu package: &lt;a class="reference external" href="https://launchpad.net/~pythoneers/+archive/ppa"&gt;https://launchpad.net/~pythoneers/+archive/ppa&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Git experts, please comment on the merge issue described here: &lt;a class="reference external" href="https://github.com/python-imaging/Pillow/pull/35"&gt;https://github.com/python-imaging/Pillow/pull/35&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Everyone else, please git clone the master branch for testing: &lt;strong&gt;git://github.com/python-imaging/Pillow.git&lt;/strong&gt; and report issues as you find them: &lt;a class="reference external" href="https://github.com/python-imaging/Pillow/issues"&gt;https://github.com/python-imaging/Pillow/issues&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you!&lt;/p&gt;
</summary><category term="Python"></category></entry><entry><title>About My Work</title><link href="http://aclark.net/blog/2013/01/10/about-my-work/" rel="alternate"></link><updated>2013-01-10T11:45:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-01-10:2013/01/10/about-my-work/</id><summary type="html">&lt;p&gt;Regarding some of the criticism or objection to some of the content of my blog entries, etc., here are my thoughts:&lt;/p&gt;
&lt;div class="section" id="i-hear-you"&gt;
&lt;h2&gt;I hear you&lt;/h2&gt;
&lt;p&gt;No one is more critical of my work than me. If you have feedback, criticism, etc. then please do let me know. I consider very carefully every request I receive, and I make every attempt to be cordial and accommodating. The place to do that for &lt;strong&gt;this blog&lt;/strong&gt; is currently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/ACLARKNET/aclarknet.github.com/issues"&gt;https://github.com/ACLARKNET/aclarknet.github.com/issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or for folks without a GitHub account (i.e. anonymous):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://bitbucket.org/aclarknet/blog/issues"&gt;https://bitbucket.org/aclarknet/blog/issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or just email me:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="mailto:aclark&amp;#64;aclark.net"&gt;aclark&amp;#64;aclark.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or add a comment below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="controversial-entries-explained"&gt;
&lt;h2&gt;Controversial Entries Explained&lt;/h2&gt;
&lt;p&gt;I'd also like to clarify my intentions with regard to two of my most recent and somewhat controversial entries:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Zen of Zope&lt;/li&gt;
&lt;li&gt;Plone Kitty&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They are intended to be &lt;em&gt;pro&lt;/em&gt; Zope and &lt;em&gt;pro&lt;/em&gt; Plone. Yes, Zope can be complex. But it's also useful. And full of &amp;quot;been there, done that&amp;quot; wisdom. Yes, the simple days of Plone Kitty are gone, but there are many great things ahead. Let's carry the best of the past forward into the future.&lt;/p&gt;
&lt;p&gt;I don't always state my intentions this explicitly: because that is no where near as fun for me. But I don't want folks to get the wrong impression either, so please help me get the message right if you can.&lt;/p&gt;
&lt;p&gt;As always, thanks for reading.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="Plone"></category></entry><entry><title>Hello Plone Again</title><link href="http://aclark.net/blog/2013/01/09/hello-plone-again/" rel="alternate"></link><updated>2013-01-09T15:30:00-05:00</updated><author><name>aclark</name></author><id>tag:aclark.net/blog,2013-01-09:2013/01/09/hello-plone-again/</id><summary type="html">&lt;p&gt;Regarding my recent &amp;quot;Goodbye Plone&amp;quot; post:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It's come to my attention that the style of my departure post, and associated actions, may be perceived poorly. I'm sorry. This was not my intention, and I apologize if I've upset anyone. The Plone Community deserves the best, so let me see what I can do to address this.&lt;/li&gt;
&lt;li&gt;Several folks have reached out to express their concern about my departure, I appreciate this very much.&lt;/li&gt;
&lt;li&gt;While I stand behind my need to distance myself from such conflicts, I don't want to give the Plone Community or the outside world the wrong impression.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, let me say this: I'm thinking about what happened today, and I'm going to comment about it in the future. I.e. after 24 hours or so. Regardless of future updates, please consider me: &amp;quot;around in some capacity, but not as fully engaged for personal reasons&amp;quot; :-). This is an attempt to revert my abrubt departure, while at the same time not fully re-engaging until such time as I can determine the best course of action. Note that above all, and aside from my personal and professional goals, I don't want to be disruptive to the community if I can help it.&lt;/p&gt;
&lt;p&gt;Thanks for reading.&lt;/p&gt;
</summary><category term="Plone"></category></entry></feed>