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




    



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

  <description>
    
      Software I've authored or contributed to
    
  </description>

  

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

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

  <items>
    <rdf:Seq>
      
        <rdf:li rdf:resource="http://rpatterson.net/software/collective.gsqi"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/collective.contemplate"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/bbdb.gmailfilter"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/new-membrane-and-remember-maintainer"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/collective.securitycleanup"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/collective.slideshowfolder"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/collective.redirect"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/collective.formcriteria"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/collective.testcaselayer"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/rpatterson.mailsync"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/z3c.persistentfactory"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/z3c.gibberish"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/z3c.recipe.ldap"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/zc.buildout"/>
      
      
        <rdf:li rdf:resource="http://rpatterson.net/software/cmfplacefulworkflow"/>
      
    </rdf:Seq>
  </items>

</channel>


  <item rdf:about="http://rpatterson.net/software/collective.gsqi">
    <title>collective.gsqi</title>
    <link>http://rpatterson.net/software/collective.gsqi</link>
    <description>A grab bag of patches to GS and portal_quickinstaller</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>This <a class="reference external" href="http://pypi.python.org/pypi/collective.gsqi">package</a> is my grab bag of patches to GS and portal_quickinstaller
I use in my client work.  It is unstable, unpolished, subject to my
whim, and really should be experimental.gsqi.  If, however, the same
GenericSetup and portal_quickinstaller quirks and bugs bother you, or
the same conveniences are of value to you, you might want to look at
whats in it.</p>
<blockquote>
<ul class="simple">
<li>Fix <a class="reference external" href="http://dev.plone.org/collective/browser/collective.gsqi/trunk/collective/gsqi/workflow/exportimport.py">import of group roles</a>
during workflow import</li>
<li>Fix <a class="reference external" href="http://dev.plone.org/plone/ticket/8350">circular import handler dependencies</a> bug</li>
<li>Fix portal_quickinstaller so that <a class="reference external" href="http://dev.plone.org/collective/browser/collective.gsqi/trunk/collective/gsqi/qi.py">persistent data is not lost</a>
on reinstall</li>
</ul>
</blockquote>
<p>Also included are a number of perhaps naughty extensions to the CMF
content import handler.</p>
<blockquote>
<ul class="simple">
<li>Permissive registrations of the StructureFolderWalkingAdapter so
that folders under the profile's &quot;structure&quot; folder with the same
name as in the container's .objects file can be used to import any
kind of content object, not just folders.  This allows, amongst
other things, creating topics/collections and criteria on import.</li>
<li>Set arbitrary AT fields on import using the options under the
[FIELDS] section of .properties as field names and the option
values as field values.  If field.multiValued is True, then the
option value will be split on newlines and each value stripped.</li>
<li>Reindex imported objects so that imported titles, descriptions,
and any other AT fields are reflected in the catalog and portal
navigation after import.</li>
<li>Set local roles on import where each option under the [ROLES]
section of .properties is the principal/user id and the roles
assigned to that principal are taken from the option value split
at newlines with each item stripped.</li>
<li>Do each workflow transition listed under the &quot;transitions&quot; option
of the [DEFAULT] section of .properties.  The option value is
split at newlines with each item stripped.</li>
<li>Set display layout using the layout option in the [DEFAULT]
section of .properties</li>
</ul>
</blockquote>
<p>Also included is <a class="reference external" href="http://rpatterson.net/blog/gsml">GSML</a> which
allows implementing GS import handlers as you would implement ZCML
directive handlers.  Some import handlers are included in
collective.gsqi that make use of GSML.</p>
<blockquote>
<ul class="simple">
<li>A <a class="reference external" href="http://dev.plone.org/collective/browser/collective.gsqi/trunk/collective/gsqi/group/README.txt">groups import handler</a></li>
<li>A <a class="reference external" href="http://dev.plone.org/collective/browser/collective.gsqi/trunk/collective/gsqi/refs/meta.py">references import handler</a></li>
</ul>
</blockquote>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2009-08-23T15:41:03Z</dc:date>
    
    <dc:modified>2009-08-23T15:41:03Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/collective.contemplate">
    <title>collective.contemplate</title>
    <link>http://rpatterson.net/software/collective.contemplate</link>
    <description>Add content from existing content templates</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>The <a class="reference external" href="http://pypi.python.org/pypi/collective.contemplate">collective.contemplate</a> package allows
site administrators to designate content items as the template from
which new items of that type will be created.</p>
<p>When creating content from a template, the initial edit form is
rendered and validation performed on the template after changing the
owner of the template to the current user within a
transaction.savepoint() which is rolled back after rendering.  As a
result, portal_factory is not involved and indexing occurs only on the
final copy of the template.  This may result in performance gains
though this has not been tested.</p>
<p>While designed to be Archetypes agnostic, only an Archetypes
implementation is currently provided.  Templates may currently be
designated using Archetype UIDs for the global templates or references
for the context specific templates.</p>
<p>A reserved_id property can also be set on type information objects in
portal_types.  If set and an object with that ID already exists in the
container, then the type is not allowed to be added.</p>
<div class="contents topic" id="table-of-contents">
<p class="topic-title first">Table of Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#installation" id="id1">Installation</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
</ul>
</div>
<div class="section" id="installation">
<h3><a class="toc-backref" href="#id1">Installation</a></h3>
<p>To use collective.contemplate for the Plone content types, include the
collective.contemplate configure.zcml in your instance and install
&quot;Content Templates&quot; in the &quot;Add-on Products&quot; control panel, or in the
ZMI through portal_setup.  This will replace the Plone content type
information with template versions.</p>
<p>To install for other content types, register a template add form for
the content type and use the TemplateDynamicViewTypeInfo meta_type for
the content type information.</p>
<p>In the ZCML for the browser views:</p>
<pre class="literal-block">
&lt;contemplate:formControllerPage
     name=&quot;addFoo&quot;
     type_name=&quot;Foo&quot;
     for=&quot;zope.app.container.interfaces.IAdding&quot;
     permission=&quot;foo.AddFoo&quot; /&gt;
</pre>
<p>Note that the &quot;foo.AddFoo&quot; permission must be registered and the name
&quot;addFoo&quot; must be the same as your content type constructor.  If you're
using Archetypes, then the constructor may auto-generated by prefixing
&quot;add&quot; to the content class name.</p>
<p>In the GenericSetup profile types.xml file:</p>
<pre class="literal-block">
&lt;object name=&quot;Foo&quot; meta_type=&quot;TemplateDynamicViewTypeInfo &quot;/&gt;
</pre>
<p>In the GenericSetup profile types/Foo.xml file:</p>
<pre class="literal-block">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;object name=&quot;Foo&quot;
   meta_type=&quot;TemplateDynamicViewTypeInfo&quot;&gt;
</pre>
</div>
<div class="section" id="usage">
<h3><a class="toc-backref" href="#id2">Usage</a></h3>
<p>This package is currently incomplete until a UI for designating
templates is included.  In the mean time, you may set the global
templates in the ZMI or context specific templates using the
references GenericSetup import handler provided by collective.gsqi.</p>
<p>You can use a given content item as the global template by setting the
global_uid property of the content type information under portal_types
in the ZMI.  Set global_uid to the Archetypes UID of the template.</p>
<p>You can use a content item as the template in the context of a
specific folder by setting a reference from the folder to the item
with the relationship of &quot;contemplate.${type_info/getId}&quot; where
&quot;${type_info/getId}&quot; is the id of the content type.</p>
<p>A reserved id can be set using the reserved_id property of the content
type information under portal_types in the ZMI.</p>
</div>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2009-08-23T22:16:33Z</dc:date>
    
    <dc:modified>2009-08-23T22:16:33Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/bbdb.gmailfilter">
    <title>bbdb.gmailfilter</title>
    <link>http://rpatterson.net/software/bbdb.gmailfilter</link>
    <description>GMail filters from emacs BBDB</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a class="reference external" href="http://pypi.python.org/pypi/bbdb.gmailfilter">bbdb.gmailfilter</a>
installs a command-line python script and an emacs command for
exporting a GMail filters Atom feed from the gnus-public and
gnus-private fields in BBDB.</p>
<div class="section" id="installing">
<h3>Installing</h3>
<p>The package can be installed using the standard python package
installation procedure.  Extract the tarball, then run the following
command inside the extracted directory:</p>
<pre class="literal-block">
$ python setup.py install
</pre>
<p>This will install the command-line utility and the rpatterson-gmail.el
emacs library.  Then add the following to your ~/.emacs:</p>
<pre class="literal-block">
(require 'rpatterson-gmail)
</pre>
</div>
<div class="section" id="usage">
<h3>Usage</h3>
<p>Once installed, the filters can be exported to a file simply by
calling M-x bbdb-export-gmail-filters.  You will be prompted for a
file to export the filters to.</p>
<p>For every BBDB record that has a value in the gnus-private field, a
filter will be included that matches the &quot;To&quot; GMail filter field on
any BBDB net addresses for that record and applies the label specified
in the gnus-private field value.  The same is done for BBDB records
with values in the gnus-public BBDB field but filters on the &quot;From&quot;
GMail filter field instead.</p>
</div>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2009-06-04T07:24:32Z</dc:date>
    
    <dc:modified>2009-06-04T07:24:32Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/new-membrane-and-remember-maintainer">
    <title>New membrane and remember Maintainer</title>
    <link>http://rpatterson.net/software/new-membrane-and-remember-maintainer</link>
    <description>Rob Miller announced today that I'll be the new maintainer</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>In a <a class="reference external" href="http://www.openplans.org/projects/remember/lists/remember/archive/2008/12/1228256501493/forum_view">post</a>
to the remember list today, Rob Miller announced what we've been
discussing for a while, I'm now the new maintainer for <a class="reference external" href="http://plone.org/products/membrane">membrane</a> and
<a class="reference external" href="http://plone.org/products/remember">remember</a>.  I was stoked when he asked and since then we've had some
great discussions so I'm even more stoked now.  :)</p>
<p>I've subsequently posted a <a class="reference external" href="http://www.openplans.org/projects/remember/lists/remember/archive/2008/12/1228267212368/forum_view">survey</a>
in hopes of getting a sense of what people are using membrane and
remember for and what direction they'd like to see them take.  It
should only take a few seconds to respond to so please do if you have
any interest in membrane or remember at all.</p>
<p>I'm looking forward to working with Rob and to help keep membrane and
remember moving forward!</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-12-03T02:04:19Z</dc:date>
    
    <dc:modified>2008-12-03T02:04:19Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/collective.securitycleanup">
    <title>collective.securitycleanup</title>
    <link>http://rpatterson.net/software/collective.securitycleanup</link>
    <description>GenericSetup handlers to restore Zope security to defaults</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>WARNING: Backup your ZODB before using this package!</p>
<p>The Zope 2 security framework is very powerful and one of it's
greatest strengths. A lot of it's power comes from it's
flexibility. Exposing that power to site adminsitrators often ends up
giving them enough rope to hang themselves with. This is exactly what
the &quot;Security&quot; tab in the ZMI does.</p>
<p>In many cases, a site admin or consultant is faced with the daunting
task of restoring all the security settings throughout the Zope object
heirarchy in order to bring sanity and predictability back to the
site. The <a class="reference external" href="http://pypi.python.org/pypi/collective.securitycleanup">collective.securitycleanup</a> package
provides GenericSetup handlers for restoring the role mappings and
local roles back to their defaults. This handler can be used in
combination with existing handlers to set role mappings and to
re-apply workflow security settings to help start the process of
security cleanup.</p>
<p>The clean up is performed on all ancestors including the Zope
application root and by walking down the heirarchy to all
descendants. This means all descendents of the context the handler is
used on and all ancestors of the context including the root will be
cleaned up. It will not clean up siblings or anything else that is not
a direct ancestor to the context.</p>
<p>The clean up removes all permission settings stored on the instance
which effectively restores them to code defaults. The clean up also
removes all local roles except the &quot;Owner&quot; role for the user returned
by OFS.interfasces.IOwned.getOwnerTuple() if already assigned.</p>
<p>Use of this tool will likely only ever be a starting point. So be sure
to test thoroughly before deploying to your production server and
backup your ZODB before using it.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-12-01T18:27:17Z</dc:date>
    
    <dc:modified>2008-12-01T18:27:17Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/collective.slideshowfolder">
    <title>collective.slideshowfolder</title>
    <link>http://rpatterson.net/software/collective.slideshowfolder</link>
    <description>Somtimes useful extensions to Products.slideshowfolder</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>The <a class="external-link" href="http://pypi.python.org/pypi/collective.slideshowfolder">SlideshowImage content type</a> uses a reference to an existing normal image somewhere else in the site to act as a kind of link or alias. This allows for the creation of a folder as a <a class="external-link" href="http://pypi.python.org/pypi/Products.slideshowfolder">slideshowfolder</a> that displays images that are actually stored elsewhere.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-11-15T04:35:49Z</dc:date>
    
    <dc:modified>2008-11-15T04:35:49Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/collective.redirect">
    <title>collective.redirect</title>
    <link>http://rpatterson.net/software/collective.redirect</link>
    <description>Administer redirects to internal or external URLs using Link like content</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Administer redirects to internal or external URLs using Link like
content.  Where Products.redirectiontool or plone.app.redirector only
deal with redirecting to internal URLs internal to the portal,
<a class="external-link" href="http://pypi.python.org/pypi/collective.redirect">collective.redirect</a> allows for redirecting to external URLs.  The
paths to redirect are administered using instances of the Redirect
content type.  The paths that are redirected are independent of the
path of the Redirect instance for a couple of reasons.</p>
<p>Firstly, since the portal object is not a BTree based folder it will
begin to behave poorly if too many objects are added to it.  Allowing
the redirected paths independent from the location of the Redirect
instances allows for many redirects without putting too many objects
in the portal root.</p>
<p>Secondly, having the paths independent of the Redirect instance
locations allows users to create redirect for paths that they can't
add content too.  Keep in mind that this might be a bad thing for your
site and can certainly be abused as a DOS attack of sorts.</p>
<p>If multiple redirects exist for the same path, the one with the more
recent publication date will be preferred.  Finally a redirect will
never override an otherwise traversable URL.  IOW, a redirect cannot
override an actual content object, skin object, view, or anything else
traversal.  The redirect only occurs when a NotFound error would
otherwise be raised.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-11-12T04:56:45Z</dc:date>
    
    <dc:modified>2008-11-12T04:56:45Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/collective.formcriteria">
    <title>collective.formcriteria</title>
    <link>http://rpatterson.net/software/collective.formcriteria</link>
    <description>User enterable search criteria forms for collections/topic/smart folders.</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>This package provides new criteria types based on the<br />ATContentTypes.criteria types that are used to create a form at the<br />top of the topic view.&nbsp; Users can use the form to submit criteria to<br />supplement any search criteria in the topic.&nbsp; Values entered on the<br />criteria tab for the topic become the default values on the form.<br /><br />Also provided is an alternative display layout that uses the folder<br />contents table and can still display the search form viewlet.</p>
<p>See the <a class="external-link" href="http://pypi.python.org/pypi/collective.formcriteria">PyPI page</a> for more details.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-06-30T04:59:45Z</dc:date>
    
    <dc:modified>2008-06-30T04:59:45Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/collective.testcaselayer">
    <title>collective.testcaselayer</title>
    <link>http://rpatterson.net/software/collective.testcaselayer</link>
    <description>Use test cases as zope.testing layers</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>The support for layers provided by zope.testing helps to lessen the amount of time consumed during test driven development by sharing expensive test fixtures, such as is often requires for functional test.&nbsp; This package provides several well tested facilities to make writing and using layers faster and easier.</p>
<p>Layer authors often end up reproducing the functionality provided by their test case classes since the same functionality is needed to perform layer set up or tear down.&nbsp; The collective.testcaselayer.ztc, collective.testcaselayer.ctc, and collective.testcaselayer.ptc modules provide layer base classes that mix in the test case functionality from ZopeTestCase, CMFTestCase, and PloneTestCase, respectively.&nbsp; See the collective.testcaselayer.ztc, and collective.testcaselayer.ptc sections below (or ztc.txt and ptc.txt if reading this in the source) for more details.&nbsp; These layer base classes also include the layer base class support from collective.testcaselayer.layer and the sandboxed ZODB layer support from collective.testcaselayer.sandbox described below.&nbsp; Additionally, these modules allow for using the test case fixtures as layers themselves.</p>
<p>While class objects can be used as layers, as opposed to instances of classes, doing so means that it is not possible for a layer to subclass another layer *just* to re-use functionality without also depending on that layer being set up as well.&nbsp; See the collective.testcaselayer.layer section below (or layer.txt if reading this in the source) for more details.</p>
<p>The DemoStorage included with the ZODB provides a way to "nest" ZODB stores such that all writes will go to the DemoStorage while reads will be taken from the base storage if not available from the DemoStorage.&nbsp; The collective.testcaselayer.sandbox module uses this feature to associate a DemoStorage with each sandboxed layer to which set up changes are committed and restore the base storage on tear down.&nbsp; Thus sibling layers that write to the ZODB can be isolated from each other.&nbsp; See the collective.testcaselayer.sandbox section below (or sandbox.txt if reading this in the source) for more details.</p>
<p>See the <a class="external-link" href="http://pypi.python.org/pypi/collective.testcaselayer">PyPI page</a> for more details.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-05-24T06:22:41Z</dc:date>
    
    <dc:modified>2008-05-24T06:22:41Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/rpatterson.mailsync">
    <title>rpatterson.mailsync</title>
    <link>http://rpatterson.net/software/rpatterson.mailsync</link>
    <description>OfflineIMAP, mswatch, and Gnus integration for realtime mail</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Like many others I've been frustrated with the options that are available for email clients.&nbsp; I recently had a bit of break through and <a class="external-link" href="http://pypi.python.org/pypi/rpatterson.mailsync">packaged</a> the reusable parts of my mail setup for consumption by others.&nbsp; See the <a class="external-link" href="http://pypi.python.org/pypi/rpatterson.mailsync#backstory">backstory</a> for all the gory details of the hisotry.&nbsp; I've factored everything with an eye towards extensibility so if there's enough interest, I'll start a project and a public repo somewhere and put this out there.&nbsp; See the <a class="external-link" href="http://pypi.python.org/pypi/rpatterson.mailsync#todo">TODO</a> list if your interested in any of the ideas I have for improvements.</p>
<p>To try it out, just see the <a class="external-link" href="http://pypi.python.org/pypi/rpatterson.mailsync">README</a> on the pypi page.&nbsp; Here's a brief description.</p>
<p>This package provides some scripts that wrap parts of mswatch and<br />OfflineIMAP and integrate with Gnus to provide a local maildir that<br />is synchronized with a remote maildir as changes occur, instead of<br />polling on a regular basis.&nbsp; This provides for near instant delivery<br />of new mail while also reducing resource utilization.&nbsp; Integration<br />with the Emacs mail and newsreader, Gnus, is also provided in such a<br />way that your single threaded Emacs process is blocked much less as<br />changes occur to the maildirs.<br /></p>
<p>&nbsp;</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-06-30T05:00:24Z</dc:date>
    
    <dc:modified>2008-06-30T05:00:24Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/z3c.persistentfactory">
    <title>z3c.persistentfactory</title>
    <link>http://rpatterson.net/software/z3c.persistentfactory</link>
    <description>Persistent instance method ZCA factories</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Homepage: <a class="external-link" href="http://pypi.python.org/pypi/z3c.persistentfactory">http://pypi.python.org/pypi/z3c.persistentfactory</a></p>
<p>The ZCA and the ZODB are a good combination where components require
persistent state.  ZCA factories or handlers typically retrieve any
persistent state required from the persistent objects being adapted.
If the persistent state required is not specific to the objects being
adapted, a common solution is to register a persistent utility which
is then looked up in the factory or handler.  The persistent utility
approach requires, however, that the one appropriate utility is looked
up which requires support in the ZCA registrations either in the
interface provided or the utility name.</p>
<p>In some cases, however, it is more consistent with the object oriented
semantics of Python and the ZCA to think of the factory or handler as
an instance method of a persistent object.  With this approach the
non-context specific persistent state can be accessed on self.</p>
<div class="section">
<h2><a id="instance-method-event-handler" name="instance-method-event-handler">Instance Method Event Handler</a></h2>
<p>One example where this may be useful is where some non-context
persistent state is tightly coupled to some event handlers in such a
way where instance methods are better semantics.</p>
<p>The Baz class uses the decorator in the python code.  Note that the
factory decorator must come before the declaration decorators so that
it will be run last and will reflect the declarations.</p>
<blockquote>
<pre class="doctest-block">&gt;&gt;&gt; from z3c.persistentfactory import testing<br />&gt;&gt;&gt; baz = testing.Baz()<br /></pre>
</blockquote>
<p>Register the persistent factory wrapped instance method as a handler.</p>
<blockquote>
<pre class="doctest-block">&gt;&gt;&gt; from zope import component<br />&gt;&gt;&gt; component.provideHandler(factory=baz.factory)<br /></pre>
</blockquote>
<p>The method adapts IFoo, so create an object providing IFoo to be used
as the event.</p>
<blockquote>
<pre class="doctest-block">&gt;&gt;&gt; component.adaptedBy(baz.factory)<br />(&lt;InterfaceClass z3c.persistentfactory.testing.IFoo&gt;,)<br /></pre>
<pre class="doctest-block">&gt;&gt;&gt; from zope import interface<br />&gt;&gt;&gt; foo = testing.Foo()<br />&gt;&gt;&gt; interface.alsoProvides(foo, testing.IFoo)<br /></pre>
</blockquote>
<p>When the event is notified, the method is called with the event as an
argument.</p>
<blockquote>
<pre class="doctest-block">&gt;&gt;&gt; import zope.event<br />&gt;&gt;&gt; zope.event.notify(foo)<br />Called &lt;bound method Baz.factory of<br />&lt;z3c.persistentfactory.testing.Baz object at ...&gt;&gt;<br />  args: (&lt;z3c.persistentfactory.testing.Foo object at ...&gt;,)<br />  kwargs: {}<br /></pre>
</blockquote>
</div>
<div class="section">
<h2><a id="instance-method-adapter-factory" name="instance-method-adapter-factory">Instance Method Adapter Factory</a></h2>
<p>Another example is where an adapter factory needs to look up
persistent state specific to the objects being adapted but where that
state can't be stored on the adapted objects them selves.  The
component storing the shared persistent state can register one of it's
instance methods as the adapter factory which will look up the
necessary persistent state on self.</p>
<p>Register the persistent factory wrapped instance method as an adapter
factory.</p>
<blockquote>
<pre class="doctest-block">&gt;&gt;&gt; component.provideAdapter(factory=baz.factory)<br /></pre>
</blockquote>
<p>The method implements IBar.</p>
<blockquote>
<pre class="doctest-block">&gt;&gt;&gt; tuple(interface.implementedBy(baz.factory))<br />(&lt;InterfaceClass z3c.persistentfactory.testing.IBar&gt;,)<br /></pre>
</blockquote>
<p>When the adapter is looked up, the metod is called with the object to
be adapted as an argument.</p>
<blockquote>
<pre class="doctest-block">&gt;&gt;&gt; result = component.getAdapter(foo, testing.IBar)<br />Called &lt;bound method Baz.factory of<br />&lt;z3c.persistentfactory.testing.Baz object at ...&gt;&gt;<br />  args: (&lt;z3c.persistentfactory.testing.Foo object at ...&gt;,)<br />  kwargs: {}<br />&gt;&gt;&gt; result<br />(&lt;bound method Baz.factory of<br /> &lt;z3c.persistentfactory.testing.Baz object at ...&gt;&gt;,<br /> (&lt;z3c.persistentfactory.testing.Foo object at ...&gt;,), {})<br /></pre>
</blockquote>
</div>
<div class="section">
<h2><a id="changelog" name="changelog"></a></h2>
</div>
<p>&nbsp;</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-11-23T02:06:50Z</dc:date>
    
    <dc:modified>2008-11-23T02:06:50Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/z3c.gibberish">
    <title>z3c.gibberish</title>
    <link>http://rpatterson.net/software/z3c.gibberish</link>
    <description>CSV files of random dictionary words</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I needed to generate random verbiage that still reflected indexing performance somewhat realistically for a <a title="JMeter" class="internal-link" href="resolveuid/042f556c5de1331e399dec63b2e06c04">JMeter</a> test plan I built for a <a title="Undisclosed Startup" class="internal-link" href="resolveuid/d0d96fcbf5b042ccf0f7fb1c9cb2a866">project</a> with <a title="Jazkarta" class="internal-link" href="resolveuid/ca286704cbdff6d0c933a731c78b7590">Jazkarta</a>.&nbsp; As such, I wanted something other than random strings, I wanted real words but random selection. I wrote <a class="external-link" href="http://cheeseshop.python.org/pypi/z3c.gibberish/">z3c.gibberish</a> to do this.</p>
<p>There are a couple improvements I'd like to make to z3c.gibberish given interest and time:</p>
<h3>Weighted Word Frequency</h3>
<p>I'd like to improve z3c.gibberish to use a weighted random selection so that more common words are selected more often.</p>
<p>On further thought, it would probably be best to support this by using a dictionary that repeats words to represent frequency.&nbsp; Maybe z3c.gibberish could be extended to take a normal dictionary and a file representing weights and output a weighted dictionary to be used for subsequent runs of z3c.gibberish.</p>
<h3>Optimized Row Handling<br /></h3>
<p>I could also make it more efficient by pre-assembling a list of dictionary indexes for each row and then assembling the row by retrieving the words corresponding to the index in order to avoid repeatedly iterating through the dictionary for each row/cell.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-11-23T02:07:09Z</dc:date>
    
    <dc:modified>2008-11-23T02:07:09Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/z3c.recipe.ldap">
    <title>z3c.recipe.ldap</title>
    <link>http://rpatterson.net/software/z3c.recipe.ldap</link>
    <description>deploy an OpenLDAP server</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a class="external-link" href="http://svn.zope.org/z3c.recipe.ldap/trunk/">z3c.recipe.ldap</a> is a <a title="zc.buildout" class="internal-link" href="resolveuid/a9ad370cb22188becaa79fcf480d8538">zc.buildout</a> recipe I wrote for <a title="Jazkarta" class="internal-link" href="resolveuid/ca286704cbdff6d0c933a731c78b7590">Jazkarta</a> while working on an <a title="Undisclosed Startup" class="internal-link" href="resolveuid/d0d96fcbf5b042ccf0f7fb1c9cb2a866">internet startup project</a>.&nbsp; It can be used to deploy an OpenLDAP server.  More specifically it provides for initializing an LDAP
database from an LDIF file and for setting up an LDAP instance in the
buildout.  This recipe can also be used to provide an isolated LDAP
instance as a test fixture.<a id="how-to-use-z3c-recipe-ldap" class="toc-backref" name="how-to-use-z3c-recipe-ldap" href="http://api.rst2a.com/1.0/rst2/html?uri=http%3A%2F%2Fsvn.zope.org%2F*checkout*%2Fz3c.recipe.ldap%2Ftrunk%2Fz3c%2Frecipe%2Fldap%2Fdocs%2FREADME.txt&style=zope#id4"></a></p>
<p>I'd like to complete <a title="z3c.recipe.subprocess" class="internal-link" href="resolveuid/6d84cd205f5eab9e79f3f22657223589">z3c.recipe.subprocess</a> and port this package to that.&nbsp; It does, however, work just fine now.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Front Page</dc:subject>
    
    
      <dc:subject>Planet Plone</dc:subject>
    
    
      <dc:subject>Planet Zope</dc:subject>
    
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2008-11-23T02:07:14Z</dc:date>
    
    <dc:modified>2008-11-23T02:07:14Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/zc.buildout">
    <title>zc.buildout</title>
    <link>http://rpatterson.net/software/zc.buildout</link>
    <description>Contributed fixes</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>I've contributed <a class="external-link" href="https://bugs.launchpad.net/zc.buildout/+bug/151820">fixes</a> to <a class="external-link" href="http://cheeseshop.python.org/pypi/zc.buildout">zc.buildout</a>.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2007-12-21T09:21:38Z</dc:date>
    
    <dc:modified>2007-12-21T09:21:38Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>


  <item rdf:about="http://rpatterson.net/software/cmfplacefulworkflow">
    <title>Products.CMFPlacefulWorkflow</title>
    <link>http://rpatterson.net/software/cmfplacefulworkflow</link>
    <description>GenericSetup export and import handlers</description>
    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>I contributed <a class="external-link" href="http://plone.org/products/cmfplacefulworkflow">CMFPlacefulWorkflow</a> <a class="external-link" href="http://dev.plone.org/collective/changeset/52456">export and import handlers</a> for the <a title="Humanities Research Network" class="internal-link" href="resolveuid/bccfa7798fa67a6dc4f5d9a597c62634">HRN</a> project with <a title="Jazkarta" class="internal-link" href="resolveuid/ca286704cbdff6d0c933a731c78b7590">Jazkarta</a>.</p>
]]></content:encoded>
    <dc:publisher>No publisher</dc:publisher>
    <dc:creator>Ross Patterson</dc:creator>
    <dc:rights></dc:rights>
    
      <dc:subject>Software</dc:subject>
    
    <dc:date>2007-12-21T06:41:45Z</dc:date>
    
    <dc:modified>2007-12-21T06:41:45Z</dc:modified>
    <dc:type>News Item</dc:type>
  </item>





</rdf:RDF>
