<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns="http://purl.org/rss/1.0/">




    



<channel rdf:about="http://rpatterson.net/blog/aggregator/RSS">
  <title>Blog</title>
  <link>http://rpatterson.net</link>

  <description>
    
      Notes, findings, and ideas
    
  </description>

  

  
            <syn:updatePeriod>daily</syn:updatePeriod>
            <syn:updateFrequency>1</syn:updateFrequency>
            <syn:updateBase>2007-12-20T00:21:18Z</syn:updateBase>
        

  <image rdf:resource="http://rpatterson.net/logo.png" />

  <items>
    <rdf:Seq>
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/cioppino-sprint-2012" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/plone-sprints-east" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/pycon-2012-sprints" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/pycon-report-out" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/building-python-with-subversion-1.7" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/local-development-for-large-upgrades" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/buildout-performance-improvements" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/experimental.broken" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/making-easy_install-play-nicely-with-multi-arch" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/300-ticket-for-plone-conference-2011" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/looking-for-projects-and-or-a-team" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/centralized-git-svn-mirror" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/ratpoison-is-dead-long-live-stumpwm" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/grab-bag-of-git-svn-stuff" />
      
      
        <rdf:li rdf:resource="http://rpatterson.net/blog/using-functional-tests-for-profiling" />
      
    </rdf:Seq>
  </items>

</channel>


  <item rdf:about="http://rpatterson.net/blog/cioppino-sprint-2012">
    <title>Cioppino Sprint 2012</title>
    <link>http://rpatterson.net/blog/cioppino-sprint-2012</link>
    <description>I'm so glad this Bodega Bay, CA sprint is becoming a tradition</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>The <a class="reference external" href="http://rpatterson.net/blog/cioppino-sprint">Cioppino Sprint</a>
last year was a blast and we got a lot done.  I have high hopes it
will become a yearly tradition so and it <a class="reference external" href="http://www.coactivate.org/projects/cioppino/project-home">certainly is this year</a>.  Thanks
so much to <a class="reference external" href="http://www.stevemcmahon.com/">Steve</a>, <a class="reference external" href="http://www.eleddy.com/">Liz</a> and <a class="reference external" href="http://kapanka.com/">Spanky</a> for
putting this thing together.  Thanks also to <a class="reference external" href="http://davisagli.com/">David</a> for starting the <a class="reference external" href="http://www.coactivate.org/projects/cioppino/lists/cioppino-discussion/archive/2012/03/1331788630739/forum_view">discussion</a>
of what to work on for this non-technically oriented sprint.</p>
<p>Now, as the sprint <a class="reference external" href="http://rpatterson.net/blog/cioppino-sprint#manhattan">mixologist</a>, I'm off to
put together the shopping list for the bar.  I'm sure Steve and others
are thinking of the shopping lists for the actual cioppino.  The rest
of the sprint attendees are engaged in similar preparation.  And the
rest of you can just go stew in envy.  :-)</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>CioppinoSprint2012</dc:subject>
    
    
      <dc:subject>Front Page</dc:subject>
    
    <dc:date>2012-03-16T22:52:16Z</dc:date>
    
    <dc:modified>2012-03-16T22:52:16Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/plone-sprints-east">
    <title>Plone Sprints East</title>
    <link>http://rpatterson.net/blog/plone-sprints-east</link>
    <description>I'm going to Plone Sprints East, a sprints event with a symposium thrown in for flavoring.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I just booked the flight and <a class="reference external" href="http://www.coactivate.org/projects/pre-pse12-strategicesque-sprintacular/lists/pre-pse12-strategicesque-sprintacular-discussion/archive/2012/03/1331931287745/forum_view">most</a>
of the lodging, so it's official.  I'm going to <a class="reference external" href="http://weblion.psu.edu/symposium">Plone Sprints East
2012</a>.  For those of you not,
familiar, it's <a class="reference external" href="http://www.coactivate.org/projects/pre-pse12-strategicesque-sprintacular/project-home">over a week</a>
of <a class="reference external" href="http://weblion.psu.edu/symposium/schedule/sprints">sprints</a> with two days of <a class="reference external" href="http://weblion.psu.edu/symposium/schedule/plone-symposium-east-2012-talk-schedule">symposium
talks</a>
thrown in for diversity.  :-)</p>
<p>I have a room checking in on the 18th and checking out on the 25th at
the <a class="reference external" href="http://www.nittanylioninn.psu.edu/">Nittany Lion Inn</a> with two
double beds.  Does anyone want to <a class="reference external" href="http://www.coactivate.org/projects/pre-pse12-strategicesque-sprintacular/lists/pre-pse12-strategicesque-sprintacular-discussion/archive/2012/03/1331931287745/forum_view">share the room</a>?  Also, that leaves
the night of the 17th when I fly in and the night of the 25th before
the last day of sprints.  Does anyone have a couch, bit of floor, or a
spare bed they'd be willing to <a class="reference external" href="http://www.coactivate.org/projects/pre-pse12-strategicesque-sprintacular/lists/pre-pse12-strategicesque-sprintacular-discussion/archive/2012/03/1331931287745/forum_view">let me use</a> either of those nights?</p>
<p>Hope to see a lot of you there!</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2012-03-16T23:00:36Z</dc:date>
    
    <dc:modified>2012-03-16T23:00:36Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/pycon-2012-sprints">
    <title>PyCon 2012 Sprints</title>
    <link>http://rpatterson.net/blog/pycon-2012-sprints</link>
    <description>Sprinting after PyCon and my first time working with and contributing to Pyramid.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<h2 class="title">Sprinting on Pyramid</h2>
<p>Really my conference review should be taken worth a grain of salt,
because I never go for the talks, it's all about <a class="reference external" href="https://us.pycon.org/2012/community/sprints/projects/">the sprints</a>.  Having so
thoroughly enjoyed sprinting since I came out of my shell and joined
the <a class="reference external" href="http://plone.org">Plone</a> community in earnest, it's always the
only thing I'm really focused on.  What can I say?  In this wonderful
age where, through open-source communities and the recognition of the
ambiguous stuff that helps them thrive, we all recognize that things
like docs and diversity are as important as the quality of code or the
power of features, I'm still a code monkey at heart.</p>
<p>Since there were no Plone sprints that I heard of or saw on the
boards, I took the chance to sprint on <a class="reference external" href="http://www.pylonsproject.org/projects/pyramid/about">Pyramid</a>, part of the
<a class="reference external" href="http://www.pylonsproject.org/">Pylons</a> project and love child of
<a class="reference external" href="http://repoze.org/">repoze</a>.  I've been wanting to learn Pyramid
for quite some time now since I noticed how many of my favorite <a class="reference external" href="http://zope.org/">Zope</a> people have moved to Pyramid.  So I went to the
Pyramid room, sat down and asked what someone with plenty of zope
experience could do.</p>
<p>The <a class="reference external" href="https://github.com/Pylons/pyramid/wiki/Sprint-Ideas">Pyramid sprinters</a> were a great
group, very welcoming and friendly.  They remind me a lot of the
things I most love about the Plone community.  It also gave me the
chance to work closely with <a class="reference external" href="http://plope.com/">Chris McDonough</a>.
<a class="reference external" href="https://twitter.com/#!/chrismcdonough">Chris</a> is very smart, builds
great software, and is just very kind-hearted.</p>
<p>Here's some of the stuff I worked on:</p>
<ul>
<li><p class="first"><a class="reference external" href="https://github.com/Pylons/pyramid_debugtoolbar/pull/57">add IP range/network restriction</a> to
<a class="reference external" href="http://readthedocs.org/docs/pyramid_debugtoolbar/en/latest/">pyramid_debugtoolbar</a></p>
<p>I used this simple feature task to cut my teeth on the Pyramid
development environment and tool-chain.  It was the first time in a
long time I worked outside a <a class="reference external" href="http://www.buildout.org/">buildout</a>
environment and it made for some interesting comparisons.  They keep
things really simple relying only on <a class="reference external" href="http://packages.python.org/distribute/">distribute's setuptools</a> and <a class="reference external" href="http://www.virtualenv.org/en/latest/index.html">virtualenv</a>.</p>
<p>I have to say, I still prefer working with buildout.  Buildout's
caching is much better than <a class="reference external" href="http://packages.python.org/distribute/easy_install.html">easy_install's</a> and
virtualenv so updating the environment after changes is smoother and
faster.  For testing against multiple <a class="reference external" href="http://www.python.org/">Python</a> versions and implementations, such as
<a class="reference external" href="http://www.jython.org/">Jython</a> and <a class="reference external" href="http://pypy.org/">PyPy</a>,
Pyramid uses <a class="reference external" href="http://readthedocs.org/docs/tox/en/latest/">tox</a>
which is pretty slick and very useful.  I'd love to see something
like this for deploying the same buildout with different versions of
Python.</p>
</li>
<li><p class="first"><a class="reference external" href="https://github.com/repoze/repoze.sendmail/pull/2">support Python 3</a> in
<a class="reference external" href="http://pypi.python.org/pypi/repoze.sendmail/">repoze.sendmail</a></p>
<p>This was my first time tackling Python 2 and 3 compatibility
issues.  I have to say it's just not as hard as I feared.</p>
</li>
<li><p class="first"><a class="reference external" href="https://github.com/repoze/repoze.sendmail/pull/3">improve and centralize email message serializing</a> in
<a class="reference external" href="http://pypi.python.org/pypi/repoze.sendmail/">repoze.sendmail</a></p>
<p>The one place where there was a lot of Python 2 and 3 compatibility
pain was in the encoding of email messages.  In this case, as in
others I suspect, the problem was that encoding was being done all
over the place in a not-very-well-architected way and the real
solution was to clean things up and put in more clearly defined
boundaries and interfaces.</p>
<p>That task would have been <em>impossible</em> without <a class="reference external" href="http://pyvideo.org/video/684/the-email-package-past-present-and-future">R. David Murray</a>.
I pestered <a class="reference external" href="http://www.bitdance.com/blog/">him</a> endlessly and <a class="reference external" href="https://twitter.com/#!/rdavidmurray">he</a> helped me learn all the
deep, dark corners of the email protocols and the Python <a class="reference external" href="http://docs.python.org/library/email.html">email</a> package, both of which
have considerable quirks which some would call bugs.  At the end of
it, I had a clear sense of all the quirks of encoding emails and all
the things that the <cite>email</cite> package doesn't already do.  I baked
those into <a class="reference external" href="https://github.com/repoze/repoze.sendmail/blob/master/repoze/sendmail/encoding.py">repoze.sendmail.encoding</a>
and added that support as a part sending mail through
repoze.sendmail.</p>
<p>Once that was in place, finishing Python 2 and 3 compatibility was a
snap.</p>
</li>
<li><p class="first"><a class="reference external" href="https://github.com/Pylons/pyramid_mailer/pull/12">add Python 3 support</a> to
<a class="reference external" href="http://readthedocs.org/docs/pyramid_mailer/en/latest/">pyramid_mailer</a></p>
<p>Again, once <cite>repoze.sendmail.encoding</cite> was in-place, I just ripped
all the email encoding support out of <cite>pyramid_mailer</cite> and Python 2
and 3 compatibility was a cinch.</p>
</li>
<li><p class="first"><a class="reference external" href="https://github.com/Pylons/pyramid_mailer/issues/14">fix Cc/Bcc witout To handling</a> in
<a class="reference external" href="http://readthedocs.org/docs/pyramid_mailer/en/latest/">pyramid_mailer</a></p>
<p>While I had my hands in <cite>pyramid_mailer</cite>, I fixed a bug reported by
<a class="reference external" href="http://michael.merickel.org/">Michael Merickel</a>.</p>
</li>
<li><p class="first"><a class="reference external" href="https://github.com/Pylons/pyramid/issues/465">add support for multiple request parameters</a> when registering
<a class="reference external" href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/config.html?highlight=request_param#pyramid.config.Configurator.add_route">Pyramid views</a></p>
<p>I'm not even sure what this stuff does, but Pyramid has such great
test coverage, I was able to get started.  I'm still waiting for
feeback to see what I'm not yet understanding.</p>
</li>
<li><p class="first">updating <a class="reference external" href="http://docs.python.org/library/warnings.html#warnings.catch_warnings">warnings</a>
handling in <a class="reference external" href="https://github.com/Pylons/pyramid/pull/467">Pyramid tests</a></p>
<p>Just a simple test fixture update to cleanup output.</p>
</li>
</ul>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>virtualenv</dc:subject>
    
    
      <dc:subject>tox</dc:subject>
    
    
      <dc:subject>Pyramid</dc:subject>
    
    
      <dc:subject>buildout</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>repoze</dc:subject>
    
    
      <dc:subject>pycon2012</dc:subject>
    
    
      <dc:subject>Front Page</dc:subject>
    
    <dc:date>2012-03-16T22:27:48Z</dc:date>
    
    <dc:modified>2012-03-16T22:27:48Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/pycon-report-out">
    <title>PyCon 2012 Talks</title>
    <link>http://rpatterson.net/blog/pycon-report-out</link>
    <description>A bit about my experience at my first PyCon and the talks.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I'm riding the train home from the last day of the <a class="reference external" href="https://us.pycon.org/2012/community/sprints/projects/">PyCon sprints</a> following
the <a class="reference external" href="https://us.pycon.org/2012/schedule/">PyCon talks</a> so it's time
for a report-out.</p>
<div class="section" id="pycon-2012-itself">
<h3>PyCon 2012 Itself</h3>
<p>This is a very well organized conference.  The whole thing felt both
smooth <em>and</em> relaxed, which seems like quite a feat.  It was also
<em>huge</em> with something like ~2200 attendees if I remember correctly.  I
was still finding <a class="reference external" href="http://plone.org">Plone</a> people at the end of the
last day of talks.  It was pretty easy to not find people there.</p>
<p>The talks were short, I was always surprised when they were over.  I
think this is a great approach.  It draws economy out of the
presenters and cuts down on the zone-out effect.  They had a
<a class="reference external" href="http://guidebook.com/">Guidebook</a> app which was pretty cool.  Even
the meals were surprisingly good given that they were provided by the
venue.  Even the wireless was pretty good and I've seen much worse at
200-300 person conferences (<em>cough*Plone*cough</em>).</p>
<p>Now for the nitpicks...</p>
<p>It was harder than it should have been to find out which rooms talks
were in.  Firstly, the otherwise excellent Guidebook app, didn't have
the room numbers on the talk descriptions.  Even the schedule on the
conference web site, however, forced you to scroll around to try to
find out which room corresponded to the track the talk was for.</p>
<p>The venue was pretty good, but the location is kinda terrible.  On a
good day I can tolerate the more interesting parts of the south bay,
but the <a class="reference external" href="http://maps.google.com/maps/place?q=santa+clara+convention+center&cid=13973534836186469092">Santa Clara Convention Center</a>
is <em>deep</em> in the soulless spotlessness of the business-parkified heart
of Santa Clara.  This might be great if your choice form of
entertainment is the likes of Great America (right across the street)
but if you like any character whatsoever, you're SOL.  I'm glad the
venue food was better than I'd expect, and in such a location
providing lunch is a must for such a conference, but I would enjoy it
a lot more if there were interesting places to socialize in.</p>
</div>
<div class="section" id="talk-highlights">
<h3>Talk Highlights</h3>
<p>There were a lot of good talks with great coverage of technical
topics.  I was pleasantly surprised to find a healthy amount of
non-technical talks, including talks on docs as well.  Finally, it was
good for a died-in-the-wool web programmer such as myself to be
reminded that Python is used for other things.</p>
<p>Here are some of the talks I most enjoyed:</p>
<ul>
<li><p class="first"><a class="reference external" href="http://pyvideo.org/video/674/militarizing-your-backyard-with-python-computer">Militarizing Your Backyard with Python: Computer Vision and the
Squirrel Hordes</a></p>
<p>Favorite quote of the con: &quot;I was <em>sure</em> this would be the solution.&quot;</p>
</li>
<li><p class="first"><a class="reference external" href="http://pyvideo.org/video/654/a-resume-based-wsgi-load-balancer">A resume-based WSGI Load Balancer</a></p>
<p><a class="reference external" href="http://www.zope.com/about_us/management/james_fulton.html">Jim</a>,
you beautiful mad-man!</p>
</li>
<li><p class="first"><a class="reference external" href="http://pyvideo.org/video/719/diversity-in-practice-how-the-boston-python-user">Diversity in practice: How the Boston Python User Group grew to 1700
people and over 15% women</a></p>
<p>I want to be a part of something like this!</p>
</li>
<li><p class="first"><a class="reference external" href="http://pyvideo.org/video/713/improving-documentation-with-beginners-mind-o">Improving Documentation with &quot;Beginner's Mind&quot; (or: Fixing the
Django Tutorial)</a></p>
<p>I'm looking at us, <a class="reference external" href="http://plone.org/documentation">Plone docs</a>.</p>
</li>
<li><p class="first"><a class="reference external" href="https://us.pycon.org/2012/schedule/presentation/380/">Python Metaprogramming for Mad Scientists and Evil Geniuses</a></p>
<p>His re-definition of &quot;Mad Scientist&quot; as someone doing crazy things
becuse it's cool and they can, and &quot;Evil Genius&quot; as someone doing
crazy things because it works have now become a part of my lexicon.</p>
</li>
<li><p class="first"><a class="reference external" href="http://pyvideo.org/video/685/what-python-can-learn-from-java">What Python can learn from Java</a></p>
<p>Gave my faith in Python a healthy shake-up.</p>
</li>
<li><p class="first"><a class="reference external" href="http://pyvideo.org/video/660/python-meets-the-arduino">Python Meets the Arduino</a></p>
<p>It's looking like microcontrollers for the hobbyist are getting
simple enough for even me to take a stab.</p>
</li>
<li><p class="first"><a class="reference external" href="http://pyvideo.org/video/669/building-a-kinect-game-with-python">Building a Kinect game with Python</a></p>
<p>So cool.  Damn you, Microsoft!  Of course, you wouldn't be such a
problem if you didn't do something right.</p>
</li>
</ul>
</div>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>pycon2012</dc:subject>
    
    
      <dc:subject>Front Page</dc:subject>
    
    <dc:date>2012-03-16T00:57:24Z</dc:date>
    
    <dc:modified>2012-03-16T00:57:24Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/building-python-with-subversion-1.7">
    <title>Building Python with Subversion 1.7</title>
    <link>http://rpatterson.net/blog/building-python-with-subversion-1.7</link>
    <description>I ran into a problem  when trying to build Python from source after upgrading SVN.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>In case anyone else runs into this error:</p>
<pre class="literal-block">
gcc -pthread -c -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes  -I. -IInclude -I./Include   -DPy_BUILD_CORE -DSVNVERSION=\&quot;`LC_ALL=C svnversion .`\&quot; -o Modules/getbuildinfo.o ./Modules/getbuildinfo.c
gcc: error: directory&quot;: No such file or directory
make: *** [Modules/getbuildinfo.o] Error 1
</pre>
<p>What's <a class="reference external" href="http://bugs.python.org/issue6094">happening here</a> is that
<a class="reference external" href="http://www.python.org/">Python</a> is using <cite>svnversion</cite> in it's build
process but the 1.7 version has different output than previous
versions.  I ran into this problem with Python 2.5 but not with Python
2.4.  I'm not sure about Python 2.6+ because I just downgraded
<a class="reference external" href="http://subversion.tigris.org/">subversion</a> temporarily before I
built the other versions of Python.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2012-03-13T02:04:53Z</dc:date>
    
    <dc:modified>2012-03-13T02:04:53Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/local-development-for-large-upgrades">
    <title>Local Development for Large Upgrades</title>
    <link>http://rpatterson.net/blog/local-development-for-large-upgrades</link>
    <description>Using COW to get a usable local setup when developing upgrade procedures for messy sites.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I've had to do way too many Plone upgrades where the sites are just a horrible nest of bad administration and maintenance, worse customizations, and the worst add-ons.  A site in such a state is going to take a lot of small adjustments and additions to the migration procedure to get it back into a healthy enough state for the Plone upgrades to run.  The kinds of problems you run into on such a site are often very specific to corners of functionality and very specific to deep dark corners of the content heirarchy.  I've found no better way to work on this than to implement upgrade steps, run the upgrade, fix any errors, QA the completed upgrade, write new upgrade steps and refine the existing ones and repeat ad nauseam.</p>
<p>Since running the upgrade procedure can take a long time, the iterations take a long time.  This is compounded by the amount of time it can take to transfer the DB, no matter how you do it.  Using <a class="reference external" href="http://www.zodb.org/documentation/guide/zeo.html">ZEO</a> over remote is very slow, I assume due to the latency, from looking at <a class="reference external" href="http://www.ex-parrot.com/pdw/iftop/">iftop</a> output.  Syncing the <a class="reference external" href="http://www.zodb.org/zodbbook/introduction.html#blobs">BLOBs</a>, even with a well tuned <a class="reference external" href="http://rsync.samba.org/">rsync</a>, script can take forever.</p>
<p>I finally found a set of approaches that brings my development of upgrade steps up to a tolerable speed.  It's still slower than &quot;normal&quot; development, but it no longer feels maddening.  Firstly, I developed an <a class="reference external" href="https://github.com/collective/collective.upgrade#readme">upgrade runner</a> that commits upgrades per profile version increment so that I don't have to start the whole procedure over.  It's called <tt class="docutils literal">collective.upgrade</tt> and I plan to cut a release along with a more detailed blog post once I've deployed this current upgrade.</p>
<p>Secondly, I used a <a class="reference external" href="http://en.wikipedia.org/wiki/Union_mount">union mount</a> (<a class="reference external" href="http://www.filesystems.org/project-unionfs.html">UnionFS</a>, <a class="reference external" href="http://aufs.sourceforge.net/">AUFS</a>, etc.) to get <a class="reference external" href="http://en.wikipedia.org/wiki/Copy-on-write">copy-on-write</a> behavior for my <tt class="docutils literal">var/filestorage/Data.fs</tt> and <tt class="docutils literal">var/blobstorage/</tt>.  IOW, whenever the upgrade procedure reads a BLOB, it gets it from the production blobstorage directory via a network filesystem (<a class="reference external" href="http://fuse.sourceforge.net/sshfs.html">SSHFS</a>, <a class="reference external" href="http://en.wikipedia.org/wiki/Server_Message_Block">CIFS/SMB</a>, <a class="reference external" href="http://en.wikipedia.org/wiki/Network_File_System">NFS</a>, etc.).  When writing to a BLOB, however, it writes it to a local directory and will use that version of the BLOB in the future.  Since BLOBs are very often compressed images and files, I find no penalty in just letting the network FS do a dumb transfer of BLOBs as opposed to compressing with <tt class="docutils literal">rsync <span class="pre">-z</span></tt>.  I also use the same setup for <tt class="docutils literal">Data.fs</tt>, but since it's much smaller than the BLOBs and it's much more heavily used than the BLOBs, I've found it best to just <tt class="docutils literal">rsync</tt> the <tt class="docutils literal">Data.fs</tt> and <tt class="docutils literal">Data.fs.index</tt>.  With this setup I can test the upgrade at nearly local speeds and my upgrade step development is much faster for having all my favorite tools.</p>
<p>Here's some scripts I'm using to do this.  It's very important that you mount the prod newtork FS as read-only with the <tt class="docutils literal"><span class="pre">-o</span> ro</tt> mount option:</p>
<pre class="literal-block">
sudo mount -v -t &lt;network fs type&gt; &lt;remote network fs URL&gt; var/prod -o ro,&lt;fs options&gt;
sudo mount -v -t aufs none var/filestorage -o dirs=var/filestorage.prod:var/prod/var/filestorage=rr
sudo mount -v -t aufs none var/blobstorage -o dirs=var/blobstorage.prod:var/prod/var/blobstorage=rr
</pre>
<p>When it's time to refresh to the latest prod, shutdown <a class="reference external" href="http://zope2.zope.org/">Zope</a> and ZEO:</p>
<pre class="literal-block">
rsync -Paz &lt;remote rsync URL&gt;/var/filestorage/Data.fs &lt;remote rsync URL&gt;/var/filestorage/Data.fs.index var/filestorage.prod/
rsync -Paz --existing &lt;remote rsync URL&gt;/var/blobstorage/ var/blobstorage.prod/
</pre>
<p>The second command there will only revert BLOBs that were already copied locally back to the prod version.</p>
<p>Enjoy, but be <em>very</em> careful that you don't accidentally apply changes to prod.  Backup prod and make <em>sure</em> your prod network mount is <em>read-only</em>.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2012-02-29T22:34:20Z</dc:date>
    
    <dc:modified>2012-02-29T22:34:20Z</dc:modified>
    <dc:type>Page</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/buildout-performance-improvements">
    <title>Buildout Performance Improvements</title>
    <link>http://rpatterson.net/blog/buildout-performance-improvements</link>
    <description>Getting a 6-7 fold decrease in zc.buildout run times.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I've been <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292">baffled</a> by
the amount of time running buildout takes.  In particular, it seemed
like a lot of duplicate work was being done when multiple parts had
identical or very similar sets of required eggs/distributions.  After
a bunch of <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292">profiling</a> <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15302">and</a> <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307">timing</a>, I've found there are a number of ways
to increase your buildout performance.</p>
<dl class="docutils">
<dt>Use <a class="reference external" href="http://pypi.python.org/pypi/buildout.dumppickedversions">buildout.dumppickedversions</a> version 0.5 or later:</dt>
<dd>If you're using <a class="reference external" href="http://pypi.python.org/pypi/buildout.dumppickedversions">buildout.dumppickedversions</a>, use
version 0.5.  This release includes <a class="reference external" href="http://dev.plone.org/collective/changeset/247821">a fix</a> I contributed
which yields a <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15302">3-4 fold decrease</a> in runtime if buildout is run
with just the <tt class="docutils literal"><span class="pre">-N</span></tt> option and no <tt class="docutils literal"><span class="pre">-v</span></tt> options.  If your're using
<a class="reference external" href="http://pypi.python.org/pypi/buildout-versions">buildout-versions</a> instead of
buildout.dumppickedversions, unfortunately <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15319">it suffers from the
same problem</a>.
The author knows about this and may address it but until then you
may want to switch to buildout.dumppickedversions.</dd>
<dt>Use <a class="reference external" href="http://pypi.python.org/pypi/zc.buildout/1.5.2">zc.buildout version 1.5</a> or later:</dt>
<dd>This seems to yield a <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307">2-3 fold decrease</a>
in buildout runtime when run with <tt class="docutils literal"><span class="pre">-N</span></tt> and addresses a <a class="reference external" href="http://zope3.pov.lt/trac/changeset/124059">similar
hot loop</a> as found in
buildout.dumppickedversions.  In fact, it's resolution of required
distributions seems to be much more efficient in general.  If
you're stuck with 1.4, I've <a class="reference external" href="http://zope3.pov.lt/trac/changeset/124060">contributed</a> the same fix as for
buildout.dumppickedversions to the 1.4 branch so it should make it
into a next release if someone makes a new 1.4 release.</dd>
<dt>Use the <a class="reference external" href="http://pypi.python.org/pypi/zc.buildout/1.5.2#newest-and-offline-modes">-N</a> option:</dt>
<dd>With the above newest releases of zc.buildout and
buildout.dumppickedversions, you can now exercise a lot of control
of your run times <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307">depending on what command-line options you use</a>.
In particular, make sure <a class="reference external" href="http://pypi.python.org/pypi/zc.buildout/1.5.2#newest-and-offline-modes">newest</a>
is false and that <a class="reference external" href="http://pypi.python.org/pypi/zc.buildout/1.5.2#predefined-buildout-options">verbosity</a> is not
increased.  Both of these can be influenced by options in the
buildout configuration, so keep an eye out for that, but if no
such options are interfering then this means just invoking
buildout like <tt class="docutils literal">$ bin/buildout <span class="pre">-N</span> <span class="pre">-c</span> buildout.cfg</tt>.  IOW, use one
<tt class="docutils literal"><span class="pre">-N</span></tt> option and no <tt class="docutils literal"><span class="pre">-v</span></tt> options.  Before the improvements in
zc.buildout 1.5 and the fix to buildout.dumppickedversions, a lot
of time was wasted doing work that would only actually be used if
<tt class="docutils literal"><span class="pre">-v</span></tt> had been given.</dd>
<dt>Clean out your egg cache and use <tt class="docutils literal">virtualenv <span class="pre">--no-site-packages</span></tt>:</dt>
<dd>Some of the remaining inefficiencies in zc.buildout are
<a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15305">proportional to the number of distributions</a>
available on <tt class="docutils literal">sys.path</tt>.  IOW if you reduce the number of
distributions to be scanned, you can increase performance.  If
you're using a <a class="reference external" href="http://pypi.python.org/pypi/zc.buildout/1.5.2#user-defaults">shared</a>
<a class="reference external" href="http://pypi.python.org/pypi/zc.buildout/1.5.2#predefined-buildout-options">eggs-directory</a> or have a
buildout that has been around for a long time, there may be a lot
of different versions of the same packages in <tt class="docutils literal"><span class="pre">eggs-directory</span></tt>.
By cleaning those out you reduce the number of distributions that
buildout needs to scan.  I recommend just emptying your
<tt class="docutils literal"><span class="pre">eggs-directory</span></tt> and then letting buildout re-download all the
eggs it actually needs now.  I takes a while once, but then it's
done.  Similarly, using <tt class="docutils literal">virtualenv <span class="pre">--no-site-packages</span></tt> can
reduce the number of dists buildout needs to scan.</dd>
<dt>Help me get <a class="reference external" href="http://zope3.pov.lt/trac/log/zc.buildout/branches/env-cache">zc.buildout/branches/env-cache</a> merged and released:</dt>
<dd>Having said the above about cleaning out the egg cache,
<tt class="docutils literal">buildout</tt>, <tt class="docutils literal">distribute</tt>, and <tt class="docutils literal">setuptools</tt> shouldn't be
scanning these paths multiple time anyways.  Along with package
indexes, these paths are global in nature and so the dists found
there should only be scanned for once and cached globally.  I've
started this work on the <a class="reference external" href="svn+ssh://svn.zope.org/repos/main/zc.buildout/branches/env-cache">env-cache</a>
branch of zc.buildout.  In my timing tests, this branch seems to
yield another <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307">~60% decrease</a>
in run time.  The zc.buildout tests, however, <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292">are a PITA</a>
and Jim Fulton is <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15315">a very busy man</a>
with little time to evaluate this branch.  If anyone else can help
me shepherd this branch through to merge and then release, that
would be great.  I've <a class="reference external" href="http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15306">written up</a>
how to use this branch with your existing buildouts.</dd>
</dl>
<p>With all this in effect I took a production buildout and another
development buildout from 2 minute run times down to 20 second run
times.  This really makes re-running buildout something I no longer
feel an urge to avoid.  So use zc.buildout 1.5.2,
buildout.dumppickedversions 0.5, <tt class="docutils literal"><span class="pre">-N</span></tt> and do what you can to help
get the <tt class="docutils literal"><span class="pre">env-cache</span></tt> branch merged.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2012-01-27T18:08:32Z</dc:date>
    
    <dc:modified>2012-01-27T18:08:32Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/experimental.broken">
    <title>experimental.broken</title>
    <link>http://rpatterson.net/blog/experimental.broken</link>
    <description>Graceful handling of broken interfaces and components in the ZODB.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Worst.package.name.ever... inentionally!  :-)  But seriously, <em>read the warnings</em> and heed them.  If I have to tell you to read the warnings, you shouldn't use this package.</p>
<p>We in <a class="reference external" href="http://plone.org">Plone</a> land have been long frustrated about how easily a poorly behaved add-on could break a Plone site.  Simply installing the add-on and removing it can leave your site inaccessible, even the ZMI!  Often times add-ons that provide only minimal additional object behavior can break the entire object when removed.</p>
<p>Now this isn't actually the ZODB's fault at all.  The <a class="reference external" href="http://pypi.python.org/pypi/ZODB3">ZODB</a> actually has quite robust handling of broken object and it works quite well.  I'm afraid that fault here lies in <a class="reference external" href="http://pypi.python.org/pypi/zope.interface">zope.interface</a> and <a class="reference external" href="http://pypi.python.org/pypi/zope.component">zope.component</a>.  They're simply both too central to almost <em>all</em> ZODB applications to fail to provide graceful handling of broken objects.  So I've taken advantage of the <a class="reference external" href="http://ploneconf.org/event/sprints">sprints</a> following the <a class="reference external" href="http://ploneconf.org/">Plone Conference</a> here in San Francisco to work on this.</p>
<p>The <a class="reference external" href="https://github.com/rpatterson/experimental.broken">experimental.broken</a> package provides patches for zope.interface and zope.component to make the services they provide more tolerant of broken objects in the ZODB and allows them to function as if the interfaces and components aren't there when the add-on has been removed.  Even better, if the add-on is restored, the full behavior of the interfaces and components is restored.</p>
<p>That said, this is all highly experimental so don't use it.  If you do use it, never use it in production and only use it on a copy of your ZODB.  And if you do use it, <em>definitely</em> report your experience.  If you do have a broken site I'd love to hear how it works for you.  Just add experimental.broken to your instance eggs.</p>
<p>If this approach tests well and the core Zope developers think it's the right approach I'll be merging this into zope.interface and zope.component.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-11-07T07:54:57Z</dc:date>
    
    <dc:modified>2011-11-07T07:54:57Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/making-easy_install-play-nicely-with-multi-arch">
    <title>Making easy_install play nicely with multi-arch</title>
    <link>http://rpatterson.net/blog/making-easy_install-play-nicely-with-multi-arch</link>
    <description>How to help extensions built with easy_install find Debian/Ubuntu multi-arch libraries.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>The poorly documented <tt class="docutils literal"><span class="pre">~/.pydistutils.cfg</span></tt> allows setting defaults for command-line arguments to <tt class="docutils literal">distutils</tt> <tt class="docutils literal">setup.py</tt> commands such as <tt class="docutils literal">python setup.py build_ext <span class="pre">--library-dirs</span></tt>.  Use this to get <tt class="docutils literal">easy_install</tt> to build eggs with extension modules that need to find libaries on <tt class="docutils literal"><span class="pre">multi-arch</span></tt> systems like Ubuntu and Debian.  Just add the following two lines to <tt class="docutils literal"><span class="pre">~/.pydistutils.cfg</span></tt>:</p>
<pre class="literal-block">
[build_ext]
library_dirs = /usr/lib:/usr/lib/i386-linux-gnu:/usr/local/lib
</pre>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-10-26T20:08:21Z</dc:date>
    
    <dc:modified>2011-10-26T20:08:21Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/300-ticket-for-plone-conference-2011">
    <title>$300 Ticket for Plone Conference 2011</title>
    <link>http://rpatterson.net/blog/300-ticket-for-plone-conference-2011</link>
    <description>My old boss has a ticket to Plone Conference 2011 that he can't use afterall.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[I'm sad to hear it but Rob Stephenson can't come to the conference afterall.  The good news is that he's looking to sell his ticket to someone for just $300.  If anyone's interested email him: rstephe at alumni dot princeton dot edu.]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-10-05T20:17:59Z</dc:date>
    
    <dc:modified>2011-10-05T20:17:59Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/looking-for-projects-and-or-a-team">
    <title>Looking for Projects and/or a Team</title>
    <link>http://rpatterson.net/blog/looking-for-projects-and-or-a-team</link>
    <description>I'm available for work and am interested in contract/consultant projects or a position with a team.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I've been doing a lot of thinking recently about which direction I
want to take my professional life as a software developer and I've
come to some conclusions.  I'll detail more about that below if you're
interested in my process and thinking on that but first I'll summarize
what I'm looking for.</p>
<dl class="docutils">
<dt>Consulting/Contract Opportunities</dt>
<dd><p class="first">I'm perfectly happy to keep working independently or as a
sub-contractor with a larger consultancy on <a class="reference external" href="http://plone.org/">Plone</a> projects.  I know Plone very well and am
very happy to continue working with it on projects such as:</p>
<ul class="last simple">
<li>Intranet workflow/business-process applications</li>
<li>Custom web publishing CMS projects</li>
<li>Quickly solving critical problems as a Plone &quot;hired gun&quot;</li>
<li>Building a project while also cross-training internal developers</li>
<li>Social justice related projects</li>
<li>Etc., pretty much any Plone project</li>
</ul>
</dd>
<dt>Opportunities with a Team</dt>
<dd><p class="first">I'm eager to join a team, either as an employee or as a
contractor, that can offer some of the following:</p>
<ul class="last simple">
<li>More collaboration as a part of a team that genuinely like each other</li>
<li>More technological diversity outside of Plone/Zope</li>
<li>Opportunity to work on social justice related projects</li>
</ul>
</dd>
</dl>
<div class="section" id="team-collaboration">
<h3>Team Collaboration</h3>
<p>I've been working as an independent freelancer since 2005 in one form
or another.  I've probably worked about 1/3 as a &quot;sub-contractor&quot; for
a larger consultancy as a developer team member on larger projects.
The rest of my work has been as a solo contractor doing everything
from requirements gathering to deployment and support, end-to-end.</p>
<p>This has worked quite well for me.  I've got my personal project
management down to an art such that context switches cost either
project almost no time.  I enjoy the flexibility a lot such as being
able to work from home or my favorite cafe and also being able to work
at the times of day and the week when my brain is most productive.
(Oddly, I seem to be most productive writing code between midnight and
4AM, and more so Sunday nights to Monday mornings, go figure.)</p>
<p>I started working with Plone in 1999-2000 and initially I was a total
hermit, not getting involved in the community at all.  Eventually, I
started to come out of my shell and get more involved.  It was
something I waited far too long to do, especially in a community as
awesome and fun to work with as Plone's.  I've enjoyed the greater
interaction and collaboration in software development a lot and I'm
interested in having more of that in my working life.</p>
<p>As such, I'm interested in opportunities to join a team where there's
a solid connection and more collaboration.  I do enjoy my swingin'
freelancing location and hours flexibility, but I'm interested in
making that trade-off for the opportunity to work closely with people
with whom I have a good rapport.</p>
</div>
<div class="section" id="happy-code-monkey">
<h3>Happy Code Monkey</h3>
<p>For the last few years, I've also been wondering where I might want to
take my career.  It seemed to me there were two basic models for
advancement as a software developer and they're kind of the same
model: IT management, or starting a business.  While I'm very good at
solo project management, I'm not well suited to managing a team.  I
greatly value a good project manager, they're just a godsend.
Similarly, I'm just not inspired by the challenges of running a
business.  More generally, I don't have much natural capacity in those
domains and my lack of passion there means I'd be no good at
developing capacity there.</p>
<p>I suppose another &quot;path for advancement&quot; might be as someone who
creates new software frameworks, code used by code to build things.
Whether or not you think of that as a path for advancement, I have
similar feelings about this path.  I very much enjoy participating in
and contributing to the development of exciting frameworks and I feel
I have a lot to contribute there, but I'm not passionate about leading
such projects.</p>
<p>Finally it occurred to me that maybe I should just set my sights on
what I'm already passionate about, being a happy code monkey, a
conclusion aided and finalized by too many drinks with Liz and Spanky
after a sprint.  :-)  I find this conclusion very liberating which I
take as affirmation.</p>
<p>As such, I'm looking for opportunities where being a happy code monkey
is valued.  IOW, I'm interested opportunities to join a team with more
diverse opportunities for advancement other than IT management or
ownership.</p>
</div>
<div class="section" id="diversifying">
<h3>Diversifying</h3>
<p>I am a self-taught web developer who has spent most of that time as a
freelancer who <em>loves</em> working with the stack he first learned.  It's
hard to formulate a better recipe for over-specialization.  This is a
difficult issue because I really do love working with Plone but I also
know I would be happier and a better developer having more diversity
in my experience.</p>
<p>As such, I'm very interested in opportunities where I can leverage my
current expertise to gain new experience.  Anything in the Python web
app world would be good since I have very strong <a class="reference external" href="http://bfg.repoze.org/">Python</a> skills.  Working with the new direction
<a class="reference external" href="https://www.pylonsproject.org/">Pylons</a> is taking, <a class="reference external" href="https://www.pylonsproject.org/projects/pyramid/about">Pyramid</a>, could be an
even better fit since I can leverage my in-depth familiarity with it's
<a class="reference external" href="http://bfg.repoze.org/">Zope</a> underpinnings and heritage.</p>
</div>
<div class="section" id="social-justice">
<h3>Social Justice</h3>
<p>Finally, while I've gotten to work with clients in the education
domain here and there as well as some non-profits I support heartily,
I've never had the opportunity to work on projects relating to the
issues I am most passionate about, social justice issues.  I'm
interested in any opportunities to work on projects for organizations
doing work on queer, gender, labor, race, or environmental justice
issues.  I'm <em>very</em> interested in working for any technology
organization that provides technology services to such organizations.</p>
</div>
<div class="section" id="summary">
<h3>Summary</h3>
<p>If you're looking for a consultant/contractor or a team member, or
know of any such opportunities, which you think I'm suited for.
Please let me know.  Here is my contact information and links to my
online resumes.</p>
<blockquote>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name">
<col class="field-body">
<tbody valign="top">
<tr class="field"><th class="field-name">Name:</th><td class="field-body">Ross Patterson</td>
</tr>
<tr class="field"><th class="field-name">Resume:</th><td class="field-body"><a class="reference external" href="http://www.linkedin.com/in/rossp">LinkedIn</a></td>
</tr>
<tr class="field"><th class="field-name">Resume:</th><td class="field-body"><a class="reference external" href="http://careers.stackoverflow.com/rpatterson">Careers 2.0</a></td>
</tr>
<tr class="field"><th class="field-name">Email:</th><td class="field-body"><a class="reference external" href="mailto:me@rpatterson.net">me&#64;rpatterson.net</a></td>
</tr>
<tr class="field"><th class="field-name">Phone:</th><td class="field-body">+1 (415) 894-5323</td>
</tr>
<tr class="field"><th class="field-name">IRC:</th><td class="field-body"><a class="reference external" href="mailto:zenwryly@irc.freenode.net">zenwryly&#64;irc.freenode.net</a></td>
</tr>
<tr class="field"><th class="field-name">plone.org:</th><td class="field-body"><a class="reference external" href="http://plone.org/author/rossp">rossp</a></td>
</tr>
<tr class="field"><th class="field-name">GTalk:</th><td class="field-body"><a class="reference external" href="mailto:merpattersonnet@gmail.com">merpattersonnet&#64;gmail.com</a></td>
</tr>
<tr class="field"><th class="field-name">Yahoo IM:</th><td class="field-body">patterson_ross</td>
</tr>
<tr class="field"><th class="field-name">AIM:</th><td class="field-body">rosspatters</td>
</tr>
<tr class="field"><th class="field-name">MSN:</th><td class="field-body"><a class="reference external" href="mailto:me@rpatterson.net">me&#64;rpatterson.net</a></td>
</tr>
</tbody>
</table>
</blockquote>
</div>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-09-15T00:21:42Z</dc:date>
    
    <dc:modified>2011-09-15T00:21:42Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/centralized-git-svn-mirror">
    <title>Centralized Git-SVN mirror</title>
    <link>http://rpatterson.net/blog/centralized-git-svn-mirror</link>
    <description>For those of us using lots of "git svn clone"s, is any sort of central mirror worth it?</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I do almost everything in git these days, so when the code I'm committing to lives in <tt class="docutils literal">svn</tt> that means <tt class="docutils literal"><span class="pre">git-svn</span></tt>.  The initial <tt class="docutils literal">git svn clone</tt> can take quite a while, however.  <a class="reference external" href="http://rpatterson.net/blog/grab-bag-of-git-svn-stuff">Using gitify</a> can help such that you only need to <tt class="docutils literal">git svn clone</tt> once for each project accross multiple buildouts/branches, but it's maddening knowing that if it were just git, we'd be able to share the same clone across multiple <em>users</em>.  So I've been wondering about options for git-svn mirrors for a while now.</p>
<p>I ran across <a class="reference external" href="http://vimeo.com/28762003">this video</a> on a &quot;Planet ...&quot; feed of some sort recently describing what I've been looking for.  This guy also has a lot of other good <a class="reference external" href="http://www.tfnico.com/presentations/git-and-subversion">git-svn thoughts</a>.  I'm just not sure it's worth it.  I guess it all depends on how quickly people migrate to github or some such natively.  If there's any shared interest, leave a comment or email me.  If there's interest I'll start a thread somewhere.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-09-12T23:14:56Z</dc:date>
    
    <dc:modified>2011-09-12T23:14:56Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/ratpoison-is-dead-long-live-stumpwm">
    <title>Ratpoison is Dead, Long Live StumpWM</title>
    <link>http://rpatterson.net/blog/ratpoison-is-dead-long-live-stumpwm</link>
    <description>Replacing ratpoison with StumpWM.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>This is definitely of those &quot;Why did I wait so long?&quot; moments.  I've been <a class="reference external" href="http://rpatterson.net/blog/ratpoison-under-gnome">using ratpoison</a> for quite a while.  From time to time I would research other keyboard-driven, <a class="reference external" href="http://en.wikipedia.org/wiki/Tiling_window_manager#List_of_tiling_window_managers_for_X">tiling window managers</a> so I'd heard of and evaluated StumpWM before.  Somehow I'd missed that it was <em>intended</em> as the successor to ratpoison.  Doh!</p>
<p>At any rate, thanks to a <a class="reference external" href="http://www.rlazo.org/2011/09/10/stumpwm-my-new-window-manager/">Planet Emacsen blog post</a> I decided to give it a try.  It's a clear win for me.  Better group manaagement, key binding system, and plays nicely with the Gnome/Unity-2D panel when I need it.  It's all around more modern and less of a fight with modern desktops like Gnome/Unity-2D.  I don't think I'll be going back as long as the instability everyone mentions is manageable.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-09-12T06:16:18Z</dc:date>
    
    <dc:modified>2011-09-12T06:16:18Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/grab-bag-of-git-svn-stuff">
    <title>Grab Bag of git/svn stuff</title>
    <link>http://rpatterson.net/blog/grab-bag-of-git-svn-stuff</link>
    <description>Using gitify to pretend everyone has already switched</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>A while back I looked into gitify after someone mentioned it.  For some strange reason, I dismissed it.  I think it may have been <a class="reference external" href="http://davisagli.com/">David Glick</a> who mentioned it again when I was ranting recently, so I looked at it again and it is exactly what I want.  It allows treating an svn checkout as both an svn checkout <em>and</em> a git-svn clone with a local git cache.  Now if only I could get this to work with mr.developer.</p>
<p>But wait, hidden in a corner of mr.developer, and totally undocumented is a mr.developer.gitsvn module that does exactly that!  You can use a &quot;gitsvn&quot; checkout type and you're in business:</p>
<pre class="literal-block">
[sources]
...
collective.formcriteria = gitsvn https://svn.plone.org/svn/collective/collective.formcriteria/trunk
...
</pre>
<p>I was going to start modifying all my local.cfg buildout files to change all the &quot;svn&quot; checkouts to &quot;gitsvn&quot; checkouts when I noticed something about how mr.developer registers checkout types.  At the very bottom of mr/developer/gitsvn.py I changed:</p>
<pre class="literal-block">
common.workingcopytypes['gitsvn'] = GitSVNWorkingCopy
</pre>
<p>to:</p>
<pre class="literal-block">
common.workingcopytypes['gitsvn'] = GitSVNWorkingCopy
common.workingcopytypes['svn'] = GitSVNWorkingCopy
</pre>
<p>Viola!  Now mr.developer uses gitify for all svn checkouts.  Now I'm
getting close to being able to pretend svn doesn't exist.</p>
<p>I would love to see mr.developer use a global switch so I don't have
to modify the egg like this, maybe something in
~/.buildout/default.cfg.  If there's interest in that, I'd be happy to
contribute such a thing.  I should also mention that gitify is often
pretty rough and leaves svn and git in an inconsistent state which is
only really repairable by someone who is very familiar with both svn
and git.  The next time I run into that, I'll be trying to run it to
ground and contribute fixes.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-07-26T04:14:37Z</dc:date>
    
    <dc:modified>2011-07-26T04:14:37Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/blog/using-functional-tests-for-profiling">
    <title>Using Functional Tests for Profiling</title>
    <link>http://rpatterson.net/blog/using-functional-tests-for-profiling</link>
    <description>Use your functional tests with zope.testing/zope.testrunner to do easier profiling.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I've always enjoyed <a class="reference external" href="http://zope2.zope.org/">Zope2's</a> support for <a class="reference external" href="http://lionfacelemonface.wordpress.com/2011/02/08/profiling-plone-4-well-profiling-zope-while-running-plone-4/">profiling requests</a>, but it's also a bit of a PITA.  When profiling, even with cProfile or hotshot, <a class="reference external" href="http://python.org/">Python</a> can be a bit of a dog and with a featureful application like <a class="reference external" href="http://plone.org/">Plone</a>, it makes even a simple page load a painful experience.  So I have to get the page load I want to profile all set up in a browser, stop the instance, enable profiling, fire the instance back up, and then load the page I want to profile.  Then I have to be really careful not to load any pages other than the profiling view because not will they be dog slow but they will pollute the profiling data.  It's also quite laborious to profile a bunch of different page loads to try and get a more representative sense of where your hot spots are.  Finally, I <em>have</em> to use the Zope2 profiling view, I can't use other tools.</p>
<p>I've known about <a class="reference external" href="http://pypi.python.org/pypi/zope.testing">zope.testing</a>/<a class="reference external" href="http://pypi.python.org/pypi/zope.testrunner">zope.testrunner's</a> <a class="reference external" href="http://pypi.python.org/pypi/zope.testrunner#profiling">&quot;--profile=cProfile&quot;</a> command line option for sometime.  When you use it, it spits out the &quot;top 50 stats, sorted by cumulative time and number of calls&quot;.  Under a featureful application like Plone, however, the top 50 stats are usually consumed with the top publisher and template rendering calls and don't actually tell you anything useful.</p>
<p>Recently I needed to do some profiling of the baseline performance of an application.  Since I use functional <a class="reference external" href="http://pypi.python.org/pypi/zope.testbrowser">zope.testbrowser</a> tests a lot (some would say too much), my functional tests are actually a pretty good representation of the real world application usage.  So I was thrilled to find that the testrunner actually leaves the <em>raw profiling data</em> behind after a test run!  It leaves the data in the working directory in which the test run was invoked.  If you're doing this in buildout using a <a class="reference external" href="http://pypi.python.org/pypi/zc.recipe.testrunner">zc.recipe.testrunner</a> part named &quot;test&quot;, as is the convention, the file will be in parts/test/tests_profile.??????.prof.</p>
<p>In order to avoid the test fixture setup from polluting the profiling data, I use the <a class="reference external" href="http://pypi.python.org/pypi/zope.testrunner#repeating-tests">&quot;--repeat&quot;</a> command line option for the test runner to make sure that profiling data from the actual tests are much louder in the profiling data than the test setup.  For a large functional test suite I tend to use &quot;--repeat=3&quot; since the suite is long enough as it is and any more repetitions just take too long:</p>
<pre class="literal-block">
$ bin/test --profile=cProfile --repeat=3
</pre>
<p>If I'm profiling one test or a small number of tests, however, I like to use &quot;--repeat=10&quot; to be very sure that my profiling data isn't skewed:</p>
<pre class="literal-block">
$ bin/test -t my/functional/test.txt --profile=cProfile --repeat=10
</pre>
<p>Once the tests are finished I can fire up python and use the <a class="reference external" href="http://docs.python.org/library/profile.html#module-pstats">pstats module</a> to browse my stats.  Here I discovered another surprising convenience.  Since I use mr.developer everywhere right now, all the code I generally have an interest in optimizing is in &quot;src&quot;.  I can use that fact to get much more targeted stats reporting by <a class="reference external" href="http://docs.python.org/library/profile.html#pstats.Stats.print_stats">limiting the stats</a> to those for code in &quot;src&quot;:</p>
<blockquote>
<pre class="doctest-block">
&gt;&gt;&gt; import os
&gt;&gt;&gt; import pstats
&gt;&gt;&gt; stats = pstats.Stats('parts/test/tests_profile.??????.prof').sort_stats('cumulative')
&gt;&gt;&gt; stats.print_stats(os.getcwd()+'/src', 50)
...    parts/test/tests_profile.??????.prof
         ... function calls (... primitive calls) in ... CPU seconds
   Ordered by: cumulative time
   List reduced from ... to ... due to restriction &lt;'.../src'&gt;
   List reduced from ... to 50 due to restriction &lt;50&gt;
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   ...
</pre>
</blockquote>
<p>I'm actually wondering if this might be a better default for the testrunner output when &quot;--profile&quot; is used.  If the ZTK people think I should do that, just let me know and I'd be happy to contribute that.</p>
<p>You should also, however, be careful when just looking at the code in &quot;src&quot;.  For example, if your code is rendering templates when it doesn't need to, then limiting the stats to &quot;src&quot; will hide that from you.  Filtering by &quot;src&quot; is a good start, but be sure to also check out the top 50 overall and to look into single tests in detail so you don't miss anything.  See the <a class="reference external" href="http://docs.python.org/library/profile.html#pstats.Stats.print_stats">print_stats docs</a> to see everything you can do.</p>
<p>Finally, one should never just assume that even <em>functional</em> tests represent real-world load profiles.  I would love to see a tool for capturing and sanitizing request data from production along with the response times for those requests which can then turn that sanitized real-world data into functional load test suites.  This would be useful for doing continuous integration that can alert developers when they introduce performance regressions but it would also be <em>very</em> useful for targeted profiling where you could be nearly certain that your optimizations would get you the biggest bang for your users' bucks.  This is something I'd love to work on in a sprint sometime.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Ideas</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    <dc:date>2011-07-26T03:48:17Z</dc:date>
    
    <dc:modified>2011-07-26T03:48:17Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>





</rdf:RDF>

