<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">

<channel>
	<title>Planet Plone</title>
	<link>http://planet.plone.org/</link>
	<language>en</language>
	<description>Planet Plone - http://planet.plone.org/</description>
	<atom:link rel="self" href="http://planet.plone.org/rss20.xml" type="application/rss+xml"/>

<item>
	<title>Ross Patterson: Buildout Performance Improvements</title>
	<guid isPermaLink="true">http://rpatterson.net/blog/buildout-performance-improvements</guid>
	<link>http://rpatterson.net/blog/buildout-performance-improvements</link>
	<description>&lt;p&gt;I've been &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292&quot;&gt;baffled&lt;/a&gt; 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 &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292&quot;&gt;profiling&lt;/a&gt; &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15302&quot;&gt;and&lt;/a&gt; &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307&quot;&gt;timing&lt;/a&gt;, I've found there are a number of ways
to increase your buildout performance.&lt;/p&gt;
&lt;dl class=&quot;docutils&quot;&gt;
&lt;dt&gt;Use &lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/buildout.dumppickedversions&quot;&gt;buildout.dumppickedversions&lt;/a&gt; version 0.5 or later:&lt;/dt&gt;
&lt;dd&gt;If you're using &lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/buildout.dumppickedversions&quot;&gt;buildout.dumppickedversions&lt;/a&gt;, use
version 0.5.  This release includes &lt;a class=&quot;reference external&quot; href=&quot;http://dev.plone.org/collective/changeset/247821&quot;&gt;a fix&lt;/a&gt; I contributed
which yields a &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15302&quot;&gt;3-4 fold decrease&lt;/a&gt; in runtime if buildout is run
with just the &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;-N&lt;/span&gt;&lt;/tt&gt; option and no &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;-v&lt;/span&gt;&lt;/tt&gt; options.  If your're using
&lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/buildout-versions&quot;&gt;buildout-versions&lt;/a&gt; instead of
buildout.dumppickedversions, unfortunately &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15319&quot;&gt;it suffers from the
same problem&lt;/a&gt;.
The author knows about this and may address it but until then you
may want to switch to buildout.dumppickedversions.&lt;/dd&gt;
&lt;dt&gt;Use &lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/zc.buildout/1.5.2&quot;&gt;zc.buildout version 1.5&lt;/a&gt; or later:&lt;/dt&gt;
&lt;dd&gt;This seems to yield a &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307&quot;&gt;2-3 fold decrease&lt;/a&gt;
in buildout runtime when run with &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;-N&lt;/span&gt;&lt;/tt&gt; and addresses a &lt;a class=&quot;reference external&quot; href=&quot;http://zope3.pov.lt/trac/changeset/124059&quot;&gt;similar
hot loop&lt;/a&gt; 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 &lt;a class=&quot;reference external&quot; href=&quot;http://zope3.pov.lt/trac/changeset/124060&quot;&gt;contributed&lt;/a&gt; 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.&lt;/dd&gt;
&lt;dt&gt;Use the &lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/zc.buildout/1.5.2#newest-and-offline-modes&quot;&gt;-N&lt;/a&gt; option:&lt;/dt&gt;
&lt;dd&gt;With the above newest releases of zc.buildout and
buildout.dumppickedversions, you can now exercise a lot of control
of your run times &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307&quot;&gt;depending on what command-line options you use&lt;/a&gt;.
In particular, make sure &lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/zc.buildout/1.5.2#newest-and-offline-modes&quot;&gt;newest&lt;/a&gt;
is false and that &lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/zc.buildout/1.5.2#predefined-buildout-options&quot;&gt;verbosity&lt;/a&gt; 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 &lt;tt class=&quot;docutils literal&quot;&gt;$ bin/buildout &lt;span class=&quot;pre&quot;&gt;-N&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;-c&lt;/span&gt; buildout.cfg&lt;/tt&gt;.  IOW, use one
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;-N&lt;/span&gt;&lt;/tt&gt; option and no &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;-v&lt;/span&gt;&lt;/tt&gt; 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
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;-v&lt;/span&gt;&lt;/tt&gt; had been given.&lt;/dd&gt;
&lt;dt&gt;Clean out your egg cache and use &lt;tt class=&quot;docutils literal&quot;&gt;virtualenv &lt;span class=&quot;pre&quot;&gt;--no-site-packages&lt;/span&gt;&lt;/tt&gt;:&lt;/dt&gt;
&lt;dd&gt;Some of the remaining inefficiencies in zc.buildout are
&lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15305&quot;&gt;proportional to the number of distributions&lt;/a&gt;
available on &lt;tt class=&quot;docutils literal&quot;&gt;sys.path&lt;/tt&gt;.  IOW if you reduce the number of
distributions to be scanned, you can increase performance.  If
you're using a &lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/zc.buildout/1.5.2#user-defaults&quot;&gt;shared&lt;/a&gt;
&lt;a class=&quot;reference external&quot; href=&quot;http://pypi.python.org/pypi/zc.buildout/1.5.2#predefined-buildout-options&quot;&gt;eggs-directory&lt;/a&gt; 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 &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;eggs-directory&lt;/span&gt;&lt;/tt&gt;.
By cleaning those out you reduce the number of distributions that
buildout needs to scan.  I recommend just emptying your
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;eggs-directory&lt;/span&gt;&lt;/tt&gt; 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 &lt;tt class=&quot;docutils literal&quot;&gt;virtualenv &lt;span class=&quot;pre&quot;&gt;--no-site-packages&lt;/span&gt;&lt;/tt&gt; can
reduce the number of dists buildout needs to scan.&lt;/dd&gt;
&lt;dt&gt;Help me get &lt;a class=&quot;reference external&quot; href=&quot;http://zope3.pov.lt/trac/log/zc.buildout/branches/env-cache&quot;&gt;zc.buildout/branches/env-cache&lt;/a&gt; merged and released:&lt;/dt&gt;
&lt;dd&gt;Having said the above about cleaning out the egg cache,
&lt;tt class=&quot;docutils literal&quot;&gt;buildout&lt;/tt&gt;, &lt;tt class=&quot;docutils literal&quot;&gt;distribute&lt;/tt&gt;, and &lt;tt class=&quot;docutils literal&quot;&gt;setuptools&lt;/tt&gt; 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 &lt;a class=&quot;reference external&quot;&gt;env-cache&lt;/a&gt;
branch of zc.buildout.  In my timing tests, this branch seems to
yield another &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15307&quot;&gt;~60% decrease&lt;/a&gt;
in run time.  The zc.buildout tests, however, &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292&quot;&gt;are a PITA&lt;/a&gt;
and Jim Fulton is &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15315&quot;&gt;a very busy man&lt;/a&gt;
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 &lt;a class=&quot;reference external&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.distutils.devel/15292/focus=15306&quot;&gt;written up&lt;/a&gt;
how to use this branch with your existing buildouts.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;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, &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;-N&lt;/span&gt;&lt;/tt&gt; and do what you can to help
get the &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;env-cache&lt;/span&gt;&lt;/tt&gt; branch merged.&lt;/p&gt;</description>
	<pubDate>Fri, 27 Jan 2012 18:08:32 +0000</pubDate>
</item>
<item>
	<title>Six Feet Up: Optimize Your Plone Development by Packing the ZODB</title>
	<guid isPermaLink="true">http://www.sixfeetup.com/blog/optimize-your-plone-development-by-packing-the-zodb</guid>
	<link>http://www.sixfeetup.com/blog/optimize-your-plone-development-by-packing-the-zodb</link>
	<description>&lt;p&gt;&lt;img alt=&quot;HiRes.jpg&quot; class=&quot;image-right&quot; height=&quot;250&quot; src=&quot;http://www.sixfeetup.com/planet-plone/HiRes.jpg/image_preview&quot; width=&quot;333&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What does it mean to &quot;pack&quot; a database?  In shortest form, it means to remove unused records in order to reduce the memory required to hold the database.&lt;/p&gt;
&lt;p&gt;Think of it like this: each time you delete a page in your website, a copy of that page is kept in the database. These copies are kept in case you need to get it back later. Over time, as you create and delete content and make other changes in your website, the number of unused objects can grow and grow, expanding the memory needed to operate the website, and slowing down operations.  When you pack the database, the system finds the unused objects and removes them. Performing this job regularly helps to keep the size of a database manageable.&lt;/p&gt;
&lt;h2&gt;Perform database packs regularly&lt;/h2&gt;
&lt;p&gt;What is the benefit of scheduling routine database packs? If the database is not being packed on a regular basis, the amount of resources and time to perform a database pack may increase exponentially. Making sure that the packs are happening on a scheduled basis will save time in the long run. These are tasks that can easily be added into your buildout and then released into a production environment.&lt;/p&gt;
&lt;p&gt;As an example, we recently had a Plone site that was using RelStorage backed with MySQL that had not been packed in over a year. The size of the MySQL dump grew to nearly 8GB and took 45 minutes to complete. This means that any time a release was made, there would be 45 minutes of lead time just to make a backup of the data.&lt;/p&gt;
&lt;p&gt;Having this large database does not only impact the ability to swiftly do a release. If a new bug is discovered that can only be re-produced on the production environment, you certainly don't want to be debugging it there. Instead, you will want to be able to quickly bring back the data to your testing instance, hence the benefit of keeping the size of the database to a manageable size.&lt;/p&gt;
&lt;h2&gt;Setting up the automatic pack&lt;/h2&gt;
&lt;p&gt;When using a ZEO server, either from &lt;a class=&quot;external-link&quot; href=&quot;http://pypi.python.org/pypi/plone.recipe.zeoserver&quot;&gt;plone.recipe.zeoserver&lt;/a&gt; or &lt;a class=&quot;external-link&quot; href=&quot;http://pypi.python.org/pypi/plone.recipe.zope2zeoserver&quot;&gt;plone.recipe.zope2zeoserver&lt;/a&gt;, a &lt;code&gt;zeopack&lt;/code&gt; script is automatically generated for you with all the necessary parameters to run the pack. This can simply be run from the command line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd path/to/buildout
$ bin/zeopack
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now your database is packed, that was easy! As programmers and systems administrators, we know that doing things manually will eventually fail. How do we automate this process? Simple, we add a cron job to take care of the work for us. Here is an example configuration that gets everything set up for us:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;[buildout]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;parts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;instance zeoserver cron-pack&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://dist.plone.org/release/4.1.3/versions.cfg&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[instance]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;recipe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;plone.recipe.zope2instance&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;admin:admin&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;http-address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8080&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;zeo-address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8100&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;zeo-client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;True&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Set the shared blob option so blobs work with zeoserver&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;shared-blob&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;on&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;blob-storage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${buildout:directory}/var/blobstorage&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;eggs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;Pillow&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;Plone&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[zeoserver]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;recipe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;plone.recipe.zeoserver&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;blob-storage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${instance:blob-storage}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;zeo-address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${instance:zeo-address}&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# keep history for 7 days instead of the default 1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;pack-days&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;7&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[cron-pack]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;recipe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;z3c.recipe.usercrontab&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;times&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;@weekly&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${buildout:bin-directory}/zeopack&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After running this buildout, there will be a cron job added to the cron of the user that ran the buildout. This job will run weekly and pack the database, leaving 7 days of history.&lt;/p&gt;
&lt;h3&gt;RelStorage&lt;/h3&gt;
&lt;p&gt;Now for a more complex scenario using &lt;a href=&quot;http://pypi.python.org/pypi/RelStorage&quot;&gt;RelStorage&lt;/a&gt;. The &lt;code&gt;zeopack&lt;/code&gt; script will no longer work, but fear not, RelStorage comes with a script called &lt;code&gt;zodbpack&lt;/code&gt; that can do the job.&lt;/p&gt;
&lt;p&gt;First some setup to make the generation of the conf file work:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd path/to/buidout
$ mkdir templates
$ mkdir etc
$ touch templates/zodbpack.conf.tmpl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This sets up a directory for our &lt;code&gt;zodbpack.conf&lt;/code&gt; template, and an output directory named &lt;code&gt;etc&lt;/code&gt;. In the &lt;code&gt;zodbpack.conf.tmpl&lt;/code&gt;, place the following code:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;relstorage&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;mysql&amp;gt;&lt;/span&gt;
    host &lt;span class=&quot;cp&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}&lt;/span&gt;
    db &lt;span class=&quot;cp&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}&lt;/span&gt;
    user &lt;span class=&quot;cp&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}&lt;/span&gt;
    passwd &lt;span class=&quot;cp&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;passwd&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/mysql&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/relstorage&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now here is our example buildout configuration that sets up Plone to use RelStorage with MySQL:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;[buildout]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;parts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;instance relstorage zodbpack-conf cron-pack&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://dist.plone.org/release/4.1.3/versions.cfg&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[settings]&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# settings for RelStorage connection&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;mysql-host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;localhost&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;mysql-db&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mydbname&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;mysql-user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;mysql-passwd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 
&lt;span class=&quot;c&quot;&gt;# options for the cron job&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;pack-days&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;7&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[instance]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;recipe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;plone.recipe.zope2instance&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;admin:admin&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;http-address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8080&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;eggs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;Pillow&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;Plone&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;RelStorage&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;MySQL-python&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;rel-storage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mysql&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${settings:mysql-host}&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;db&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${settings:mysql-db}&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${settings:mysql-user}&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;passwd&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${settings:mysql-passwd}&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;blob-dir&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${buildout:directory}/var/blobstorage&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Generate the RelStorage scripts&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;[relstorage]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;recipe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zc.recipe.egg&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;eggs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;${instance:eggs}&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;RelStorage&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;MySQL-python&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[zodbpack-conf]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;recipe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;collective.recipe.template&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${buildout:directory}/templates/zodbpack.conf.tmpl&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${buildout:directory}/etc/zodbpack.conf&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[cron-pack]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;recipe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;z3c.recipe.usercrontab&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;times&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;@weekly&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${buildout:bin-directory}/zodbpack -d ${settings:pack-days} ${zodbpack-conf:output}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In this example, we are generating a conf file for the &lt;code&gt;zodbpack&lt;/code&gt; script to use with the &lt;code&gt;[zodbpack-conf]&lt;/code&gt; part. Since the RelStorage information will be used in two places, and might be different on each deployment platform, there is a &lt;code&gt;[settings]&lt;/code&gt; section that both the &lt;code&gt;[instance]&lt;/code&gt; and &lt;code&gt;[zodbpack-conf]&lt;/code&gt; parts take advantage of.&lt;/p&gt;
&lt;p&gt;Once this buildout has run, it will be set up similar to our conventional buildout. The cron job will pack the RelStorage database once a week, keeping 7 days of history.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Packing your Plone site's database on a regular basis is as simple as adding some configuration to buildout. There is really no reason you shouldn't be keeping up on this maintenance task with your Plone sites, especially when you run complex websites or intranets. It will save you time during your development and release cycles by making sure the database is at its leanest.&lt;/p&gt;</description>
	<pubDate>Fri, 27 Jan 2012 11:30:00 +0000</pubDate>
</item>
<item>
	<title>ACLARK.NET, LLC: Hello Plone theming</title>
	<guid isPermaLink="false">http://blog.aclark.net/?p=4564</guid>
	<link>http://feedproxy.google.com/~r/aclark/plone/~3/FA9WRromzZs/</link>
	<description>&lt;p&gt;In this post, we introduce a new tutorial aimed at bridging the gap between the &lt;strong&gt;incredibly easy to use and enormously powerful Diazo theming engine for Plone&lt;/strong&gt;, and bootstrapping your first new theme. You do not need to have any Python skills whatsoever to perform these tasks.&lt;/p&gt;
&lt;p&gt;New Plone themes are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML/CSS/JavaScript/images (Sound familiar? You don’t need to know any Plone to understand this part.)&lt;/li&gt;
&lt;li&gt;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.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Diazo rules can get complex, but it’s very easy to get your first rule done and working and then off you go. You may find this &lt;a href=&quot;http://readthedocs.org/docs/pythonpackages-docs/en/latest/ex8-diazo.html&quot;&gt;new tutorial on pythonpackages.com&lt;/a&gt;. Enjoy, and get busy theming Plone.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/gjNdXm4wMNnOqWNQPBXEweqq_lU/0/da&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;true&quot; src=&quot;http://feedads.g.doubleclick.net/~a/gjNdXm4wMNnOqWNQPBXEweqq_lU/0/di&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/gjNdXm4wMNnOqWNQPBXEweqq_lU/1/da&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;true&quot; src=&quot;http://feedads.g.doubleclick.net/~a/gjNdXm4wMNnOqWNQPBXEweqq_lU/1/di&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/aclark/plone/~4/FA9WRromzZs&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 25 Jan 2012 05:15:50 +0000</pubDate>
</item>
<item>
	<title>Plone.org: Plone Symposium East 2012 Calls for Training Proposals - Due by Feb 13, 2012</title>
	<guid isPermaLink="true">http://plone.org/news/pse2012-call-for-training</guid>
	<link>http://plone.org/news/pse2012-call-for-training</link>
	<description>&lt;p&gt;The folks at Weblion have begun organizing &lt;a class=&quot;external-link&quot; href=&quot;http://weblion.psu.edu/symposium&quot;&gt;Plone Symposium East 2012 (PSE12)&lt;/a&gt;, and have put out the call for trainers who would like to hold training sessions in the two days prior to the May event - on May 20-21st. It is an opportunity to teach others how to be successful with open source.&lt;br /&gt;&lt;br /&gt;Interested trainers have time to submit their proposals between now and February 13.  You can find out more about the proposals process by visiting &lt;a class=&quot;external-link&quot; href=&quot;http://weblion.psu.edu/symposium/training-proposal&quot;&gt;http://weblion.psu.edu/symposium/training-proposal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is limited classroom space, so get your proposal in TODAY!&lt;/p&gt;</description>
	<pubDate>Tue, 24 Jan 2012 05:57:16 +0000</pubDate>
</item>
<item>
	<title>Connexions Blog: Want a free Connexions T-Shirt?</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3401800884156149836.post-1615040693082503862</guid>
	<link>http://feedproxy.google.com/~r/TheConnexionsBlog/~3/1XZBvqexGRU/want-free-connexions-t-shirt.html</link>
	<description>&lt;a href=&quot;http://3.bp.blogspot.com/-YQHbBF60lrA/Tx4QXuBcrfI/AAAAAAAAAmM/K_m7F34HueM/s1600/x.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5701012177974767090&quot; src=&quot;http://3.bp.blogspot.com/-YQHbBF60lrA/Tx4QXuBcrfI/AAAAAAAAAmM/K_m7F34HueM/s320/x.png&quot; style=&quot;float: left; margin: 0 10px 10px 0; cursor: pointer; cursor: hand; width: 278px; height: 320px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Next week, we are going to be having a contest!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's the scoop.&lt;br /&gt;&lt;br /&gt;Next week, January 30th - February 3rd, 2012, we will ask a Connexions related trivia question on &lt;a href=&quot;http://twiter.com/@cnxorg&quot;&gt;twitter&lt;/a&gt; everyday. First to answer correctly by @replying to us on Twitter gets a free t-shirt!&lt;br /&gt;&lt;br /&gt;This week we will be sharing some of the facts you will need to know in order to answer the questions correctly. So, keep an eye out for hints on &lt;a href=&quot;http://twiter.com/@cnxorg&quot;&gt;twitter&lt;/a&gt; and &lt;a href=&quot;http://www.facebook.com/cnx.org&quot;&gt;facebook.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;br /&gt;Unfortunately, we are only able to ship domestically. If you have any questions about this contest, please email dcwill@cnx.org.&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3401800884156149836-1615040693082503862?l=blog.cnx.org&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/TheConnexionsBlog?a=1XZBvqexGRU:NWutbu9AaAQ:yIl2AUoC8zA&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/TheConnexionsBlog?d=yIl2AUoC8zA&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/TheConnexionsBlog?a=1XZBvqexGRU:NWutbu9AaAQ:4cEx4HpKnUU&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/TheConnexionsBlog?i=1XZBvqexGRU:NWutbu9AaAQ:4cEx4HpKnUU&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/TheConnexionsBlog?a=1XZBvqexGRU:NWutbu9AaAQ:qj6IDK7rITs&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/TheConnexionsBlog?d=qj6IDK7rITs&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/TheConnexionsBlog/~4/1XZBvqexGRU&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 24 Jan 2012 02:04:51 +0000</pubDate>
	<author>noreply@blogger.com (Daniel Williamson)</author>
</item>
<item>
	<title>Hector Velarde: Adding test users programmatically using collective.recipe.plonesite</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-4871829230797738545.post-2615866520643397657</guid>
	<link>http://feedproxy.google.com/~r/hvelarde/~3/Omeu-0RJ3NI/adding-test-users-programmatically.html</link>
	<description>I'm writing some functional tests for a Plone project and I need to add a group of test users every time I create a test site.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://pypi.python.org/pypi/collective.recipe.plonesite&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;collective.recipe.plonesite&lt;/a&gt; is a cool Buildout recipe that enables you to create and update a Plone site as part of a buildout run.&lt;br /&gt;
&lt;br /&gt;
I added the following lines to my buildout configuration:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;parts =
    …
    plonesite

[plonesite]
recipe = collective.recipe.plonesite
profiles = my.project:default
post-extras = ${buildout:directory}/acceptance-tests/add_test_users.py&lt;/pre&gt;&lt;br /&gt;
The code of the &lt;b&gt;add_test_users.py&lt;/b&gt; script is pretty straightforward:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&quot;&quot;&quot;This script will add a number of test users to a Plone site.

You can used it in post-extras option of collective.recipe.plonesite. It will
be evaluated after running QuickInstaller and GenericSetup profiles.

@param portal: The Plone site as defined by the site-id option
&quot;&quot;&quot;

import logging
logger = logging.getLogger('collective.recipe.plonesite')

test_users = [
    # (username, password, group),
    ('username1', 'password1', 'group1'),
    ('username2', 'password2', 'group2'),
    ('username3', 'password3', 'group3'),
    ]

for username, password, group in test_users:
    if username not in portal.acl_users.getUserIds():
        try:
            portal.portal_registration.addMember(username, password)
            portal.portal_groups.addPrincipalToGroup(username, group)
        except ValueError:
            logger.warn('The login name &quot;%s&quot; is not valid.' % username)
        except KeyError:
            logger.warn('The group &quot;%s&quot; is not valid.' % group)
&lt;/pre&gt;&lt;br /&gt;
Enjoy!&lt;br /&gt;
&lt;br /&gt;
(Next time I'll give you my first impressions on SeleniumLibrary, a web testing library for Robot Framework, I'm using to write the tests.)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4871829230797738545-2615866520643397657?l=hvelarde.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/oDYmkV_G8niCfw0t-syIsZJ9Aeo/0/da&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://feedads.g.doubleclick.net/~a/oDYmkV_G8niCfw0t-syIsZJ9Aeo/0/di&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/oDYmkV_G8niCfw0t-syIsZJ9Aeo/1/da&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://feedads.g.doubleclick.net/~a/oDYmkV_G8niCfw0t-syIsZJ9Aeo/1/di&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/hvelarde/~4/Omeu-0RJ3NI&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 23 Jan 2012 23:45:00 +0000</pubDate>
</item>
<item>
	<title>Four Digits: Ladies and gentleman, we 've got it</title>
	<guid isPermaLink="true">http://blog.fourdigits.nl/ladies-and-gentleman-we-ve-got-it</guid>
	<link>http://blog.fourdigits.nl/ladies-and-gentleman-we-ve-got-it</link>
	<description>&lt;p&gt;The Plone conference 2012 will take place in Arnhem, the Netherlands. The foundation members have had their advisory vote and the majority favored Arnhem. Last weekend, the Board made the final decision, so now we can start the preparations. Needless to say we are very happy to be elected.&lt;/p&gt;&lt;p&gt;We already put together a team together that will take care of initial planning and preparations. Of course, during the conference, we will need all the help we can get so all of the Four Digits employees will be assigned to a specific task. We had our first post-proposal planning meeting today and are in the works of making the planning up to the event.&lt;/p&gt;
&lt;p&gt;We will keep you posted on all the relevant information in the months to come. Here, on Twitter and we will utilize the Dutch local and (if possible) national media. Apart from organising a great conference, we want to promote Arnhem as one of the best cities in the Netherlands. The company is located here and all the Four Digits members live in Arnhem.&lt;/p&gt;
&lt;p&gt;The Plone conference 2012 will be held in the very heart of Arnhem centre, within walking distance of pubs, restaurants, shops, and public transport. In fact, the venue is very close to the office. We are going to our best to make sure you all have a great time here. Check out our &lt;a class=&quot;external-link&quot; href=&quot;http://plone.org/events/conferences/plone-conference-2012/proposals/arnhem-netherlands/arnhem-plone-conference-2012-proposal&quot;&gt;proposal&lt;/a&gt; for more info on both the conference and the city of Arnhem.&lt;/p&gt;
&lt;p&gt;And just to get you warmed up, a few of the many thing to see here. As mentioned in Mark Corum's &lt;a class=&quot;external-link&quot; href=&quot;http://plone.org/news/plone-conference-2012-host-announced&quot;&gt;article&lt;/a&gt;, Arnhem has a famous bridge that played a key role during the second world war in The Netherlands. Be sure to see the movie &lt;a class=&quot;external-link&quot; href=&quot;http://www.imdb.com/title/tt0075784/&quot;&gt;A Bridge Too Far&lt;/a&gt; featuring Sean Connery, Gene Hackman and Robert Redford (which sadly wasn't filmed in Arnhem).&lt;/p&gt;
&lt;p&gt;Arnhem also houses one of the biggest &lt;a class=&quot;external-link&quot; href=&quot;http://www.burgerszoo.nl/&quot;&gt;zoo's&lt;/a&gt; in Holland, as well as the only historical open air &lt;a class=&quot;external-link&quot; href=&quot;http://www.openluchtmuseum.nl/en/&quot;&gt;museum&lt;/a&gt; in the country. In all, it's a beautiful city with lots of nice shops, cosy bars en a lot of parks to take a stroll in.&lt;/p&gt;
&lt;p&gt;For updates keep track of this blog, and the soon to launch Plone conf website. For now: we thank the community for the opportunity to host the conference and we thank Abstract and Fanelli Consulting for putting in a great bid. Hope to see all you guys in October!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
	<pubDate>Mon, 23 Jan 2012 15:10:00 +0000</pubDate>
</item>
<item>
	<title>Netsight Developers: Full Text Code Searching</title>
	<guid isPermaLink="false">urn:syndication:4fe78fc8ff31135a54f5d2a99d3324cd</guid>
	<link>http://www.netsight.co.uk/blog/full-text-code-searching</link>
	<description>&lt;p&gt;Last night I saw a tweet re-tweeted by &lt;a class=&quot;external-link&quot; href=&quot;https://twitter.com/#!/davisagli&quot;&gt;David Glick&lt;/a&gt; about a &lt;a class=&quot;external-link&quot; href=&quot;https://plus.google.com/116810148281701144465/posts/cLLByoCMULk&quot;&gt;post from one of the original guys who worked on Google Code search, Russ Cox&lt;/a&gt;. He has released some code for doing code search based upon the ideas used by Google Code Search.&lt;/p&gt;
&lt;p&gt;Google shut down Google Code search recently and his code allows you to do similar hybrid index/regex searching on files locally.&lt;/p&gt;
&lt;p&gt;I have to confess, I never really used Google Code Search. I guess probably due to until actually reading the post above I didn't realise that it could do regular expression searching. This is a 'big thing' when searching in code. I really don't know how I missed that fact.&lt;/p&gt;
&lt;p&gt;I am a bit of a (lapsed) search and information retrieval geek myself. My final year project at university was a full text mailing list indexer/search system (similar to gmane). This was based heavily on the seminal work mentioned in Russ' post &lt;i style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://books.google.com/books?id=2F74jyPl48EC&quot;&gt;Managing Gigabytes&lt;/a&gt;&lt;/i&gt; by &lt;span style=&quot;text-align: justify;&quot;&gt;Witten, Moffat, and Bell and also by &lt;a class=&quot;external-link&quot; href=&quot;http://books.google.co.uk/books?id=RMb8tgAACAAJ&quot;&gt;&lt;i&gt;Modern Information Retrieval&lt;/i&gt;&lt;/a&gt; by Baeza-Yates and Ribeiro-Neto and the paper that influenced much of the internet as we know it now, Brin and Page's &lt;i&gt;&lt;a class=&quot;external-link&quot; href=&quot;http://infolab.stanford.edu/~backrub/google.html&quot;&gt;The Anatomy of a Large-Scale Hypertextual Web Search Engine&lt;/a&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Russ Cox has released the code to his tool at &lt;a class=&quot;external-link&quot; href=&quot;http://code.google.com/p/codesearch/&quot;&gt;http://code.google.com/p/codesearch/&lt;/a&gt; and you can download binaries for OSX, FreeBSD, Linux, and Windows.&lt;/p&gt;
&lt;p&gt;Here is a quick rundown on using it to index and then search my local development directory on my Macbook. This allows me to quickly search through both all the code in the projects I'm working on, but all my egg cache, which contains all the code to Plone itself. Great for when you see a particular bit of markup, or error message and need to work out where it is coming from in the code.&lt;/p&gt;
&lt;p&gt;Firstly download the binaries from the link above, or compile it yourself. Then you need to get it to index your directories. In my case everything I do in under /Development:&lt;/p&gt;
&lt;pre&gt;dhcp10:~ matth$ cindex /Development
2012/01/23 14:47:26 index /Development
2012/01/23 14:49:08 flush index
2012/01/23 14:49:08 merge 7 files + mem
2012/01/23 14:49:23 520694590 data bytes, 82743702 index bytes
2012/01/23 14:49:23 merge /Users/matth/.csearchindex /Users/matth/.csearchindex~
2012/01/23 14:49:39 done
&lt;/pre&gt;
&lt;p&gt;And then you can use it to search through the code:&lt;/p&gt;
&lt;pre&gt;dhcp10:~ matth$ csearch &quot;def authenticate&quot;
/Development/buildout-cache/eggs/AccessControl-2.13.4-py2.6-macosx-10.7-x86_64.egg/AccessControl/userfolder.py:    def authenticate(self, name, password, request):
/Development/buildout-cache/eggs/AccessControl-2.13.4-py2.6-macosx-10.7-x86_64.egg/AccessControl/users.py:    def authenticate(self, password, request):
/Development/buildout-cache/eggs/AccessControl-2.13.4-py2.6-macosx-10.7-x86_64.egg/AccessControl/users.py:    def authenticate(self, password, request):
/Development/buildout-cache/eggs/Paste-1.7.5.1-py2.6.egg/paste/auth/basic.py:    def authenticate(self, environ):
/Development/buildout-cache/eggs/Paste-1.7.5.1-py2.6.egg/paste/auth/digest.py:    def authenticate(self, environ):
/Development/buildout-cache/eggs/Paste-1.7.5.1-py2.7.egg/paste/auth/basic.py:    def authenticate(self, environ):
/Development/buildout-cache/eggs/Paste-1.7.5.1-py2.7.egg/paste/auth/digest.py:    def authenticate(self, environ):
...
&lt;/pre&gt;
&lt;p&gt;One current issue is there is no way to exclude directories from the index, so you get .svn directories in the results&lt;/p&gt;
&lt;pre&gt;dhcp10:~ matth$ csearch &quot;sspi.ServerAuth&quot;
/Development/netsight.windowsauthplugin/netsight/windowsauthplugin/windowsauthplugin/.svn/text-base/krbtest.py.svn-base:            sa = sspi.ServerAuth('Negotiate')
/Development/netsight.windowsauthplugin/netsight/windowsauthplugin/windowsauthplugin/.svn/text-base/plugin.py.svn-base:            sa = sspi.ServerAuth('Negotiate')
/Development/netsight.windowsauthplugin/netsight/windowsauthplugin/windowsauthplugin/krbtest.py:            sa = sspi.ServerAuth('Negotiate')
/Development/netsight.windowsauthplugin/netsight/windowsauthplugin/windowsauthplugin/plugin.py:            sa = sspi.ServerAuth('Negotiate')
/Development/py24nsp/sanofi/src/netsight.windowsauthplugin/netsight/windowsauthplugin/.svn/text-base/krbtest.py.svn-base:            sa = sspi.ServerAuth('Negotiate')
/Development/py24nsp/sanofi/src/netsight.windowsauthplugin/netsight/windowsauthplugin/.svn/text-base/plugin.py.svn-base:            sa = sspi.ServerAuth('Negotiate')
/Development/py24nsp/sanofi/src/netsight.windowsauthplugin/netsight/windowsauthplugin/krbtest.py:            sa = sspi.ServerAuth('Negotiate')
/Development/py24nsp/sanofi/src/netsight.windowsauthplugin/netsight/windowsauthplugin/plugin.py:            sa = sspi.ServerAuth('Negotiate')
/Development/py26nsp2/plone41demo/src/netsight.windowsauthplugin/netsight/windowsauthplugin/.svn/text-base/krbtest.py.svn-base:            sa = sspi.ServerAuth('Negotiate')
/Development/py26nsp2/plone41demo/src/netsight.windowsauthplugin/netsight/windowsauthplugin/.svn/text-base/plugin.py.svn-base:            sa = sspi.ServerAuth('Negotiate')
/Development/py26nsp2/plone41demo/src/netsight.windowsauthplugin/netsight/windowsauthplugin/krbtest.py:            sa = sspi.ServerAuth('Negotiate')
/Development/py26nsp2/plone41demo/src/netsight.windowsauthplugin/netsight/windowsauthplugin/plugin.py:            sa = sspi.ServerAuth('Negotiate')
&lt;/pre&gt;
&lt;p&gt;You can however restrict the search to a path (regex):&lt;/p&gt;
&lt;pre&gt;dhcp10:~ matth$ csearch -f /Development/py26nsp/cplonline/src/netsight.cpl &quot;def auth&quot;
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/.svn/text-base/models.py.svn-base:    def authenticate(self, password):
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/models.py:    def authenticate(self, password):
&lt;/pre&gt;
&lt;p&gt;As it can take regular expressions, you can do more advanced searches, e.g. 'all methods that take an argument called &lt;i&gt;password&lt;/i&gt;':&lt;/p&gt;
&lt;pre&gt;dhcp10:~ matth$ csearch -f /Development/py26nsp/cplonline/src/netsight.cpl &quot;def.*\(.*password&quot;
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/__init__.py:def fetchandload(ftpcmd, loadcmd, ftpcache, host, user, password):
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/evidence.py:    def __init__(self, uri, user=None, password=None):
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/models.py:    def __init__(self, name, login, password, company_id, role=None):
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/models.py:    def _hash_password(self, password, salt):
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/models.py:    def set_password(self, password):
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/models.py:    def authenticate(self, password):
/Development/py26nsp/cplonline/src/netsight.cpl/netsightcpl/tests/base.py:    def login(self, login='admin', password='admin'):
&lt;/pre&gt;
&lt;p&gt;So thanks to Russ for releasing this. It certainly is much quicker for search through large directories of code than using grep or ack&lt;/p&gt;&lt;div class=&quot;footer&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://www.netsight.co.uk/blog/full-text-code-searching#addcomment&quot;&gt;Add a comment&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 23 Jan 2012 15:08:28 +0000</pubDate>
</item>
<item>
	<title>Reinout van Rees: Website changes: sphinx code, layout, twitter bootstrap, less</title>
	<guid isPermaLink="true">http://reinout.vanrees.org/./weblog/2012/01/22/website-changes.html</guid>
	<link>http://reinout.vanrees.org/./weblog/2012/01/22/website-changes.html</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;I've made a couple of changes to my website (and thus weblog):&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;I moved from svn to git.&lt;/li&gt;
&lt;li&gt;I made my weblog-related sphinx customizations public.&lt;/li&gt;
&lt;li&gt;I'm using &lt;a class=&quot;reference external&quot; href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;twitter bootstrap&lt;/a&gt; as the
css framework instead of the yahoo one I've been using before.&lt;/li&gt;
&lt;li&gt;I changed the layout. Bigger font, less clutter. More bare-bones. Most of
the looks (font type, headers) is from the bootstrap css, but the ordering
is mine. I especially like the bigger font.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;section&quot; id=&quot;svn-to-git&quot;&gt;
&lt;h1&gt;Svn to git&lt;/h1&gt;
&lt;p&gt;I'm getting used to git at the office. And my website was in svn. The svn is
on me and &lt;a class=&quot;reference external&quot; href=&quot;http://maurits.vanrees.org&quot;&gt;my brother&lt;/a&gt;'s server. And we're going
to re-build that server in the near future. And not having to set up svn there
saves quite some time.&lt;/p&gt;
&lt;p&gt;So I moved part of the code to github and the actual content to a simple
directory in our own server. Git works just fine with a repository URL like
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;ssh://vanrees.org/~/git/websitecontent&lt;/span&gt;&lt;/tt&gt;. Just init a repo in
&lt;tt class=&quot;docutils literal&quot;&gt;~/git/websitecontent&lt;/tt&gt; on the server and off you go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;sphinx-as-weblog-code-is-now-available-somewhat&quot;&gt;
&lt;h1&gt;Sphinx as weblog: code is now available (somewhat)&lt;/h1&gt;
&lt;p&gt;My site is static html now for two years or so. Generated with
&lt;a class=&quot;reference external&quot; href=&quot;http://reinout.vanrees.org/Sphinx&quot;&gt;http://sphinx.pocoo.org/&lt;/a&gt;. No Plone (which it was when I worked
with Plone) and no Django (which I'd like, as I work with it, but my current
text-only setup works real fine and Sphinx is an essential Django
documentation ingredient, too).&lt;/p&gt;
&lt;p&gt;I also make my weblog with Sphinx. I need a couple of custom restructuredtext
tags for that (like &lt;tt class=&quot;docutils literal&quot;&gt;..tags::&lt;/tt&gt; for handling tags). I basically point a
script at a sphinx directory that contains my entries and it generates
&lt;tt class=&quot;docutils literal&quot;&gt;index.txt&lt;/tt&gt; files for all the directories with a list of entries. And it
generates &lt;tt class=&quot;docutils literal&quot;&gt;tags/TAGNAME.txt&lt;/tt&gt; files for the tags. Afterwards, I just run
Sphinx and everything gets generated OK.&lt;/p&gt;
&lt;p&gt;I got some questions in the past about my code, but never followed up by
publishing my terribly Reinout-specific code. It &lt;em&gt;is&lt;/em&gt; still Reinout-specific,
but &lt;strong&gt;I've published it now&lt;/strong&gt;. It might provide some ideas. The full code is
at &lt;a class=&quot;reference external&quot; href=&quot;https://github.com/reinout/reinout.vanrees.org&quot;&gt;https://github.com/reinout/reinout.vanrees.org&lt;/a&gt; . Again: this is not
something you can &lt;tt class=&quot;docutils literal&quot;&gt;pip install&lt;/tt&gt;. Best you can do is borrow and copy at the
moment. (Threat the Python code in there as public domain).&lt;/p&gt;
&lt;p&gt;Most of interest are probably
&lt;a class=&quot;reference external&quot; href=&quot;https://github.com/reinout/reinout.vanrees.org/blob/master/rvo/rst.py&quot;&gt;https://github.com/reinout/reinout.vanrees.org/blob/master/rvo/rst.py&lt;/a&gt; which
provides the custom restructuredtext (and thus sphinx) tags. And
&lt;a class=&quot;reference external&quot; href=&quot;https://github.com/reinout/reinout.vanrees.org/blob/master/rvo/weblog.py&quot;&gt;https://github.com/reinout/reinout.vanrees.org/blob/master/rvo/weblog.py&lt;/a&gt; which
creates all the index and tags files.&lt;/p&gt;
&lt;p&gt;It is not well-documented and quite specific to my case. But there are some
docstrings and the code is nicely PEP8 compliant :-) If you need any info,
feel free to contact me.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;twitter-bootstrap-css&quot;&gt;
&lt;h1&gt;Twitter bootstrap css&lt;/h1&gt;
&lt;p&gt;I have to re-visit the layout of the websites we make at my work (&lt;a class=&quot;reference external&quot; href=&quot;http://www.nelen-schuurmans.nl&quot;&gt;Nelen &amp;amp;
Schuurmans&lt;/a&gt;). One of the things we want is
to have a more attractive layout. And after some browsing, &lt;a class=&quot;reference external&quot; href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;twitter bootstrap&lt;/a&gt; struck me as a good basis.&lt;/p&gt;
&lt;p&gt;And, as I do often, I first experiment on myself. So I set out to change the
layout of my own website by using twitter bootstrap. I'm not even using half
of bootstrap's possibilities, but I'm quite happy with the result. The basic
typography is fine. There are some handy helpers for common things like labels
(which I used to liven up the tags below the weblog headers on my weblog). And
I quite like the simple header at the top of the page: just a simple bar.&lt;/p&gt;
&lt;p&gt;And there's another good thing about twitter bootstrap: less. See below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;less&quot;&gt;
&lt;h1&gt;Less&lt;/h1&gt;
&lt;p&gt;What coffeescript is for javascript, &lt;a class=&quot;reference external&quot; href=&quot;http://lesscss.org/&quot;&gt;less&lt;/a&gt; is for
css. A simpler syntax that helps you write better and &lt;em&gt;less duplicated&lt;/em&gt; css.&lt;/p&gt;
&lt;p&gt;I like it! Take for example the headings of this entry. Hover over one and
you'll see a paragraph token at the end. Sphinx adds this so you can link to
individual sections in a bigger file. Sphinx also has some css that hides the
paragraph token normally and only shows it when you hover over the heading:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
a.headerlink {
    visibility: hidden;
}

h1:hover &amp;gt; a.headerlink,
h2:hover &amp;gt; a.headerlink,
h3:hover &amp;gt; a.headerlink,
h4:hover &amp;gt; a.headerlink,
h5:hover &amp;gt; a.headerlink,
h6:hover &amp;gt; a.headerlink,
dt:hover &amp;gt; a.headerlink {
    visibility: visible;
}
&lt;/pre&gt;
&lt;p&gt;I restricted that to:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
.headerlink {
  visibility: hidden;
  }

h1, h2, h3, h4, h5, h6, dt {
  &amp;amp;:hover {
    .headerlink {
      visibility: visible;
      }
    }
  }
&lt;/pre&gt;
&lt;p&gt;It looks just like css, as you see in that first &lt;tt class=&quot;docutils literal&quot;&gt;.headerlink&lt;/tt&gt; rule. The
second one has the special less stuff. The ampersand means an extra condition,
so the &lt;tt class=&quot;docutils literal&quot;&gt;&amp;amp;:hover&lt;/tt&gt; effectively adds &lt;tt class=&quot;docutils literal&quot;&gt;:hover&lt;/tt&gt; to each of the
&lt;tt class=&quot;docutils literal&quot;&gt;h1&lt;/tt&gt;..``dt``. This really shines if you have a couple of other extra
conditions on the same set of elements.&lt;/p&gt;
&lt;p&gt;Anyway, head over to &lt;a class=&quot;reference external&quot; href=&quot;http://lesscss.org/&quot;&gt;http://lesscss.org/&lt;/a&gt; where they have a better explanation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;closing-off&quot;&gt;
&lt;h1&gt;Closing off&lt;/h1&gt;
&lt;p&gt;I'm happy with the change. One extra change that I didn't mention yet: I've
removed deliverance from the mix. Deliverance is a tool that I used to change
the layout of a couple of inputs (sphinx, docbook2html, latex2html) into my
vanrees.org layout. It did that on the fly. But the versions kept changing and
the versions I had were getting old and hard to update. And I had to run a
wsgi process to run it, even though the actual website was all plain html.&lt;/p&gt;
&lt;p&gt;I'm back to plain html now. I've implemented the layout in a Sphinx
template. Simple to do, as it is just jinja2, which has the same syntax as
Django. And the docbook and latex html exports are just that. I'll leave them
that way. It isn't that important to have my logo on those pages :-)&lt;/p&gt;
&lt;p&gt;One extra advantage: the site ought to be faster!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 22 Jan 2012 21:49:00 +0000</pubDate>
</item>
<item>
	<title>Plone.org: Plone Conference 2012 Coming to Arnhem, the Netherlands</title>
	<guid isPermaLink="true">http://plone.org/news/plone-conference-2012-host-announced</guid>
	<link>http://plone.org/news/plone-conference-2012-host-announced</link>
	<description>&lt;p&gt;Arnhem, the Netherlands will host the &lt;a class=&quot;external-link&quot; href=&quot;http://ploneconf.org&quot;&gt;2012 Plone Conference&lt;/a&gt;, the Plone Foundation announced today following a vote of the foundation membership.  The Arnhem proposal, championed by Dutch Plone Developers &lt;a class=&quot;external-link&quot; href=&quot;http://www.fourdigits.nl&quot;&gt;Four Digits,&lt;/a&gt; beat out a competing proposal for the conference to be held in Paris, France which was made by Abstract and Fanelli Consulting.&lt;br /&gt;&lt;br /&gt;The Plone Conference 2012 will be held in Arnhem on October 10-12, with pre-conference training on October 8-9 and a post-conference sprint October 13-14.&lt;br /&gt;&lt;br /&gt;Arnhem, which is located the east Netherlands between the Veluwe nature reserve and the Rhine river, is well known for its art and culture. Its compact city center places many attractions in easy walking distance. Once known as World War II's &quot;A Bridge Too Far,&quot; Arnhem's reputation as one of the greenest cities in Europe and famous hospitality to visitors from around the globe makes a stellar location for this year's conference.&lt;br /&gt;&lt;br /&gt;One of Four Digits' goals for hosting Plone Conference 2012 is &quot;putting Arnhem on the map for Plone,&quot; but the folks hosting this year's conference are far from unknowns in the Plone community.  In addition to organizing the very successful and fun Living Statutes Sprints in 2010 and 2011, they've participated Plone conferences and sprints around the globe since 2007. Their members also are well-known as &quot;do-ers&quot; throughout the Plone community and are represented on the Plone Foundation Board of Directors.  Four Digits develops open source software and web applications for companies and organisations, ranging from relatively simple websites to complex systems.  They have a staff of eight people, none of whom are addressed as &quot;manager&quot; or &quot;supervisor.&quot;&lt;br /&gt;&lt;br /&gt;&quot;I cannot say how incredibly excited I am and we all are here at Four Digits. We think Arnhem is a great place to host the Ploneconf and are very much looking forward to October,&quot; said Sjoerd van Elferen, a member of the Four Digits team.&lt;br /&gt;&lt;br /&gt;More information on the conference, including registration, calls for speakers, and conference specifics, will be coming soon from &lt;a class=&quot;external-link&quot; href=&quot;http://ploneconf.org&quot;&gt;ploneconf.org&lt;/a&gt; .&lt;/p&gt;</description>
	<pubDate>Sun, 22 Jan 2012 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Jazkarta Blog: Agile Development with Plone, Revisited</title>
	<guid isPermaLink="false">http://jazkarta.wordpress.com/?p=615</guid>
	<link>http://feeds.jazkarta.com/~r/JazkartaBlog/~3/Fqq1xMtva3E/</link>
	<description>&lt;p&gt;The announcement of the &lt;a href=&quot;http://weblion.psu.edu/events/plone/symposium&quot; title=&quot;2012 Plone Symposium East&quot;&gt;2012 Plone Symposium East&lt;/a&gt; (thank you Weblion! always a great gathering) is reminding me of the talk I gave there last year on &lt;a href=&quot;http://www.jazkarta.com/news/agile-development-with-plone&quot;&gt;&lt;em&gt;Agile Development with Plone&lt;/em&gt;&lt;/a&gt;. Here at Jazkarta we’re engaged in another large project, similar in many ways to the one that inspired that talk. Because our project management tools and techniques have evolved a bit since last year, I figured it was time for an update.&lt;/p&gt;
&lt;h2&gt;The Projects&lt;/h2&gt;
&lt;p&gt;Last year at this time, we were just getting started on a major website redesign for the &lt;a href=&quot;http://www.upress.umn.edu/&quot;&gt;University of Minnesota Press&lt;/a&gt;. There’s lots of information about this project in my Plone Conference presentation &lt;a href=&quot;http://www.jazkarta.com/news/how-to-get-a-fabulous-website-on-a-modest-budget-using-plone&quot;&gt;&lt;em&gt;How To Get a Fabulous Website on a Modest Budget Using Plone&lt;/em&gt;&lt;/a&gt;. Briefly, it involved a major data conversion from a FileMaker database into Plone, a small number of complex custom content types, extensive design work, and a featured “explore” section powered by eea.facetednavigation.&lt;/p&gt;
&lt;p&gt;Our new project is a major website redesign for &lt;a href=&quot;http://doaks.org/&quot;&gt;Dumbarton Oaks Research Library and Collection&lt;/a&gt;, a research institute of Harvard University and the home of a little known but outstanding museum and garden in Washington, D.C. We began with a discovery phase last summer, and have been working on implementation since November.&lt;/p&gt;
&lt;h2&gt;What’s the Same&lt;/h2&gt;
&lt;p&gt;Both of these are fixed budget projects with a large number of desired features, and at the outset many of these were inadequately defined for development purposes. In both cases there are multiple stakeholders with differing priorities, but there is an intelligent, proactive project owner who is trusted and empowered to make decisions. The Jazkarta team is the same – Carlos de la Guardia in Mexico, Alec Mitchell in California, and me in Massachusetts – and none of us ever work full time on any of our projects.&lt;/p&gt;
&lt;p&gt;This all adds up to the same basic project management challenge: how to adapt agile techniques to manage a fixed price, flexible scope project with a distributed, part time team.&lt;/p&gt;
&lt;h2&gt;What’s Different&lt;/h2&gt;
&lt;p&gt;Happily, the Dumbarton Oaks project does not involve a complicated data import from a FileMaker database. For UMP this required a &lt;a href=&quot;http://pypi.python.org/pypi/collective.transmogrifier&quot;&gt;collective.transmogrifier&lt;/a&gt; script, many many many trial and error imports, and over 60 hours of Jazkarta development time. Dumbarton Oaks currently has a static HTML website, which is much simpler to import. &lt;a href=&quot;http://pypi.python.org/pypi/funnelweb&quot;&gt;Funnelweb&lt;/a&gt; made this easy – only a few trial imports and some content massaging were required. We’re not a quarter through the project but all the old content is already on staging. Total development effort: 10 hours.&lt;/p&gt;
&lt;p&gt;Because the content import was relatively easy and the project mostly requires custom features and content types that are independent of each other, we have been able to divide up the work into several releases. This gives us a series of smaller planning horizons and allows us to be more agile (more on this later). Each release can potentially be deployed to production – and even if we decide not to, new content is developed on staging which gives the new features a thorough vetting. No matter how much you thought you tested, there are always problems that don’t get discovered until the software sees serious use. Having a series of small production deployments avoids piling all the bug fixes and theme tweaks into a single mega deployment phase at the end of the project.&lt;/p&gt;
&lt;h2&gt;Our Evolving Agile Development Practices&lt;/h2&gt;
&lt;p&gt;Our basic development process remains the same:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Discovery&lt;/li&gt;
&lt;li&gt;Define schedule and resources (how the budget will get spent)&lt;/li&gt;
&lt;li&gt;User story development&lt;/li&gt;
&lt;li&gt;Story estimation (we use &lt;a href=&quot;http://en.wikipedia.org/wiki/Planning_poker&quot;&gt;planning poker&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A series of development iterations alternated with evaluation periods&lt;/li&gt;
&lt;li&gt;Production deployment&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During discovery the project owner and I distributed the feature requirements into a series of releases, based on a combination of priorities and keeping all the stakeholders happy. (Everyone got something in almost every release.) This high level release plan allows us to do our story development and estimation one release at a time, which saves time and money – especially considering that &lt;em&gt;all&lt;/em&gt; the developers participate in planning poker sessions. Since we know the customer wants more than their fixed budget will get them, and we also know they will change their mind about what they want as the project progresses, it makes sense to postpone the effort of writing and estimating stories we may never get to.&lt;/p&gt;
&lt;p&gt;As in previous projects, I took the first cut at turning the project requirements into stories, then discussed and revised the stories with the project owner. Because I have intimate knowledge of Plone, I can translate requirements into stories that make sense to develop. For example, we don’t need to spend time defining stories for CMS functionality or for things that Plone has great add-ons for (like staff directories and bibliographies). Some things may turn out to need tweaking, but it is better to give the customer stock Plone and add-on features to try out first. They may decide to live with the stock features and put their development dollars into new features instead of making changes.&lt;/p&gt;
&lt;p&gt;Our communication tools remain the same: Skype, IRC, chat, Google Calendar, and Google Documents. This combination is the secret sauce that allows a distributed team to work as if they were in the same room. We did switch from &lt;a href=&quot;http://pypi.python.org/pypi/ClueMapper&quot;&gt;ClueMapper&lt;/a&gt; (based on svn and trac) to &lt;a href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt; for source code repository and ticket tracking. We miss a few management features, but the developers are much happier working in a dvcs.&lt;/p&gt;
&lt;p&gt;Our development iterations remain the same – one week each, followed by a week of evaluation during which the customer has time to test and reflect on what they want to do next. We kick off each iteration with a planning meeting, which surfaces any questions about the stories we’re tackling and allows us to do task breakdown and assignment while we are all in the virtual room of a Skype conference call. During the iteration we have a short standup meeting every day to keep things on track – everyone says what they did yesterday, what they’ll do today, and raises any blocking issues. My notes from the standups are written in a Google spreadsheet which is shared with everyone. This gives the project owner access to detailed information about how things are going, if they miss a standup meeting.&lt;/p&gt;
&lt;p&gt;The biggest change we’ve made for this project is to adopt &lt;a href=&quot;http://scrumdo.com&quot;&gt;ScrumDo&lt;/a&gt; for story development and iteration planning. ScrumDo is an &lt;a href=&quot;http://scrumdo.org/&quot;&gt;open source&lt;/a&gt; agile project management tool that’s written in Python. We are using the hosted, SaaS version that’s at &lt;a href=&quot;http://scrumdo.com&quot;&gt;scrumdo.com&lt;/a&gt; – accounts are free for up to 10 users and 10 projects. ScrumDo has a friendly drag and drop UI that makes it easy for for project owners to plan iterations, edit stories, add comments, and see results. Unlike &lt;a href=&quot;http://www.pivotaltracker.com/&quot;&gt;Pivotal Tracker&lt;/a&gt;, it allows flexible iteration scheduling and story and task assignments. Google Docs provide better simultaneous editing for multiple users and more flexible formatting, but ScrumDo makes it really easy to add and change tasks, assign them, and mark them as complete. If it managed estimated and actual hours I’d totally love it.&lt;/p&gt;
&lt;p&gt;ScrumDo added a Planning Poker tool last March, and this has been a real time saver. It’s a web page where the scrum master selects a story to size and everyone puts down a story point card. Once you play your card you can see the others, and after discussion and reaching consensus, the scrum master assigns the winning value to the story. What set of cards to use is one of the ScrumDo project settings (we use modified Fibonacci).&lt;/p&gt;
&lt;div class=&quot;mceTemp mceIEcenter&quot;&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_623&quot; style=&quot;width: 610px;&quot;&gt;&lt;img alt=&quot;Screenshot of ScrumDo Planning Poker interface&quot; class=&quot;wp-image-623 &quot; height=&quot;335&quot; src=&quot;http://jazkarta.files.wordpress.com/2012/01/planning-poker1.png?w=600&amp;amp;h=335&quot; title=&quot;ScrumDo Planning Poker&quot; width=&quot;600&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;ScrumDo Planning Poker interface&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;The Value of Agile Project Management&lt;/h2&gt;
&lt;p&gt;The planning and standup meetings required by an agile approach do take time. For the UMP project, the meetings and project management activities combined used almost 40% of the total budget. But what is the alternative? Written requirements “thrown over the wall” to developers are a recipe for failure. The customers and the developers have to talk to each other to understand the project and its development trade offs. I’ve never had a customer complain that I’m using too much project management time when I’m running a project in this way. The value of open and frequent communications and iterative development cycles is very clear to them. They get full ownership of the project, choose exactly what it will deliver at every step along the way, and in the end they are delighted to get the system they envisioned.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/jazkarta.wordpress.com/615/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jazkarta.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/jazkarta.wordpress.com/615/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jazkarta.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/jazkarta.wordpress.com/615/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/jazkarta.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/jazkarta.wordpress.com/615/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/jazkarta.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/jazkarta.wordpress.com/615/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jazkarta.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/jazkarta.wordpress.com/615/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jazkarta.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/jazkarta.wordpress.com/615/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jazkarta.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.jazkarta.com&amp;amp;blog=11374782&amp;amp;post=615&amp;amp;subd=jazkarta&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.jazkarta.com/~ff/JazkartaBlog?a=Fqq1xMtva3E:XI9JU-Muqg0:yIl2AUoC8zA&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/JazkartaBlog?d=yIl2AUoC8zA&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.jazkarta.com/~ff/JazkartaBlog?a=Fqq1xMtva3E:XI9JU-Muqg0:V_sGLiPBpWU&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/JazkartaBlog?i=Fqq1xMtva3E:XI9JU-Muqg0:V_sGLiPBpWU&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.jazkarta.com/~ff/JazkartaBlog?a=Fqq1xMtva3E:XI9JU-Muqg0:qj6IDK7rITs&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/JazkartaBlog?d=qj6IDK7rITs&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.jazkarta.com/~ff/JazkartaBlog?a=Fqq1xMtva3E:XI9JU-Muqg0:F7zBnMyn0Lo&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/JazkartaBlog?i=Fqq1xMtva3E:XI9JU-Muqg0:F7zBnMyn0Lo&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/JazkartaBlog/~4/Fqq1xMtva3E&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 20 Jan 2012 18:39:54 +0000</pubDate>
</item>
<item>
	<title>Connexions Developers Blog: Connexions Dev Update for Jan. 20, 2012</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-7775252059028186398.post-9176762996685530867</guid>
	<link>http://feedproxy.google.com/~r/ConnexionsRhaptosDeveloperBlog/~3/jNiWP2a27Rs/connexions-dev-update-for-jan-20-2012.html</link>
	<description>Lots of info to share since last week's update was missed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CCAP&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;We tested the Physics book PDF generation and the Word Importer changes in QA last week.    The code was using FOP and Docbook to create more professional looking PDFs.  Our plan was to release this code and in a couple of weeks release the Prince XML version of the PDF generation.  The urgency was caused by the lack of harddrive space on the development server where the content is being created.  We have now fixed the space issue so it was decided not to release the FOP version of the PDF code.  We are focused on the new Prince XML version.&lt;/li&gt;
&lt;li&gt;Documentation - We have some new styles needed for the Sociology book to our documentation of the new markup.&lt;/li&gt;
&lt;li&gt;Coding is continuing on the PrinceXML version of the PDF.  You can see a sample of the Sociology layout at http://mountainbunker.org/~schatz/sociology.pdf.  It has Physics content, but the color scheme of Sociology.&lt;/li&gt;
&lt;li&gt;Some minor issues have been brought up by our content team regarding Math display in the Physics book.  Some of this will be fixed in the Prince XML code, but others will have to be fixed when we do the migration to production by tweaking the MathML generated by the Word Importer.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;CNX Conference Preparation&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;As the CNX Conference approaches, we are preparing for the sprints that will happen after the conference.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://trac.rhaptos.org/trac/rhaptos/wiki/Sprint%202012/TicketList&quot; target=&quot;_blank&quot;&gt;Bug List&lt;/a&gt; for the Sprint has been completed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trac.rhaptos.org/trac/rhaptos/wiki/Sprint%202012/SprintDocumentation&quot; target=&quot;_blank&quot;&gt;Documentation&lt;/a&gt; for the Sprint has started.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;Donate Button Change&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The donate button now has a minimum donation of $1.  The original minimum was $10. We hope this will lead to more donations.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;iPhone App&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;An Apple Developer Program for iOS was finally purchased last week.  It has taken months for all the documentation problems to get ironed out.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Consortium Tech Committee Meeting&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The Connexions Consortium Tech Committee held its monthly meeting last week.&lt;/li&gt;
&lt;li&gt;Discussions included current Connexions dev work, OERPub API update, Sprint topics and other member updates.  Check the &lt;a href=&quot;https://docs.google.com/document/d/14aPTQAVJybXKX8wd-uynpDSJCTUdzd3d1HQLXhi9kw8/edit?authkey=CMHhl44P&amp;amp;hl=en_US&amp;amp;authkey=CMHhl44P&quot; target=&quot;_blank&quot;&gt;minutes&lt;/a&gt; for more details.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;OERPub API&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;We are currently testing a new release of the OERPub API which uses Sword to add and modify Connexions content.&lt;/li&gt;
&lt;li&gt;The latest release allows users to add content to a Lens, add Featured Links to a module and to create a collection in a Workspace or Workgroup.  The code should be released early next week.&lt;/li&gt;
&lt;li&gt;The latest documentation for the API is at https://trac.rhaptos.org/trac/rhaptos/wiki/TechnicalDocumentation/Code/Sword&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;HTML Editor Discussion&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;We have been talking within our team and on the Rhaptos list about the possibility of using HTML5 Microdata in the new WYSIWYG editor to document non-HTML elements in CNXML in the editor.&lt;/li&gt;
&lt;li&gt;HTML5 has some traction because of support from schema.org, but it also has problems such as very limited browser support.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://mailman.cnx.rice.edu/pipermail/rhaptos/2012-January/001020.html&quot; target=&quot;_blank&quot;&gt;thread&lt;/a&gt; on the Rhaptos list has more information.  &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7775252059028186398-9176762996685530867?l=devblog.cnx.org&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 20 Jan 2012 14:32:24 +0000</pubDate>
	<author>noreply@blogger.com (Ed Woodward)</author>
</item>
<item>
	<title>Four Digits: Fingers crossed during vote</title>
	<guid isPermaLink="true">http://blog.fourdigits.nl/fingers-crossed-during-vote-and-decision</guid>
	<link>http://blog.fourdigits.nl/fingers-crossed-during-vote-and-decision</link>
	<description>&lt;p&gt;This week, the community decides wether the Plone Conf 2012 will be held in Arnhem or Paris. Two companies turned in a prososal, so we have a 50/50 chance of winning the vote. If all goes well, the decision will be made public on monday the 23th of january. &lt;/p&gt;&lt;p&gt;In october or november, the 2012 edition of the Plone Conference will take place and one thing is certain: it will be in Europe. Four Digits wrote a &lt;a class=&quot;external-link&quot; href=&quot;http://plone.org/events/conferences/plone-conference-2012/proposals&quot;&gt;proposal&lt;/a&gt; and so did Abstract and Fanelli Consulting from Paris, France.&lt;/p&gt;
&lt;p&gt;The procedure: from 16 until the 20 of januari, the foundation members give their advisory vote. After that, the board of directors meet to discuss the result. They will make the formal desicion, although it is expected that the board follows the advice of the foundation members. As said, monday 23rd of januari is D-Day for both Arnhem and Paris&lt;/p&gt;
&lt;p&gt;The members as well as the Board are facing a challenge; both Arnhem (The Netherlands) and Paris (France) are great cities with a rich history. Two great venues for a conference.&lt;/p&gt;
&lt;p&gt;As for now, it is out of our hands. We are convinced that the community will pick the right place for the conference and no matter what the result is: Four Digits is going to be there.&lt;/p&gt;</description>
	<pubDate>Wed, 18 Jan 2012 10:44:32 +0000</pubDate>
</item>
<item>
	<title>Jorgen Modin: How to make a massive Zope/Plone undo through the web</title>
	<guid isPermaLink="false">tag:jorgenmodin.net,2012-01-16:13096401de2f57cb5c4efbb9a3de9946</guid>
	<link>http://jorgenmodin.net/index_html/archive/2012/01/16/how-to-make-a-massive-zopeplone-undo-through-the-web</link>
	<description>&lt;p&gt; &lt;/p&gt;
&lt;div class=&quot;even&quot;&gt;
&lt;p&gt;Summary:&lt;/p&gt;
&lt;p&gt;http://localhost:8080/manage_UndoForm?PrincipiaUndoBatchSize:int=&lt;span style=&quot;font-weight: bold;&quot;&gt;660&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;....where 660 should be replaced with the number of transactions you need to go back. Then click like crazy.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I had the need to back a Zope site in time several months, October 2011 to be specific.&lt;/p&gt;
&lt;p&gt;I had deleted a page (after its due date) for a Plone course December 2011 and &lt;span style=&quot;font-style: italic;&quot;&gt;kept&lt;/span&gt; one for December &lt;span style=&quot;font-style: italic;&quot;&gt;2007&lt;/span&gt;. I did not, repeat not, want to enter everything that has changed in the contents of that course in between those two dates again. There are backups for the entire system but they are rotated, and I caught this late.&lt;/p&gt;
&lt;p&gt;The course page is a compound content type consisting of sub objects for dates, pricing and other things. The missing course page had resided in a folder hierarchy that had also been deleted. The easiest would therefore be to just back the entire server in time, rather than trying to find specific edits to undo.&lt;/p&gt;
&lt;p&gt;The undo page in the ZMI batches undoable transactions in lots of 20. My plan was to revert everything back to October 2011 (working on a copy of course). So, 20 transactions is not enough. I need a mega batch! I know there are command line scripts were I can find the byte offset for the date I am interested in and then use truncate, but haven't done it for ages (ok, once in 2002), and can the effect still be achieved from the ZMI? It will be an append but that's OK.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://jorgenmodin.net/images/undo.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you look at the &quot;Earlier transactions&quot; and &quot;Later transactions&quot; links, you can see that the start and end transactions are encoded as cgi parameters. The batch size is in other words, not hard coded.  So, if the url for &quot;Later transactions&quot; on the second page is&lt;/p&gt;
&lt;p&gt;http://localhost:8080/manage_UndoForm?first_transaction:int=0&amp;amp;last_transaction:int=20&amp;amp;PrincipiaUndoBatchSize:int=20&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;We can just change those numbers. So I clicked through &quot;Earlier transactions&quot; until I reached October, noted where I were in transaction numbers and did something like this:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;http://localhost:8080/manage_UndoForm?first_transaction:int=0&amp;amp;last_transaction:int=&lt;span style=&quot;font-weight: bold;&quot;&gt;660&lt;/span&gt;&amp;amp;PrincipiaUndoBatchSize:int=20&lt;/p&gt;
&lt;p&gt;I got a big page and I did &lt;span style=&quot;font-style: italic;&quot;&gt;a lot&lt;/span&gt; of clicking of check boxes, and hit &quot;Undo&quot; - worked like a charm. I then copied over the oh so precious text to the production server.&lt;/p&gt;
&lt;p&gt;&quot;PrincipiaUndoBatchSize&quot; I did not notice until now, it did not seem to overrule the other numbers; I did not change that one.&lt;/p&gt;
&lt;p&gt;Hmmm, must go back and try something.... Yup, this works too:&lt;/p&gt;
&lt;p&gt;http://localhost:8080/manage_UndoForm?PrincipiaUndoBatchSize:int=&lt;span style=&quot;font-weight: bold;&quot;&gt;660&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
	<pubDate>Mon, 16 Jan 2012 12:03:49 +0000</pubDate>
</item>
<item>
	<title>Hector Velarde: Setting the right permissions on your blobstorage directory</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-4871829230797738545.post-4978048172423629334</guid>
	<link>http://feedproxy.google.com/~r/hvelarde/~3/M0MTxcLeqYg/setting-right-permissions-on-your.html</link>
	<description>Have you ever been annoyed by a message saying that the blobstorage directory of your instance has an insecure mode setting?&lt;br /&gt;
&lt;br /&gt;
That happens to me all the time, so today I spent a couple of minutes trying to figure out how to fix it.&lt;br /&gt;
&lt;br /&gt;
In &lt;b&gt;ZODB/blob.py&lt;/b&gt; we have the following:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;class &lt;b&gt;FilesystemHelper&lt;/b&gt;:
    # Storages that implement IBlobStorage can choose to use this
    # helper class to generate and parse blob filenames.  This is not
    # a set-in-stone interface for all filesystem operations dealing
    # with blobs and storages needn't indirect through this if they
    # want to perform blob storage differently.

    …

    def &lt;b&gt;create&lt;/b&gt;(self):
        if not os.path.exists(self.base_dir):
            os.makedirs(self.base_dir, 0700)
            log(&quot;Blob directory '%s' does not exist. &quot;
                &quot;Created new directory.&quot; % self.base_dir)
        if not os.path.exists(self.temp_dir):
            os.makedirs(self.temp_dir, 0700)
            log(&quot;Blob temporary directory '%s' does not exist. &quot;
                &quot;Created new directory.&quot; % self.temp_dir)

        if not os.path.exists(os.path.join(self.base_dir, LAYOUT_MARKER)):
            layout_marker = open(
                os.path.join(self.base_dir, LAYOUT_MARKER), 'wb')
            layout_marker.write(self.layout_name)
        else:
            layout = open(os.path.join(self.base_dir, LAYOUT_MARKER), 'rb'
                          ).read().strip()
            if layout != self.layout_name:
                raise ValueError(
                    &quot;Directory layout `%s` selected for blob directory %s, but &quot;
                    &quot;marker found for layout `%s`&quot; %
                    (self.layout_name, self.base_dir, layout))

    def &lt;b&gt;isSecure&lt;/b&gt;(self, path):
        &quot;&quot;&quot;Ensure that (POSIX) path mode bits are 0700.&quot;&quot;&quot;
        &lt;b&gt;return (os.stat(path).st_mode &amp;amp; 077) == 0&lt;/b&gt;

    def &lt;b&gt;checkSecure&lt;/b&gt;(self):
        if not self.isSecure(self.base_dir):
            &lt;b&gt;log('Blob dir %s has insecure mode setting' % self.base_dir,
                level=logging.WARNING)
&lt;/b&gt;&lt;/pre&gt;&lt;br /&gt;
Then, the only thing you need to do is run &lt;b&gt;chmod 700 var/blobstorage&lt;/b&gt; (&lt;i&gt;owner can read, write and execute&lt;/i&gt;) in your installation directory.&lt;br /&gt;
&lt;br /&gt;
Why this directory is created with a different setting (&lt;b&gt;755&lt;/b&gt;) is a mystery to solve another day.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4871829230797738545-4978048172423629334?l=hvelarde.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/XM6lQ1LpspjtD4QrNYEKLlD2Qbs/0/da&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://feedads.g.doubleclick.net/~a/XM6lQ1LpspjtD4QrNYEKLlD2Qbs/0/di&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/XM6lQ1LpspjtD4QrNYEKLlD2Qbs/1/da&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://feedads.g.doubleclick.net/~a/XM6lQ1LpspjtD4QrNYEKLlD2Qbs/1/di&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/hvelarde/~4/M0MTxcLeqYg&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 13 Jan 2012 19:08:00 +0000</pubDate>
</item>

</channel>
</rss>

