<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alex Clark</title>
	<atom:link href="http://blog.aclark.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aclark.net</link>
	<description>Python programmer</description>
	<lastBuildDate>Thu, 02 Feb 2012 01:01:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>New vanity release</title>
		<link>http://blog.aclark.net/2012/01/30/new-vanity-release/</link>
		<comments>http://blog.aclark.net/2012/01/30/new-vanity-release/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 14:52:48 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Plone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=4590</guid>
		<description><![CDATA[With all the Python stats goodness going on recently, I got inspired to make a new vanity release. This release features the ability to display per package download statistics via the `-v` or `&#8211;verbose` command line argument. Here are some &#8230; <a href="http://blog.aclark.net/2012/01/30/new-vanity-release/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>With all the Python <a href="http://crate.io/">stats</a> <a href="http://python3wos.appspot.com/">goodness</a> going on recently, I got inspired to make a new <a href="http://pythonpackages.com/info/vanity">vanity</a> release. This release features the ability to display per package download statistics via the `-v` or `&#8211;verbose` command line argument.</p>
<p>Here are some of my favorite results.</p>
<h2>Vanity</h2>
<pre>$ vanity vanity -v
     vanity-1.0.zip     2011-04-14      352
   vanity-1.1.0.zip     2011-10-26      139
   vanity-1.1.1.zip     2011-10-28      114
   vanity-1.1.2.zip     2011-10-28      145
vanity-1.2.0.tar.gz     2012-01-30        0
-------------------------------------------
Package `vanity` has been downloaded 750 times!</pre>
<h2>Django</h2>
<pre>$ vanity django -v
Django-1.1.3.tar.gz     2010-12-23    2,618
Django-1.1.4.tar.gz     2011-02-09    4,476
  Django-1.2.tar.gz     2010-05-17   15,876
Django-1.2.1.tar.gz     2010-05-24   65,120
Django-1.2.2.tar.gz     2010-09-09    2,467
Django-1.2.3.tar.gz     2010-09-11   73,984
Django-1.2.4.tar.gz     2010-12-23   49,904
Django-1.2.5.tar.gz     2011-02-09   63,977
Django-1.2.6.tar.gz     2011-09-10      427
Django-1.2.7.tar.gz     2011-09-11    6,825
  Django-1.3.tar.gz     2011-03-23  238,504
Django-1.3.1.tar.gz     2011-09-10  176,054
-------------------------------------------
Package `Django` has been downloaded 700,232 times!</pre>
<h2>Plone</h2>
<pre>$ vanity plone -v
     Plone-3.2.zip     2008-12-31    1,690
   Plone-3.2.1.zip     2009-02-04    2,466
   Plone-3.2.2.zip     2009-03-03    4,893
   Plone-3.2.3.zip     2009-06-20    2,731
   Plone-3.2a1.zip     2008-10-10      976
  Plone-3.2rc1.zip     2008-12-15      758
     Plone-3.3.zip     2009-08-19    4,611
   Plone-3.3.1.zip     2009-09-09    4,148
Plone-3.3.2.tar.gz     2009-11-03    3,043
   Plone-3.3.3.zip     2009-12-08    1,733
   Plone-3.3.4.zip     2010-01-14    4,906
   Plone-3.3.5.zip     2010-03-03   12,131
Plone-3.3.6.tar.gz     2011-07-19      787
   Plone-3.3b1.zip     2009-03-12      940
  Plone-3.3rc1.zip     2009-03-30      743
  Plone-3.3rc2.zip     2009-04-05    1,822
  Plone-3.3rc3.zip     2009-05-23    2,036
  Plone-3.3rc4.zip     2009-07-07    2,163
  Plone-3.3rc5.zip     2009-08-01    1,211
     Plone-4.0.zip     2010-08-30    3,659
   Plone-4.0.1.zip     2010-10-04    4,224
   Plone-4.0.2.zip     2010-11-22    4,022
   Plone-4.0.3.zip     2011-01-21    3,339
   Plone-4.0.4.zip     2011-03-01    2,711
   Plone-4.0.5.zip     2011-04-09    3,152
   Plone-4.0.6.zip     2011-05-22    1,469
   Plone-4.0.7.zip     2011-06-06    2,192
   Plone-4.0.8.zip     2011-07-17      509
   Plone-4.0.9.zip     2011-07-29      958
  Plone-4.0.10.zip     2011-10-12      495
   Plone-4.0a1.zip     2009-11-19      946
   Plone-4.0a2.zip     2009-12-04      921
   Plone-4.0a3.zip     2009-12-21    1,272
   Plone-4.0a4.zip     2010-02-01    1,121
   Plone-4.0a5.zip     2010-02-19      850
   Plone-4.0b1.zip     2010-03-09    1,308
   Plone-4.0b2.zip     2010-04-10    1,028
   Plone-4.0b3.zip     2010-05-04    1,722
   Plone-4.0b4.zip     2010-06-13    1,642
Plone-4.0b5.tar.gz     2010-07-08    1,995
  Plone-4.0rc1.zip     2010-08-06    1,598
     Plone-4.1.zip     2011-07-17    4,479
Plone-4.1.1.tar.gz     2011-09-21      429
Plone-4.1.2.tar.gz     2011-10-08    2,187
Plone-4.1.3.tar.gz     2011-11-29    1,883
   Plone-4.1a1.zip     2011-01-21      699
   Plone-4.1a2.zip     2011-02-11      451
   Plone-4.1a3.zip     2011-02-15      680
   Plone-4.1b1.zip     2011-03-08      958
   Plone-4.1b2.zip     2011-04-09    1,040
  Plone-4.1rc2.zip     2011-05-22      797
  Plone-4.1rc3.zip     2011-06-06    1,329
   Plone-4.2a1.zip     2011-08-10      521
   Plone-4.2a2.zip     2011-09-16      884
Plone-4.2b1.tar.gz     2011-12-06      619
------------------------------------------
Package `Plone` has been downloaded 111,877 times!</pre>
<h2>Pyramid</h2>
<pre>$ vanity pyramid -v
   pyramid-1.0.tar.gz     2011-01-31   24,055
 pyramid-1.0.1.tar.gz     2011-08-13      460
 pyramid-1.0.2.tar.gz     2011-12-15      185
 pyramid-1.0a1.tar.gz     2010-11-05    1,128
 pyramid-1.0a2.tar.gz     2010-11-09      952
 pyramid-1.0a3.tar.gz     2010-11-16      803
 pyramid-1.0a4.tar.gz     2010-11-21    1,732
 pyramid-1.0a5.tar.gz     2010-12-15      639
 pyramid-1.0a6.tar.gz     2010-12-16      834
 pyramid-1.0a7.tar.gz     2010-12-20      912
 pyramid-1.0a8.tar.gz     2010-12-27    1,233
 pyramid-1.0a9.tar.gz     2011-01-08    1,313
pyramid-1.0a10.tar.gz     2011-01-18      960
 pyramid-1.0b1.tar.gz     2011-01-22      871
 pyramid-1.0b2.tar.gz     2011-01-25    1,003
 pyramid-1.0b3.tar.gz     2011-01-28      816
   pyramid-1.1.tar.gz     2011-07-22    5,674
 pyramid-1.1.1.tar.gz     2011-08-13    1,057
 pyramid-1.1.2.tar.gz     2011-08-17    1,560
 pyramid-1.1.3.tar.gz     2011-12-15      160
 pyramid-1.1a1.tar.gz     2011-06-20    1,146
 pyramid-1.1a2.tar.gz     2011-06-23    1,003
 pyramid-1.1a3.tar.gz     2011-06-26    1,252
 pyramid-1.1a4.tar.gz     2011-07-01    1,517
 pyramid-1.1b1.tar.gz     2011-07-10      981
 pyramid-1.1b2.tar.gz     2011-07-13      844
 pyramid-1.1b3.tar.gz     2011-07-15      742
 pyramid-1.1b4.tar.gz     2011-07-18    1,094
   pyramid-1.2.tar.gz     2011-09-13    6,450
 pyramid-1.2.1.tar.gz     2011-09-28   10,357
 pyramid-1.2.2.tar.gz     2011-11-20      322
 pyramid-1.2.3.tar.gz     2011-11-21    3,078
 pyramid-1.2.4.tar.gz     2011-12-06    1,193
 pyramid-1.2.5.tar.gz     2011-12-15      555
 pyramid-1.2.6.tar.gz     2012-01-05      514
 pyramid-1.2.7.tar.gz     2012-01-20      472
 pyramid-1.2a1.tar.gz     2011-08-24      907
 pyramid-1.2a2.tar.gz     2011-08-27      696
 pyramid-1.2a3.tar.gz     2011-08-29    3,268
 pyramid-1.2a4.tar.gz     2011-09-02      593
 pyramid-1.2a5.tar.gz     2011-09-04      840
 pyramid-1.2a6.tar.gz     2011-09-07      602
 pyramid-1.2b1.tar.gz     2011-09-08      493
 pyramid-1.2b2.tar.gz     2011-09-08      700
 pyramid-1.2b3.tar.gz     2011-09-11      674
 pyramid-1.3a1.tar.gz     2011-12-09    1,264
 pyramid-1.3a2.tar.gz     2011-12-14    1,641
 pyramid-1.3a3.tar.gz     2011-12-21    2,716
 pyramid-1.3a4.tar.gz     2012-01-05      675
 pyramid-1.3a5.tar.gz     2012-01-09    2,369
 pyramid-1.3a6.tar.gz     2012-01-20    1,917
---------------------------------------------
Package `pyramid` has been downloaded 97,222 times!</pre>
<p>Enjoy the new release.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2012/01/30/new-vanity-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello Plone theming</title>
		<link>http://blog.aclark.net/2012/01/25/hello-plone-theming/</link>
		<comments>http://blog.aclark.net/2012/01/25/hello-plone-theming/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 05:15:50 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Plone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=4564</guid>
		<description><![CDATA[In this post, we introduce a new tutorial aimed at bridging the gap between the incredibly easy to use and enormously powerful Diazo theming engine for Plone, and bootstrapping your first new theme. You do not need to have any &#8230; <a href="http://blog.aclark.net/2012/01/25/hello-plone-theming/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In this post, we introduce a new tutorial aimed at bridging the gap between the <strong>incredibly easy to use and enormously powerful Diazo theming engine for Plone</strong>, and bootstrapping your first new theme. You do not need to have any Python skills whatsoever to perform these tasks.</p>
<p>New Plone themes are:</p>
<ul>
<li>HTML/CSS/JavaScript/images (Sound familiar? You don&#8217;t need to know any Plone to understand this part.)</li>
<li>A set of rules that map your HTML/CSS/JavaScript/images to Plone content. (This part is Diazo-specific; and while Diazo is not part of Plone, integration is provided by a Python package called plone.app.theming.)</li>
</ul>
<p>The Diazo rules can get complex, but it&#8217;s very easy to get your first rule done and working and then off you go. You may find this <a href="http://readthedocs.org/docs/pythonpackages-docs/en/latest/ex8-diazo.html">new tutorial on pythonpackages.com</a>. Enjoy, and get busy theming Plone.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2012/01/25/hello-plone-theming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Year&#8217;s Python Meme 2012</title>
		<link>http://blog.aclark.net/2011/12/21/new-years-python-meme-2012/</link>
		<comments>http://blog.aclark.net/2011/12/21/new-years-python-meme-2012/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 18:11:32 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Plone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=4250</guid>
		<description><![CDATA[My response to http://tarekziade.wordpress.com/2011/12/20/new-years-python-meme-2/  (with gratuitous links to pythonpackages.com, my new project, sprinkled throughout). It was fun answering in 2009, so I thought I&#8217;d play again. What’s the coolest Python application, framework or library you have discovered in 2011? Pyramid. &#8230; <a href="http://blog.aclark.net/2011/12/21/new-years-python-meme-2012/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>My response to <a href="http://tarekziade.wordpress.com/2011/12/20/new-years-python-meme-2/">http://tarekziade.wordpress.com/2011/12/20/new-years-python-meme-2/</a>  (with gratuitous links to <a href="http://pythonpackages.com">pythonpackages.com</a>, my new project, sprinkled throughout).</em></p>
<p>It was fun <a href="http://blog.aclark.net/2009/12/31/new-years-python-meme/">answering in 2009</a>, so I thought I&#8217;d play again.</p>
<h1>What’s the coolest Python application, framework or library you have discovered in 2011?</h1>
<p><a href="http://www.pylonsproject.org/">Pyramid</a>. In early 2011 I released <a href="http://pythonpackages.com/info/vanity">vanity</a>, which later became <a href="http://pythonpackages.com">pythonpackages.com </a>(more or less). I used building the site as an excuse to learn Pyramid, and it was well worth it.</p>
<p><strong>What new programming technique did you learn in 2011?</strong></p>
<p>I learned to <strong>not</strong> reinvent the wheel, and to collaborate with others on solving hard problems (which in and of itself is hard). Long story short, I took a little bit of heat within the Plone CMS community for creating a &#8220;one off&#8221; migration script:</p>
<ul>
<li><a href="http://pythonpackages.com/info/parse2plone">http://pythonpackages.com/info/parse2plone</a></li>
</ul>
<p>I&#8217;ve since learned my lesson and have been collaborating meaningfully with <a href="https://twitter.com/#!/djay75">Dylan Jay </a>on the more widely-supported <a href="http://pythonpackages.com/info/mr.migrator">mr.migrator</a> and friends.</p>
<p><strong>What’s the name of the open source project you contributed to the most in 2011? What did you do?</strong></p>
<p>I contributed to the <a href="http://plone.org">Plone</a> project quite a bit (as I have been doing for years now), but I also fell in love with <a href="http://mozilla.org">Mozilla</a> (and their mission) and began working on various things, including a virtual machine to help with the development of <a href="http://support.mozilla.com">support.mozilla.com</a>:</p>
<ul>
<li><a href="https://github.com/aclark4life/kitsune-vagrant"><strong></strong>https://github.com/aclark4life/kitsune-vagrant</a></li>
</ul>
<p><strong>What was the Python blog or website you read the most in 2011?</strong></p>
<p><a href="http://news.ycombinator.com/">Hacker news</a>. I have the start-up bug.</p>
<p><strong>What are the three top things you want to learn in 2012?</strong></p>
<p>JavaScript, JavaScript, and JavaScript. I first heard the term 15 years ago and have been avoiding it ever since. Time to jump in.</p>
<p><strong>What is the top software, application or library you wish someone would write in 2012?</strong></p>
<p>I hope someone (me) writes a &#8220;secret&#8221; feature for <a href="http://pythonpackages.com">pythonpackages.com</a> and launches it in first quarter of 2012; and I hope folks find it useful.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/12/21/new-years-python-meme-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing pythonpackages.com</title>
		<link>http://blog.aclark.net/2011/11/29/introducing-pythonpackages-com/</link>
		<comments>http://blog.aclark.net/2011/11/29/introducing-pythonpackages-com/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 07:24:39 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=4137</guid>
		<description><![CDATA[The website for Python egoists™ I have this overwhelming desire to know how many times my favorite Python packages have been downloaded. Don&#8217;t you? If so, look no further than pythonpackages.com: Count downloads Where you can enter a package like &#8230; <a href="http://blog.aclark.net/2011/11/29/introducing-pythonpackages-com/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>The website for Python egoists™</h2>
<p>I have this overwhelming desire to know how many times my favorite Python packages have been downloaded. Don&#8217;t you? If so, look no further than <a href="http://pythonpackages.com">pythonpackages.com</a>:</p>
<h2 style="text-align: left;"><a href="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.03.48-AM.png"><img class="aligncenter size-full wp-image-4146" title="Screen Shot 2011-11-29 at 1.03.48 AM" src="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.03.48-AM.png" alt="" width="598" height="428" /></a>Count downloads</h2>
<p style="text-align: left;">Where you can enter a package like <a href="http://pythonpackages.com/info/django">Django</a> and find out:</p>
<h2 style="text-align: left;"><a href="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.11.25-AM.png"><img class="aligncenter size-full wp-image-4150" title="Screen Shot 2011-11-29 at 1.11.25 AM" src="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.11.25-AM.png" alt="" width="539" height="446" /></a>Count favorites</h2>
<p style="text-align: left;">Or click on <strong>Count favorites</strong> to reveal how many times it has been favorited:</p>
<p style="text-align: center;"><a href="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.12.04-AM.png"><img class="aligncenter size-full wp-image-4155" title="Screen Shot 2011-11-29 at 1.12.04 AM" src="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.12.04-AM.png" alt="" width="588" height="428" /></a></p>
<h2 style="text-align: left;">Find trash</h2>
<p style="text-align: left;">Or even poke some good natured fun at it, for its <a href="http://pythonpackages.com/trash/django">failure to provide adequate package metadata</a>:</p>
<h2 style="text-align: left;"><a href="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.12.24-AM.png"><img class="aligncenter size-full wp-image-4168" title="Screen Shot 2011-11-29 at 1.12.24 AM" src="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.12.24-AM.png" alt="" width="573" height="516" /></a></h2>
<h2 style="text-align: left;">Discuss packages</h2>
<p>You can even <em>discuss </em>packages on <a href="http://pythonpackages.com">pythonpackages.com</a>:</p>
<p style="text-align: center;"><a href="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.39.37-AM.png"><img class="aligncenter size-full wp-image-4182" title="Screen Shot 2011-11-29 at 1.39.37 AM" src="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.39.37-AM.png" alt="" width="599" height="580" /></a></p>
<h2>Recent activity</h2>
<p>But wait there is more! You can also browse the <a href="http://pythonpackages.com/pypi">latest changelog activity</a> from PyPi right on the site:</p>
<p style="text-align: center;"><a href="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.46.38-AM.png"><img class="aligncenter size-full wp-image-4189" title="Screen Shot 2011-11-29 at 1.46.38 AM" src="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.46.38-AM.png" alt="" width="576" height="574" /></a></p>
<h2 style="text-align: left;">Package info</h2>
<p>Lastly, if you get bored counting package downloads and favorites you can look at the <em>actual</em> <a href="http://pythonpackages.com/info/django">package metadata</a>.</p>
<p style="text-align: center;"><a href="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.51.59-AM.png"><img class="aligncenter size-full wp-image-4198" title="Screen Shot 2011-11-29 at 1.51.59 AM" src="http://blog.aclark.net/wp-content/uploads/2011/11/Screen-Shot-2011-11-29-at-1.51.59-AM.png" alt="" width="579" height="580" /></a></p>
<h2>Conclusion</h2>
<p>Sound interesting? Or utterly silly, perhaps? I think <a href="http://pythonpackages.com">pythonpackages.com</a> is the best of both. It started off as a front end to the command line utility <a href="http://pythonpackages.com/info/vanity">vanity</a>, but has taken on a life of it&#8217;s own.</p>
<p>After a small run on Python reddit and Hacker News, I&#8217;m looking forward to seeing what Python Planet folks think. So please check out <a href="http://pythonpackages.com">pythonpackages.com</a> and let me know. You can leave comments about the site here:</p>
<ul>
<li><a href="http://pythonpackages.com/about">http://pythonpackages.com/about</a></li>
</ul>
<p style="text-align: left;">Or open a new ticket here:</p>
<ul>
<li><a href="https://bitbucket.org/pythonpackages/pythonpackages.com/issues/new">https://bitbucket.org/pythonpackages/pythonpackages.com/issues/new</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/11/29/introducing-pythonpackages-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plone.org maintenance</title>
		<link>http://blog.aclark.net/2011/11/29/plone-org-maintenance/</link>
		<comments>http://blog.aclark.net/2011/11/29/plone-org-maintenance/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 05:54:01 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Plone]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=4065</guid>
		<description><![CDATA[Plans I am planning to do some work on the plone.org server and website by the end of the year, including: Upgrade to the latest 4.2.x series Switch from xdv to plone.app.theming Reduce the number of NGINXes running on the &#8230; <a href="http://blog.aclark.net/2011/11/29/plone-org-maintenance/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Plans</h2>
<p>I am planning to do some work on the plone.org server and website by the end of the year, including:</p>
<ul>
<li>Upgrade to the latest 4.2.x series</li>
<li>Switch from xdv to <a href="http://pythonpackages.com/info/plone.app.theming">plone.app.theming</a></li>
<ul>
<li>Reduce the number of NGINXes running on the server by 1 (we currently have an nginx doing the xdv transform)</li>
<li>Repackage the current plone.org theme as plonetheme.ploneorg</li>
</ul>
<li>Clean up the server</li>
<ul>
<li>Separate vendor package configs from buildout generated configs</li>
<li>Remove archived files</li>
</ul>
<li>Prune tickets on <a href="http://dev.plone.org/">dev.plone.org</a></li>
</ul>
<p>I&#8217;ve done some of this work already, earlier this year:</p>
<ul>
<li><a href="    https://github.com/plone/Products.PloneOrg/commits/4.1-compat">https://github.com/plone/Products.PloneOrg/commits/4.1-compat</a></li>
</ul>
<h2>Pitch</h2>
<p>To ensure it gets done by the end of the year, I would like to add this project to my calendar as paid work. So if you are able to help out by donating some portion of the goal, I would appreciate it. Please use the chip-in below to contribute to this effort.</p>
<p><object width="250" height="250" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://widget.chipin.com/widget/id/29e624bb38e7f7a4" /><param name="flashvars" value="" /><param name="allowscriptaccess" value="always" /><param name="wmode" value="transparent" /><embed width="250" height="250" type="application/x-shockwave-flash" src="http://widget.chipin.com/widget/id/29e624bb38e7f7a4" flashvars="" allowscriptaccess="always" wmode="transparent" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/11/29/plone-org-maintenance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plone secrets: Episode 4 &#8211; Varnish in front</title>
		<link>http://blog.aclark.net/2011/11/09/plone-secrets-episode-4-varnish-in-front/</link>
		<comments>http://blog.aclark.net/2011/11/09/plone-secrets-episode-4-varnish-in-front/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 17:50:10 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Plone]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=3901</guid>
		<description><![CDATA[This just in from the production department: use Varnish. (And please forgive the heavily meme-laden approach to describing these techniques .) Cache ALL the hosts Our ability to use Varnish in production is no secret by now, or at least &#8230; <a href="http://blog.aclark.net/2011/11/09/plone-secrets-episode-4-varnish-in-front/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>This just in from the production department: use Varnish. (And please forgive the heavily meme-laden approach to describing these techniques <img src='http://blog.aclark.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .)<br />
</em></p>
<h2>Cache ALL the hosts</h2>
<p><a href="http://memegenerator.net/cache/instances/400x/10/11036/11301169.jpg"><img class="alignright size-full wp-image-3946" title="11301169" src="http://blog.aclark.net/wp-content/uploads/2011/11/11301169.jpg" alt="" width="400" height="300" /></a>Our ability to use Varnish in production is no secret by now, or at least it shouldn&#8217;t be. What is often less clear is exactly how to use it. One way I like[1], is to run Varnish on your public IP port 80 and make Apache listen on your private IP port 80. Then proxy from Varnish to Apache and enjoy easy caching goodness on all your virtual hosts in Apache.</p>
<h2>Configuration</h2>
<p>This should require less than five minutes of down time to implement. First, configure the appropriate settings. (Well, first install Apache and Varnish if you haven&#8217;t already: `aptitude install varnish apache2` on Ubuntu Linux[0].)</p>
<h3>Varnish</h3>
<p>To modify the listen IP address and port, we typically edit a file like <em>/etc/default/varnish</em> (in Ubuntu). However you do it, configure the equivalent of the following on your system:</p>
<pre>DAEMON_OPTS="-a 174.143.252.11:80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -s malloc,256m"</pre>
<p>This environment variable is then passed to <em>varnishd</em> on the command line. Next, pass traffic to Apache like so (in <em>/etc/varnish/default.vcl</em> on Ubuntu):</p>
<pre>backend default {
 .host = "127.0.0.1";
 .port = "80";
 }</pre>
<p>Now on to Apache.</p>
<p><strong><em>Please note that the syntax above is for Varnish 3.x and the syntax has (annoyingly) changed from 2.x to 3.x.</em></strong></p>
<h3>Apache</h3>
<p>The Apache part is a bit simpler. You just need to change the listen port (on Ubuntu this is done in <em>/etc/apache2/ports.conf</em>), typically from something like:</p>
<pre>Listen *:80</pre>
<p>to:</p>
<pre>Listen 127.0.0.1:80</pre>
<h2>Restart ALL the services</h2>
<p>Now restart both services. If all goes well you shouldn&#8217;t notice any difference, except better performance, and when you make a website change and need to clear the cache[2]. For this, I rely on telnetting to the varnish port and issuing the `ban.url` command (formerly `url.purge` in 2.x):</p>
<pre>$ telnet localhost 6082
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
200 205     
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.35.4-rscloud,x86_64,-smalloc,-smalloc,-hcritbit

Type 'help' for command list.
Type 'quit' to close CLI session.

ban.url /
200 0</pre>
<h2>Cache ALL the disks</h2>
<p>This site has Varnish and Apache configured as described in this article. It also has disk caching in Apache enabled, thanks to Elizabeth Leddy&#8217;s article:</p>
<ul>
<li><a href="http://plonechix.blogspot.com/2011/08/10-minute-caching-with-apache.html">http://plonechix.blogspot.com/2011/08/10-minute-caching-with-apache.html</a></li>
</ul>
<p>As a result, it&#8217;s <strong>PEPPY AS THE DICKENS™</strong> on a 512MB &#8220;slice&#8221; (Cloud server) from Rackspace Cloud. And now you know yet another &#8220;Plone secret&#8221;. Now go make your Plone sites faster, and let me know how it goes in the comments section below.</p>
<h2>Notes</h2>
<p>[0] Using the latest distribution, &#8220;oneric&#8221;.</p>
<p>[1] I first saw this technique at NASA when NASA Science was powered by Plone; I found it odd at the time but years later it makes perfect sense.</p>
<p>[2] Ideally you&#8217;d configure this in p.a.caching, but I&#8217;ve not been able to stomach this yet.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/11/09/plone-secrets-episode-4-varnish-in-front/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plone: First class Python citizen</title>
		<link>http://blog.aclark.net/2011/10/24/plone-first-class-python-citizen/</link>
		<comments>http://blog.aclark.net/2011/10/24/plone-first-class-python-citizen/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 13:09:42 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Plone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=3735</guid>
		<description><![CDATA[The Plone community and software fit nicely within the larger Python ecosystem. Here&#8217;s why. For almost as long as I have been involved in the Plone project, I&#8217;ve been interested in Plone&#8217;s role in the Python ecosystem. Today as I &#8230; <a href="http://blog.aclark.net/2011/10/24/plone-first-class-python-citizen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>The Plone community and software fit nicely within the larger Python ecosystem. Here&#8217;s why.</em></p>
<p>For almost as long as I have been involved in the <a href="http://plone.org">Plone</a> project, I&#8217;ve been interested in Plone&#8217;s role in the Python ecosystem. Today as I look across the current landscape, I&#8217;m proud to announce a new milestone the Plone community can take pride in. But the change didn&#8217;t happen overnight, so first let&#8217;s take a quick look back.</p>
<h2>PyPI support in PSC</h2>
<p>Circa 2008, Tarek Ziadé and others finished the PyPI integration branch of PloneSoftwareCenter started by Sidnei Da Silva 2 years before.</p>
<p><a href="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-22-at-9.18.04-AM.png"><img class="size-full wp-image-3760 alignnone" title="Screen Shot 2011-10-22 at 9.18.04 AM" src="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-22-at-9.18.04-AM.png" alt="" width="602" height="502" /></a></p>
<p>This was a big step towards the &#8220;Pythonification&#8221; of Plone, mainly because Plone packages could now be published on plone.org in the same way Python packages are published to the Python Package Index: via &#8220;python setup.py upload&#8221;. In fact if you are publishing Plone packages, it is recommended that you release to <em>both</em> PyPI and plone.org simultaneously. This ensures your package is visible to the most number of potential users. And you can use <a href="http://pypi.python.org/pypi/jarn.mkrelease">mkrelease</a> to automate the process.</p>
<h2>Collective docs at RTD</h2>
<p>Just when you thought things couldn&#8217;t get more exciting in Python land, along came <a href="http://readthedocs.org/">readthedocs.org</a> (a Django Dash production, IIRC). And to <a href="https://github.com/collective/collective.developermanual/commit/4dc34d113b1a62064c83f3c431acc7d8deb42f1a">join the fun in July 2011</a>, I moved Mikko Ohtamaa&#8217;s awesome <strong>Plone Community Managed Developer Manual</strong> to the <a href="http://github.com/collective">Github collective</a> and configured the RTD <a href="https://github.com/blog/41-service-integration">service hook</a>.</p>
<p><a href="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-22-at-9.14.14-AM.png"><img class="size-full wp-image-3771 alignnone" title="Screen Shot 2011-10-22 at 9.14.14 AM" src="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-22-at-9.14.14-AM.png" alt="" width="556" height="418" /></a></p>
<p>This means that whenever anyone commits a change to the developer manual, within a few minutes a new Sphinx build <a href="http://collective-docs.readthedocs.org/en/latest/index.html">gets published</a>. It was so easy to set this up, I wish I had done it sooner.</p>
<p>So you can that see over the years, we have been working ourselves into a frenzy of Python goodness! And last week, it got even better.</p>
<h2>Introducing: Plone packages!</h2>
<p>Thanks to the good folks at <a href="http://www.cartwheelweb.com/">Cartwheel Web</a>, makers of the fine <a href="http://opencomparison.org/">Open Comparison</a> service, Plone now has its very own <a href="http://plone.opencomparison.org">grid comparison website</a>! (<a href="http://djangopackages.com">Djangopackages.com</a> was first, followed by <a href="http://pyramid.opencomparison.org">pyramid.opencomparison.org</a>.)</p>
<p><a href="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-22-at-9.13.55-AM.png"><img class="size-full wp-image-3782 alignnone" title="Screen Shot 2011-10-22 at 9.13.55 AM" src="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-22-at-9.13.55-AM.png" alt="" width="563" height="468" /></a></p>
<p>This is a site where folks can add packages hosted elsewhere (e.g. svn, github, pypi), vote on them, and add grid comparisons to compare similarly-featured add-ons, frameworks, and other related software. Grids are the killer feature of this site, and personally I&#8217;ve been waiting to use them to answer questions like:</p>
<blockquote><p><strong>Q: What&#8217;s the best blogging add-on for Plone?</strong></p>
<p><strong>A: http://plone.opencomparison.org/grids/g/weblogs/</strong></p></blockquote>
<p>The content is entirely user driven (TTW only) so please head over to <a href="http://plone.opencomparison.org">plone.opencomparison.org</a>, login with your github ID, and start adding packages! And while you are at it, please report any issues you find here: <a href="https://github.com/opencomparison/opencomparison/issues">https://github.com/opencomparison/opencomparison/issues</a>. Lastly, let&#8217;s all tweet a big thanks to <a href="https://twitter.com/#!/pydanny">@pydanny </a>and <a href="https://twitter.com/#!/audreyr">@audreyr</a> for their hard work and generosity!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/10/24/plone-first-class-python-citizen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pillow: one year later</title>
		<link>http://blog.aclark.net/2011/10/14/pillow-one-year-later/</link>
		<comments>http://blog.aclark.net/2011/10/14/pillow-one-year-later/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 17:11:37 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Plone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=3702</guid>
		<description><![CDATA[For anyone unfamiliar with Pillow, it is the &#8220;friendly PIL fork&#8221;: a fork of PIL that aims to remain a good citizen in the PIL community through its actions. Warm and fluffy history Pillow 1.0 was released on 2010-07-31, a &#8230; <a href="http://blog.aclark.net/2011/10/14/pillow-one-year-later/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>For anyone unfamiliar with Pillow, it is the &#8220;friendly PIL fork&#8221;: a fork of PIL that aims to remain a good citizen in the PIL community through its actions.</em></p>
<h2>Warm and fluffy history</h2>
<p><a href="http://pypi.python.org/pypi/Pillow"><img class="alignright size-full wp-image-3705" title="logo" src="http://blog.aclark.net/wp-content/uploads/2011/10/logo.jpg" alt="" width="100" height="75" />Pillow</a> 1.0 was released on 2010-07-31, a little over a year later came Pillow 1.7.5 which features:</p>
<ul>
<li>Many packaging fixes (mostly to support dependency libraries)</li>
<li>Windows binaries</li>
<li>Over 13K downloads</li>
</ul>
<p>Pillow is used in Plone&#8217;s <a href="http://launchpad.net/plone/4.1/4.1.2/+download/Plone-4.1.2-UnifiedInstaller.tgz">UnifiedInstaller</a>, and I know <a href="https://github.com/collective/Pillow/commit/8a282c9ea4382045822ca4fc15e586ebd2f7ace7">folks from the Django community </a>are using it.</p>
<h2>Future creature comforts</h2>
<p>All in all, a mild success. So what&#8217;s next? <strong>More of the same</strong>. To <a href="http://stackoverflow.com/questions/2485295/the-problem-with-installing-pil-using-virtualenv-or-buildout/7770547#7770547">quote myself from a recent Stack Overflow answer</a>:</p>
<blockquote><p>If PIL ever does exactly what Pillow does, then the fork will die. Until that happens, we have Pillow.</p></blockquote>
<h2>Bottom line accommodations</h2>
<p>This may never happen of course, which is part of the reason for the fork. You can&#8217;t force someone to maintain software for you. But in the open source world you can grab the bull by the horns (take the lead) and try to make things better. Even better: if your project and community are healthy and functioning properly, your success or failure will be determined by the folks in the community (as it should be). In this case, the Plone and Python communities have spoken clearly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/10/14/pillow-one-year-later/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vagrant, Puppet and Mozilla, oh my!</title>
		<link>http://blog.aclark.net/2011/10/03/vagrant-puppet-and-mozilla-oh-my/</link>
		<comments>http://blog.aclark.net/2011/10/03/vagrant-puppet-and-mozilla-oh-my/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 21:25:45 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Plone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=3655</guid>
		<description><![CDATA[Warning: This post is only loosely Python related and not at all Plone related, but I thought folks might enjoy hearing about Vagrant and Puppet because these tools may help you do your Plone and Python jobs better. For the &#8230; <a href="http://blog.aclark.net/2011/10/03/vagrant-puppet-and-mozilla-oh-my/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Warning: This post is only loosely Python related and not at all Plone related, but I thought folks might enjoy hearing about Vagrant and Puppet because these tools may help you do your Plone and Python jobs better.</em></p>
<p>For the past couple weeks I&#8217;ve been working on creating a virtual machine to bootstrap a kitsune environment. Kitsune is the Django site that powers support.mozilla.com. I&#8217;ve now reached what I call the <strong>2nd milestone</strong>.</p>
<h2>Milestones</h2>
<p>The milestones are as follows:</p>
<ol>
<li>Get the VM running to the point where one can type <strong>./manage.py</strong> and receive the help output (and not a traceback). This sounds trivial but there is actually a lot of work involved to get to this point. Namely, figuring out how to make <a href="http://puppetlabs.com/">Puppet</a> execute each of the required steps successfully, together. (You would expect to be able to just define the steps in order, but those with this expectation will be disappointed. I assume Puppet has their reasons, and they are probably even good ones. <img src='http://blog.aclark.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )</li>
<li><strong>Get the VM running to the point where one can open http://33.33.33.10:8000 from the host to see kitsune running. Once step #1 is done, this is actually easier than it sounds because I&#8217;m &#8220;cheating&#8221;. Test data has been imported and a syncdb has been run, but I&#8217;m using supervisor to manage the runserver process (for now).</strong></li>
<li>Get the VM running like it does in production. This will involve configuring <strong>Apache </strong>and <strong>mod_wsgi</strong> as well as resolving any issues that remain with the app. I&#8217;ll rely on the kitsune team to help with this, as I&#8217;m still learning the app. This is the &#8220;exciting&#8221; part for me because I get to learn something new. While Vagrant and Puppet are also new to me, I consider these technologies part of my &#8220;past life&#8221; (as a system administrator) and Django sites part of my &#8220;future life&#8221; (as a web developer).</li>
</ol>
<p>Now about the technologies.</p>
<h2>Vagrant</h2>
<p>I had heard of <a href="http://vagrantup.com/">Vagrant</a> before, but never tried it. I am now sorry I waited so long because the &#8220;cool factor&#8221; is very high. It requires that <a href="https://www.virtualbox.org/">Virtualbox</a> be installed, which I also danced around for too long before committing (being a former Parallels user).</p>
<p>On OS X Lion[1], installing Vagrant is simply a matter of:</p>
<pre>$ gem install vagrant</pre>
<p>Once you have `vagrant` installed you can do:</p>
<pre>$ vagrant init</pre>
<p>inside some revision-controlled directory and you have the beginnings of a virtual machine you can share with the masses. This is how <a href="https://github.com/aclark4life/kitsune-vagrant">kitsune-vagrant</a> was born. Hopefully this shared virtual machine will eventually make some new developer&#8217;s life much easier.</p>
<p>We now arrive at a fork in the road; though Vagrant makes it easy to follow both paths: Chef or Puppet (it supports both). I don&#8217;t recall what made me choose Puppet over Chef, but it might have been that the <a href="https://github.com/rhelmer/socorro-vagrant">Socorro folks were using it already</a>.</p>
<p>Once you decide on Puppet (and assuming you do), it&#8217;s pretty easy to figure out that your next move is to create a manifest file for Puppet to apply[2].</p>
<h2>Puppet</h2>
<p>My knowledge of Puppet is currently quite limited. Specifically, I only know how to create a manifest file. (Vagrant does the rest!) I imagine there is much more to Puppet, especially with regard to doing actual configuration management on production servers. But I have not explored any of that yet.</p>
<p>However, I did learn quite a bit about Puppet just from writing the manifest. The first most important thing I learned is this: <strong>Puppet is in charge</strong>. It does things the way it wants to and you need to follow its rules. The first and biggest challenge is to achieve a linear execution of tasks.</p>
<p>You cannot write rules in order and hope for the best. This will fail spectacularly when something executes before something else was supposed to. The way around this is via `require =&gt;` statements.</p>
<p>A grep through kitsune.pp reveals:</p>
<pre>    require =&gt; Exec['git_clone'],
    require =&gt; Exec['db_sync'],
    require =&gt; Exec['packages_upgrade'],
    require =&gt; Exec['packages_update'],
    require =&gt; Package[$packages_native],
    require =&gt; Exec['git_clone'],
    require =&gt; Exec['chown_kitsune'],
    require =&gt; Exec['packages_compiled'],
    require =&gt; Exec['packages_vendor'],
    require =&gt; Exec['db_create'],
    require =&gt; Exec['db_import'],
    require =&gt; file['/etc/supervisor/supervisord.conf'],
    require =&gt; Exec['supervisor_stop'],</pre>
<p>This roughly translates to the following workflow logic:</p>
<ul>
<li>Ensure that `aptitude -y update; aptitude -y upgrade` have been run before you try to install the list of packages we require.</li>
<li>Ensure the list of packages we require is installed before we checkout the code.</li>
<li>Ensure the code has been checked out (and pip install / git submodule have been run) before you try to syncdb and run the application.</li>
</ul>
<p>There is a bit more to it, but with that knowledge you should be able to <a href="https://github.com/aclark4life/kitsune-vagrant/blob/master/manifests/kitsune.pp">read and understand kitsune.pp in full</a>. I learned most of the remaining required puppeteering from this site:<a href="http://www.puppetcookbook.com/"> http://www.puppetcookbook.com/</a>.</p>
<h2>Mozilla</h2>
<p>Oh my! This Mozilla work is a ton of fun[3]; I attribute this in part due to the structure of their organization: I was invited immediately to collaborate in IRC with the kitsune team and as a result, we all have something to show for it[4].</p>
<p style="text-align: center;"><a href="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-03-at-5.12.42-PM.png"><img class="aligncenter size-full wp-image-3693" title="Screen Shot 2011-10-03 at 5.12.42 PM" src="http://blog.aclark.net/wp-content/uploads/2011/10/Screen-Shot-2011-10-03-at-5.12.42-PM.png" alt="" width="556" height="390" /></a></p>
<p>Next I will be working on the 3rd milestone! Hope to finish by the end of this week.</p>
<h2>Notes</h2>
<p>[1] This did not work on Snow Leopard, because `gem` is too old. However if you `brew install ruby` and try again, it should work.</p>
<p>[2] I didn&#8217;t bother to investigate Chef, but I am curious about it.</p>
<p>[3] And I hope this is only the beginning.</p>
<p>[4] I hope to get a Mozilla gig but even if I don&#8217;t, being able to do this type of work is very rewarding (which is why you will often hear people in open source say that to get paid for the type of work they do is a dream come true <img src='http://blog.aclark.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ).</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/10/03/vagrant-puppet-and-mozilla-oh-my/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mozilla and PyPI</title>
		<link>http://blog.aclark.net/2011/09/22/mozilla-and-pypi/</link>
		<comments>http://blog.aclark.net/2011/09/22/mozilla-and-pypi/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 16:03:01 +0000</pubDate>
		<dc:creator>Alex Clark</dc:creator>
				<category><![CDATA[Plone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.aclark.net/?p=3579</guid>
		<description><![CDATA[The last time I wrote about PyPI some folks mistook the subject to be PyPy, so let me be clear: this article is about the Python Packaging Index. I recently began doing some volunteer work for Mozilla[1], working on a &#8230; <a href="http://blog.aclark.net/2011/09/22/mozilla-and-pypi/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://blog.aclark.net/in-defense-of-pypi">last time I wrote about PyPI</a> some folks mistook the subject to be <a href="http://pypy.org/">PyPy</a>, so let me be clear: this article is about the <a href="http://pypi.python.org/pypi">Python Packaging Index</a>.</p>
<p>I recently began doing some volunteer work for Mozilla[1], working on a <a href="https://github.com/aclark4life/kitsune-vagrant">virtual machine setup</a> to make kitsune development easier (kitsune is the code name for the Django site that powers <a href="http://support.mozilla.com">support.mozilla.com</a>).</p>
<h2>Git submodules</h2>
<p>In doing so, I came across an interesting command from their <a href="https://github.com/jsocol/kitsune/blob/master/docs/installation.rst">installation docs</a>:</p>
<pre>$ git submodule update --init --recursive</pre>
<p>I can recall some vague rumblings about git submodules prior to this incident, but nothing I&#8217;d call &#8220;familiarity&#8221;. So, I shrugged it off and went about the business of creating the VM (and resisting the urge to use <a href="http://pypi.python.org/pypi/zc.buildout/1.5.2">zc.buildout</a> to do it):</p>
<ul>
<li>On day 1, I created a <a href="http://virtualbox.org">VirtualBox</a> VM using the latest Ubuntu Server and was able to assemble and run the application by following the instructions.</li>
<li>On day 2, I began to <a href="http://vagrantup.com">&#8220;vagrantize&#8221;</a> the process. Here I ran into a bit of trouble with the git-submodule command[2]. This led me to seek alternative methods to install the various Python packages it was trying to install (when stuck on a problem I often like to pursue the alternatives immediately, so I have them if I need them.)</li>
</ul>
<h2>Zamboni</h2>
<p>Then, in the Mozilla IRC channel #sumodev (<strong>su</strong>pport <strong>mo</strong>zilla) some nice Mozillian (willkg) pointed me to this gem:</p>
<ul>
<li><a href="http://mozweb.readthedocs.org/en/latest/packaging.html">http://mozweb.readthedocs.org/en/latest/packaging.html</a></li>
</ul>
<p><a href="http://www.flickr.com/photos/jadensmommy24/239370733/"><img class="border alignright" style="margin: 1em;" title="zamboni" src="http://blog.aclark.net/wp-content/uploads/2011/09/zamboni.jpg" alt="http://www.flickr.com/photos/jadensmommy24/239370733/" width="230" height="173" /></a></p>
<p>Which in turn led me to the following two links:</p>
<ul>
<li><a href="http://jbalogh.github.com/zamboni/topics/packages/">http://jbalogh.github.com/zamboni/topics/packages/</a></li>
<li><a href="http://playdoh.readthedocs.org/en/latest/packages.html#packages">http://playdoh.readthedocs.org/en/latest/packages.html#packages</a></li>
</ul>
<p>Again, faint rumblings… this time about zamboni (not THAT Zamboni). I know I&#8217;ve heard of it, but I wouldn&#8217;t call myself familiar with it. So, I innocently read the following:</p>
<blockquote><p><strong>Python projects can incur a number of dependencies. <tt>pip</tt> can be handy, but we’ve had better luck with distributing a <tt>vendor</tt> library.</strong></p></blockquote>
<p>At which point I immediately thought to myself:</p>
<blockquote><p><strong>Yeah… I hear that.</strong></p></blockquote>
<p>Followed a few seconds later by</p>
<blockquote><p><strong>Wait… what?!?</strong></p></blockquote>
<h2>Playdoh</h2>
<p>Some time/research later[3], I (re)discovered that zamboni is the codename for <a href="https://addons.mozilla.org">addons.mozilla.org</a>[4]. And <a href=" http://playdoh.readthedocs.org/">Playdoh</a> is the code name for Mozilla&#8217;s base Django project setup. If you aren&#8217;t familiar with Playdoh, please do give it a whirl[5].</p>
<h2>PyPI</h2>
<p>While all of this is very, very interesting to me, I am primarily a &#8220;systems and processes&#8221; guy; and what ultimately stuck with me after two days of Mozilla-ing is the following blurb from the Playdoh packaging documentation:</p>
<blockquote><p><strong>The <tt>/vendor</tt> library is supposed to contain all packages and repositories. It enables the project to be deployed as one package onto many machines, without relying on PyPI-based installations on each target machine.</strong></p></blockquote>
<p>&#8220;Nooooooooooooooo&#8221;, I am now saying to myself over and over. &#8220;Without relying on PyPI-based installations on each target machine.&#8221; Another &#8220;noooooooooooooooo!&#8221; <img src='http://blog.aclark.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  I certainly don&#8217;t fault Mozilla for taking this approach, but it makes me sad that large organizations like Mozilla are passing over PyPI in favor of alternative methods of distributing Python software.</p>
<p>Let us all now hang our heads, for a moment of pause and reflection.</p>
<p style="text-align: center;"><em>[a minute passes]</em></p>
<h2>The future</h2>
<p>I can&#8217;t speak for anyone else, but I would certainly like to see this change in the future. I would LOVE to see PyPI become a place that Mozilla felt confident it could use to deploy Python software. And this is something I&#8217;d love to work on <em>for</em> Mozilla, if given the opportunity[6].</p>
<h3>Great for Python == great for Mozilla?</h3>
<p>It&#8217;s obvious what&#8217;s in it for Python, but what&#8217;s in for Mozilla?</p>
<p>Simple.</p>
<p>I happen to share Mozilla&#8217;s vision for an open web and open source in general. And it&#8217;s great to see them embracing &amp; using Python for their web projects! Without a doubt,  they are interested in giving back to the Python community (e.g. via Playdoh and the Django community, in this case.) So I suspect they&#8217;d be open to helping the Python community fix a long standing issue: the stability and reliability of the Python Package Index. It would certainly benefit them in the long run to simplify their build process to the point where git-submodule was no longer needed[7].</p>
<p>&nbsp;</p>
<h2>Notes</h2>
<p>[1] I am actively courting Mozilla in hopes of landing a gig by the end of the year. So all you Mozillians who know me personally, please put in a good word! And all you Mozillians I have not met yet: nice to meet you! <img src='http://blog.aclark.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>[2] The problem turned out to be git-submodule failing to run because things like: grep and sed were missing from the PATH. Easily fixed by modifying the puppet configuration, but not easily discovered because git-submodule itself returned zero! Some guy on #puppet was very helpful in getting me to print out debug info.</p>
<p>[3] More help from friendly Mozillians in #webdev:</p>
<blockquote><p>11:13 &lt; groovecoder&gt; aclark: yeah, zamboni is amo<br />
11:13 &lt; kumar&gt; playdoh was extracted from zamboni and other apps<br />
11:13 &lt; kumar&gt; but zamboni itself does not eat the playdoh dog food, actually<br />
11:15 &lt; kumar&gt; aclark also, in case you&#8217;re not steeped in our initialisms, amo is addons.mozilla.org</p></blockquote>
<p>[4] There is a great presentation about it here: <a href="http://www.slideshare.net/andymckay/anatomy-of-a-large-django-site-7590098">http://www.slideshare.net/andymckay/anatomy-of-a-large-django-site-7590098</a>.)</p>
<p>[5] More from kumar (emphasis is my own):</p>
<blockquote><p>11:25 &lt; kumar&gt; <strong>Playdoh is starting to stabilize</strong> so it would be <strong>good to see some use of it outside Mozilla</strong>; this would probably<br />
help us catch Mozilla-specific things that need extraction</p></blockquote>
<p>[6] LARGE HINT <img src='http://blog.aclark.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>[7] Again, not that there is anything wrong with what Mozilla is doing here. As a systems guy, I just happen to gravitate toward simplifying processes by eliminating steps.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aclark.net/2011/09/22/mozilla-and-pypi/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

