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




    



<channel rdf:about="http://rpatterson.net/blog/aggregator/RSS">
  <title>Blog</title>
  <link>http://rpatterson.net</link>
  
  <description>
    
       Notes, findings, and ideas
       
  </description> 

  
  
            <syn:updatePeriod>daily</syn:updatePeriod>
            <syn:updateFrequency>1</syn:updateFrequency>
            <syn:updateBase>2007-12-20T00:21:18Z</syn:updateBase>
        
  
  <image rdf:resource="http://rpatterson.net/logo.gif"/>

  <items>
    <rdf:Seq>
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/evaluating-add-ons"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/balancing-dry-and-readability"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/community-introspection"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/nonprofit-software-development-summit"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/running-tests-in-egg-buildouts"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/my-borrowed-world-plone-day"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/cloud-busting"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/fine-grained-pm-on-small-projects"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/testbrowser-redirects-with-fragments"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/re-using-and-multiplexing-ssh"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/user-name-with-spaces-and-psvn.el"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/strange-critters"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/foxglove"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/eagle-rock-view"/>
        
        
            <rdf:li rdf:resource="http://rpatterson.net/blog/adding-testbrowser-form-inputs"/>
        
    </rdf:Seq>
  </items>

</channel>

    <item rdf:about="http://rpatterson.net/blog/evaluating-add-ons">        <title>Evaluating Add-Ons - What is the risk of adding a given dependency? </title>        <link>http://rpatterson.net/blog/evaluating-add-ons</link>        <description>&lt;p&gt;As often happens, a client asked me about adding a given package to
their buildout.  I just realized that I have a standard response to
this so that might be something worth documenting for the wider
community of admins and integrators.  My criteria are as follows
roughly in order of priority:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Good backing:&lt;/p&gt;
&lt;p&gt;Find the author or maintainer on the plone.org/products page or
on PyPI.  Are they a company or individual that is widely known
in the community?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Recent versions supported:&lt;/p&gt;
&lt;p&gt;Does the add-on support recent versions of its own dependencies?
For a Plone package today this means checking if it support
Plone 3.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Final release:&lt;/p&gt;
&lt;p&gt;Does the package have a final release that supports recent
versions of its dependencies?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Released as an egg on a package index:&lt;/p&gt;
&lt;p&gt;Is the add-on packaged as an egg and available on an
easy_install accessible index such as PyPI?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Test coverage should, of course, be criteria #1.  Sadly, we don't have
a good enough test isolation story with ZTC and PTC, test failures in
the client's buildout don't necessarily mean the add-on is broken.  I
know there's been talk about integrating test coverage data into
plone.org/products but it's not here yet.  The holy grail would be
some sort of integration with distutils/setuptools.  It would be great
if I could do &amp;quot;python setup.py test --coverage&amp;quot; so that a subsequent
&amp;quot;python setup.py register sdist upload&amp;quot; would incorporate the coverage
data into the release meta-data such that it would be reported on the
PyPI page.  Certainly any such solution could be circumvented by the
releaser, but I think that would be very rare, that it would more
often encourage more maintainers to have good test coverage and this
would be a huge win overall.&lt;/p&gt;
&lt;p&gt;It's also interesting to note that I find recent version support more
indicative of risk than final release status.  This comes from
experience.  I've worked on too many projects of all sizes that had
production sites running release candidates, betas, alphas, and even
some development versions.  One conclusion would be that this means
that the software is of poor quality.  I don't think that's it.  I
think it's that we, as a software ecosystem, are bad at releasing.
Now eggs are certainly helping with this, but I think we also need to
start an aggressive honor/shame (carrot/stick) campaign about
releasing.  Actually, maybe we should have an honor/shame campaign
about add-ons in general.  Perhaps a montly post to planet plone and
the mailing list with a Hall of Fame and a Hall of Shame?  :)
Something that considers release status (how long has it been since
that beta release?  3 months?  Maybe you can release a final
version?), test coverage, and meta-data cleanliness, etc.&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-12-01T19:52:46Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/balancing-dry-and-readability">        <title>Balancing DRY and Readability - Some complexity belongs in your editor/IDE</title>        <link>http://rpatterson.net/blog/balancing-dry-and-readability</link>        <description>&lt;p&gt;I was writing a combination of setuphandlers and functional test
fixtures recently when I found myself doing something noteworthy.  I
was converting both apparatus from a set of loops over content type
names and prefixes to a few utility functions with lots of repetitious
calls.  Why was I violating DRY?  Because I couldn't make sense of
things!  Oh yeah, DRY should never compromise readability.  :)&lt;/p&gt;
&lt;p&gt;It's definitely possible to take DRY too far leading to such
slap-your-forehead moments as this.  I think that setup code, whether
for install or a test fixture, is particularly prone to this.  I've
both written a lot of setup code and read a lot of it in the wild
where a bunch of complex structure is introduced in the name of DRY.&lt;/p&gt;
&lt;p&gt;What I ended up doing was writing a small number of utility functions
whose call signatures were intuitive and readable.  Then I used a
bunch of complex &amp;quot;M-x query-replace-regexp&amp;quot; commands in Emacs to convert the
complicated structure into a simple, readable, flat, but nonetheless
very repetitious function calls.  Later when I needed additional set
up, I used the same complex editor command to accomplish the task.&lt;/p&gt;
&lt;p&gt;It occurred to me that what I was doing was taking unreadable
complexity out of code where I, let alone someone else, couldn't
remember or read what was going on, and i was moving it into my tools.
My tools I use every day so I remember how to manage the complexity
and I'm not condemning others to learn the complexity when I put it
there.  I think this makes a simple guideline for balancing DRY with
readability.  Some complexity belongs in your tool usage, not in the
code.&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                    <dc:subject>Planet Zope</dc:subject>                <dc:date>2008-11-25T15:13:19Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/community-introspection">        <title>Community Introspection - Same risks and rewards as for the individual</title>        <link>http://rpatterson.net/blog/community-introspection</link>        <description>&lt;p&gt;One of the things I love about being a member of the Plone community,
is our capacity for introspection.  Like all things, however, it has
its place and its limits.  I've been contemplating how we might find
those limits.&lt;/p&gt;
&lt;p&gt;At the recent &lt;a class="reference" href="http://rpatterson.net/blog/my-borrowed-world-plone-day"&gt;World Plone Day&lt;/a&gt;, I had the
opportunity to hear &lt;a class="reference" href="http://snowwrites.com/"&gt;Donna Snow's&lt;/a&gt; story in
more detail.  She was one of the &amp;quot;old school&amp;quot; skinners who was hurt by
the Plone 3 changes.  She has been assimilated.  :) She's now a
stronger advocate than ever.  That's a great example of how the Plone
communities' introspection is an asset.  We didn't flinch, we
incorporated.&lt;/p&gt;
&lt;p&gt;OTOH, sometimes I think our community could have a bit more patience
with the significant though perhaps unsexy transitions that the Plone
stack is in the middle of.  We're no longer the new kid on the block and
so we lose some of our sex appeal.  We're now a successful project whose
greatest challenge now may well be to gracefully manage the history of
that success while we continue to improve.&lt;/p&gt;
&lt;p&gt;It may not be so scintillating to participate in keeping a successful
project nimble as it was to participate in the rise of a shining new
success.  I know, however, that I at least will be very pleased with
my time if I'm now a part of the subtler success of standing up well
to new challenges and challengers.&lt;/p&gt;
&lt;p&gt;I very much value our community's capacity to make constructive use of
criticism and to be critical of ourselves.  I just think it would help
morale to also raise enthusiasm while we're doing so.&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-11-22T03:15:54Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/nonprofit-software-development-summit">        <title>Nonprofit Software Development Summit - 3 brilliant days with cracked out LAMP folks</title>        <link>http://rpatterson.net/blog/nonprofit-software-development-summit</link>        <description>&lt;p&gt;I got back from the &lt;a class="reference" href="http://www.aspirationtech.org/events/devsummit08"&gt;2008 Nonprofit Software Development Summit&lt;/a&gt; in Oakland, CA
last night.  I had a total blast.  It was simultaneously intense and
relaxed which is an impressive achievement.  It was also very
surprising for someone who doesn't expect a tech conference to be
intense.  I generally pride myself on endless energy.  The last day of
the conference I didn't even have the energy for the final round of
libations.  I drove straight home and collapsed.  :)&lt;/p&gt;
&lt;p&gt;I don't want to offend other conferences or formats, but I hadn't
realized how much I &lt;em&gt;don't&lt;/em&gt; enjoy the traditional conference format.
Now that I've experienced such an event where I was genuinely and
organically engaged for 80-90% of the time, I recognize that I have
always been very bored at other conferences.  Nate tells me that bar
camps or other events with a tendency to use the term &amp;quot;camp&amp;quot; have a
similar format.  Needless to say, I'll be keeping an eye out for such
events.&lt;/p&gt;
&lt;p&gt;This event didn't allow laptops at any of the sessions or main
gatherings, and I didn't even miss it.  I'd be dead of boredom at a
traditional conference if my laptop were forbidden.  I certainly
didn't miss PowerPoint, which was also forbidden.  This was also the
first conference I presented at.  It occurs to me how miserable it
would have been to present to a room of downward facing eyes and
tippity-tappity keyboards.  When I thought about it further, I
realized it's similarly miserable to sit in a session dealing with the
conflict between boredom and the genuine desire to be engaged for both
the presenter's sake and mine.  The way this event handled this
conflict was to limit presenters to 5-10 minutes of intro time after
which it was all group discussion.  It was very enjoyable and engaging
both as an attendee and as a presenter.  I assume all this is obvious
to those who already enjoy this format.  :)&lt;/p&gt;
&lt;p&gt;I gave two presentation.  The first was a contemplative session on
&lt;a class="reference" href="http://devsummit08.aspirationtech.org/index.php/Best_Practices_for_Plone_Performance"&gt;Risks and Opportunities of Cloud Computing&lt;/a&gt;.
I wanted to see how much traction my thoughts would get when it comes
to adopting CC or PAAS while also building in structure to protect
code, data, and vulnerable clients such as non-profit organizations.
I found that most are still thinking about the question in terms of
either &amp;quot;get over it and get on board&amp;quot; or &amp;quot;you'll get my app into the
cloud when you pry it out of my cold, dead hands&amp;quot; or &amp;quot;you'll never
find my app or data stuffed in my mattress&amp;quot;.  I want both protection
from the risks and I want to take advantage of the opportunities.  My
hope is that open source frameworks that provide abstractions of core
cloud services along with additional libraries offering solutions to
common needs may be able to realize cloud apps that can be feasibly
ported to other providers.  These frameworks could then be a fulcrum
for leverage to keep providers honest.  This idea gained next to no
traction with my attendees who wanted to go in other directions.
This, in and of itself, is informative.  If I'm wrong about using
frameworks, or if I'm right and few are ready to move in that
direction, either way there's a lot of work ahead.&lt;/p&gt;
&lt;p&gt;For my second presentation I thought I'd play to my strengths: &lt;a class="reference" href="http://devsummit08.aspirationtech.org/index.php/Best_Practices_for_Plone_Performance"&gt;Best
Practices for Plone Performance&lt;/a&gt;.
Of course, I proposed this talk having never attended this conference
before.  The attendees of this conference were, I'd guess, 90% LAMP
people which means the CMS world was dominated by &lt;a class="reference" href="http://drupal.org"&gt;Drupal&lt;/a&gt;.  &lt;a class="reference" href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt; was a
distant runner up.  There were also a fair number of Ruby, and Rails,
people there.  The only people I met using &lt;a class="reference" href="http://python.org/"&gt;Python&lt;/a&gt;, &lt;a class="reference" href="http://zope.org/"&gt;Zope&lt;/a&gt;, or &lt;a class="reference" href="http://plone.org/"&gt;Plone&lt;/a&gt; were &lt;a class="reference" href="http://www.nateaune.com/"&gt;Nate Aune&lt;/a&gt; and
the good people from &lt;a class="reference" href="http://topp.openplans.org/"&gt;The Open Planning Project&lt;/a&gt;.  As such, this talk wasn't overly
attended.  :) Just the same, a potential new Plone adopter was there
and it was interesting to compare scaling wisdom between camps.  From
what I could glean, Plone has a much better scaling story in many
senses.  It's also worthy of note that nearly every time I mentioned
Plone, the person I was talking to would mention ONE/Northwest.  They
have impressive recognition in the community.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference" href="http://devsummit08.aspirationtech.org/index.php/SpeedGeeking"&gt;Speed Geeking&lt;/a&gt; is a
great for demonstrating technology and evangelizing or advocating all
at once.  This format allows a presenter to convey their enthusiasm
for a project where the audience is consumers while eliminating much
of the boredom that typically occurs when an audience is compelled to
listen to one person talk.  I found myself wishing that I could cover
the very rich Plone feature set in such a limited 3-4 minute format.
If I've noted one thing about what impresses people about Plone, it's
how much they get OOTB.  If you can get someone to pay attention long
enough to cover the feature set, they're almost always surprised.  I
can't count the times I've heard, &amp;quot;I had no idea Plone could do so
much.&amp;quot;  Unfortunately, you can't demo all these features in 3-4
minutes.  I was thinking it would be good to have a slide show amongst
the Plone marketing materials that could cover &amp;quot;What Plone can do&amp;quot; in
3-4 minutes.  Anyone interested in working on that with me?&lt;/p&gt;
&lt;p&gt;The LAMP people at the conference were all very open and there was a
very pleasant absence of evangelism.  I even noted that as the
conference went on, everyone seemed to make a point of adding Plone to
their list of token CMSes when speaking as they became more aware of
our presence.  All told, I think it was very productive for all sides
and so much of that is due to the community of the event.  Everyone
there had gobs of energy, was genuinely open and friendly, and
everyone seemed to be passionately committed to exciting and
productive projects.  I started as an attendee, came to see myself as
a guest, and left feeling as a member.  Quite an achievement indeed.&lt;/p&gt;
&lt;p&gt;I'll blog more later about the sessions I attended.&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>devsummit08</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-11-21T03:45:34Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/running-tests-in-egg-buildouts">        <title>Running Tests in Egg Buildouts - A quick note about a gotcha with plone.recipe.zope2instance.ctl</title>        <link>http://rpatterson.net/blog/running-tests-in-egg-buildouts</link>        <description>
&lt;p&gt;Recently I made an egg of mine into a buildout for self-contained testing and I ran into a gotcha that took me too much time to figure out, so I thought I'd document it for others.&lt;/p&gt;
&lt;p&gt;The plone.recipe.zope2instance.ctl test runner excludes the buildout root from the test paths.  It gives the reason in the comments:&lt;/p&gt;
&lt;pre&gt;# XXX Somehow the buildout root gets on the sys.path. This causes
# weird problems, as packages like src.plone.portlets.plone.portlets
# are found by the testrunner
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Since a ZopeSkel generated egg doesn't create a "src" directory to contain the actuall python packages, the egg root would need to be on the test path.  When the egg is made into a buildout then all these factors collide to make the egg I want to test invisible to the test runner.&lt;/p&gt;
&lt;p&gt;I worked around this by moving the actual python packages to a "src" directory.  I always thought this was more proper anyways.  Maybe ZopeSkel should be changed.  At any rate, here's the setup.py additions that were necessary:&lt;/p&gt;
&lt;pre&gt;packages=find_packages('src', exclude=['ez_setup']),
package_dir = {'':'src'},
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Hope this saves some trouble!&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-11-15T04:25:58Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/my-borrowed-world-plone-day">        <title>My Borrowed World Plone Day - How I crashed Donna Snow's presentation</title>        <link>http://rpatterson.net/blog/my-borrowed-world-plone-day</link>        <description>
&lt;p&gt;I'm spending my World Plone Day at &lt;a class="external-link" href="http://snowwrites.com/2008/11/08/world-plone-day-2008-introspection/"&gt;Donna Snow's presentations&lt;/a&gt; at Sunnyvale, CA.&amp;nbsp; It's been a blast.&lt;/p&gt;
&lt;p&gt;Donna started out describing her participation in the Plone community and her company, &lt;a class="external-link" href="http://www.csquaredtech.com/"&gt;C Squared Enterprises&lt;/a&gt; (C2E).&amp;nbsp; Then she moved onto a &lt;a class="external-link" href="http://www.slideshare.net/ckwilde/world-plone-day-2008-presentation-674506/"&gt;slideshow&lt;/a&gt; with a good overview of what Plone is and some of the best reasons for adopting it.&amp;nbsp; Next she gave a live demonstration of a Plone 3.1.6 site and managed to convey a lot of the very feature rich set that Plone brings out of the box keeping everyone engaged the whole while.&amp;nbsp; An excellent presentation.&lt;/p&gt;
&lt;p&gt;Donna graciously invited me to make some contributions to the presentation from a developer's perspective.&amp;nbsp; It gave me the chance to talk about some of the technical underpinnings of the Plone stack I most admire.&amp;nbsp; The internationalization and translation capabilities seemed to get a lot of favor, big surprise there.&amp;nbsp; :)&amp;nbsp; I listed WSGI&amp;nbsp; and Deliverance theming as some of the more likely future directions for Plone and was surprised how much interest that got.&amp;nbsp; I definitely enjoyed participating.&lt;/p&gt;
&lt;p&gt;Here are some of the questions asked:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;What other CMS are there?&lt;/li&gt;&lt;li&gt;What is Plone's market share or adoption rate?&amp;nbsp; Is it growing or shrinking?&amp;nbsp; How does it compare with other CMS?&lt;/li&gt;&lt;li&gt;How is translation done?&lt;/li&gt;&lt;li&gt;Are live backups possible?&amp;nbsp; Can they be done TTW?&lt;/li&gt;&lt;li&gt;Can we see the developers view of a template?&lt;/li&gt;&lt;li&gt;I heard Plone is slow?&lt;/li&gt;&lt;li&gt;What's this Zope 2 and Zope 3 stuff?&lt;/li&gt;&lt;li&gt;Can you make the calendar portlet start the week with Sunday?&lt;/li&gt;&lt;li&gt;What is the granularity of the security framework?&lt;/li&gt;&lt;li&gt;How can I integrate external database queries with Plone?&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;It was a first for me sitting in a room fielding questions from people who were doing their initial evaluation of Plone.&amp;nbsp; While none of the questions were surprising, it was nonetheless very informative.&lt;/p&gt;
&lt;p&gt;It was very generous of Donna and C2E to pay for the space and the materials and to donate all the time.&amp;nbsp; I think it was worth it.&amp;nbsp; Best quote of the day?&lt;/p&gt;
&lt;p class="callout"&gt;I'm a convert.&lt;/p&gt;
&lt;p&gt;It looks like the second session is turning out to be more of an installfest.&amp;nbsp; :)&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>World Plone Day 2008</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-11-07T22:05:55Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/cloud-busting">        <title>Cloud Busting - What does it mean to be a good cloud citizen?</title>        <link>http://rpatterson.net/blog/cloud-busting</link>        <description>
&lt;p&gt;I know I'm not alone, but I've been thinking a lot recently about what the cloud means for rich web applications like CMS's such as &lt;a class="external-link" href="http://plone.org"&gt;Plone&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Firstly, I find &lt;a class="external-link" href="http://appengine.google.com/"&gt;Google App Engine&lt;/a&gt; (GAE) much more inspiring than Amazon's &lt;a class="external-link" href="http://aws.amazon.com/ec2/"&gt;Elastic Compute Cloud&lt;/a&gt; (EC2) when it comes to thinking about cloud computing.&amp;nbsp; Kinda funny considering that EC2 actually has "cloud" in its name while GAE doesn't.&lt;/p&gt;
&lt;p&gt;It seems to me that EC2 isn't really a cloud.&amp;nbsp; For my money, EC2 is just a really big virtual hosting provider that has done a great job of limiting hosting costs by bringing efficiency to client relationships and expectations.&amp;nbsp; They do this by simultaneously limiting their responsibility and clearly defining their remaining responsibility in accessible APIs.&amp;nbsp; They exploit a very interesting and relatively new technology sweet spot to do this, virtualization. This has the potential to become the *foundation* for cloud computing,but is not cloud computing in itself.&amp;nbsp; The strategy seems to be to provide the foundation, open up the technology race, and wait and see who succeeds in building good clouds on that foundation.&amp;nbsp; I kinda like this strategy, but I do see some problems with it.&amp;nbsp; Of course, mostly,I just don't like thinking about hardware, virtualized or no.&amp;nbsp; :)&lt;/p&gt;
&lt;p&gt;Firstly, computing in the cloud is definitely going to require changes from the code that operates in the cloud.&amp;nbsp; EC2 enables application builders to construct large distributed web applications without ever making their code into good cloud citizens.&amp;nbsp; That my not be a good thing.&amp;nbsp; Similarly, various parties are building true cloud frameworks on top of EC2.&amp;nbsp; It may be that an inferior cloud framework places fewer requirements on the hosted code, thus gaining more adopters,thus starving better cloud frameworks.&lt;/p&gt;
&lt;p&gt;GAE seems to come at the cloud from the other direction.&amp;nbsp; Rather than providing all options on something that isn't yet a cloud as EC2 does,GAE provides a true cloud but with very limited options.&amp;nbsp; GAE too exploits a technology sweet spot, but a very mature and well established one, Python.&amp;nbsp; The strategy there would seem to be to open up the technology race in the other direction inviting framework/application developers and GAE to come together over time. That is, framework/application developers will make their code better cloud citizens guided by the restrictions of a true cloud and GAE will become richer and less restrictive as Google sees where to put its resources in terms of extensions or flexibility.&amp;nbsp; I've heard GAE called a platform for toy applications.&amp;nbsp; It seems to me it's not so much a toy platform as a very serious platform in its adolescence.&lt;/p&gt;
&lt;p&gt;Now, what about large, feature rich applications like CMS's such as Plone?&amp;nbsp; The ideal large, feature rich application still has a lot of code, the code that implements and integrates all those features.&amp;nbsp; As such, I'm going to set aside the question of whether or not a given large, feature rich application is *too* large, just for the moment. Such waste definitely becomes even more painful in the cloud and good cloud citizens should definitely continually evaluate their code waste even more vigilantly, it's just not what I want to consider right now.&lt;/p&gt;
&lt;p&gt;I think specialization is going to be one of the most important aspects of cloud computing.&amp;nbsp; In order for a cloud to be flexible and transparent while simultaneously achieving responsiveness and efficiency, applications are going to have to cooperate with the cloud so that requests can be handled by portions of the cloud that are already more or less familiar with handling those requests.&amp;nbsp; Good cloud citizens will have to factor themselves such a way as to support this.&amp;nbsp; Once code running on the cloud has factored itself into specializable requests, the cloud can be left to do the specialization as they see fit.&amp;nbsp; The cloud provider is the party most interested to squeeze the most possible efficiency out of the cloud so the implementation of specialization should really be left to them.&amp;nbsp; Of course, once again, mostly I just don't want to think about specialization, too close to the dreaded hardware.&amp;nbsp; :)&lt;/p&gt;
&lt;p&gt;AJAX to the rescue!&amp;nbsp; It seems like AJAX first burst onto the scene to improve client side performance.&amp;nbsp; If you replaced a portion of the DOM with the results of an XMLHttpRequest, you could avoid the page reload time cost incurred by the *browser* and the cost of the user experience disjoint incurred when their browser renders a new page. Using AJAX to compose a page from multiple requests is, however,potentially *more* valuable to specialize things on the *server* side.&amp;nbsp; The win here is not so much the AJAX on the client side as is the capacity to break a page up into multiple specializable requests for the server side.&lt;/p&gt;
&lt;p&gt;Specialization becomes most important with large, feature rich applications like CMS's.&amp;nbsp; Without specialization, the application eventually requires too much in the way of resources to handle any given request and becomes a very bad cloud citizen.&lt;/p&gt;
&lt;p&gt;Effective specialization also requires that applications be frugal about how much of their code needs to be loaded to serve a given request.&amp;nbsp; This cuts down on memory consumption but perhaps more importantly, it cuts down on startup time when an portion of the cloud that is not yet specialized is called upon to serve a new request.&amp;nbsp; It seems like any large application worth it's salt uses some sort of modular registry (plugins, components, whatever).&amp;nbsp; I think it's vital that any such registry that hopes to be a good cloud citizen shouldn't load the code behind any given lookup until the lookup first occurs.&lt;/p&gt;
&lt;p&gt;So lets talk about Plone.&amp;nbsp; At the moment, Plone has a lot of work to do before it becomes a good cloud citizen, but it seems like it will be possible to get there.&amp;nbsp; I will be blogging about this in more detail in the near future, but here's a sketch.&lt;/p&gt;
&lt;p&gt;I wrote a small test that ran against an *existing* Plone trunk site and simply loaded the front page in a testbrowser.&amp;nbsp; I confirmed that zope.testing coverage reporting does not report on modules that aren't imported as a part of the test run.&amp;nbsp; Then I ran that test with a coverage report to get a sense of how much of the code that is imported for Plone startup is actually used to serve that page. Finally, I removed the coverage numbers for all Python standard modules and any third party dependencies in order to get a sense of the import waste in the Zope/CMF/Plone stack:&lt;/p&gt;
&lt;table class="plain"&gt;

&lt;tr&gt;
&lt;th&gt;lines&lt;/th&gt;
&lt;th&gt;cov%&lt;/th&gt;
&lt;th&gt;lines uncovered&lt;/th&gt;
&lt;th&gt;lines covered&lt;/th&gt;
&lt;/tr&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;167,752&lt;/td&gt;
&lt;td&gt;40.00%&lt;/td&gt;
&lt;td&gt;100,643.21&lt;/td&gt;
&lt;td&gt;67,108.79&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Firstly, 67k lines of code to serve up the front page seems like too much, but we're aware of that.&amp;nbsp; The limbo between the more monolithic Zope 2 and the much more elegant successor Zope 3 is probably a significant part of that.&amp;nbsp; I'm going to do some more detailed examination of the coverage report, but here is the CSV of the simple coverage numbers for those interested.&lt;/p&gt;
&lt;p&gt;The thing I find most interesting is how much is imported code isn't used.&amp;nbsp; I've been thinking about this for a while.&amp;nbsp; While some of this is certainly import waste from unused portions of the more monolithic Zope 2 and Archetypes stacks, I think much of it may also come from ZCML and the Zope Component Architecture.&lt;/p&gt;
&lt;p&gt;The ZCA gives us a wonderful registry for a very modular architecture but using the ZCA requires importing all the code for everything registered.&amp;nbsp; Some significant advantage might be had by using a ZCA registry that didn't import the code until the first time that given lookup is performed.&lt;/p&gt;
&lt;p&gt;There is an interesting exception, local site managers.&amp;nbsp; Since local site managers store their registry in pickles, it may be that the code behind the component isn't loaded until the lookup unpickles the registration.&amp;nbsp; I haven't confirmed this, but even if this isn't the case and the whole registry is unpickled at once, it might not be too hard to make each registration its own pickle.&amp;nbsp; Marius &lt;a class="external-link" href="http://hannosch.blogspot.com/2007/10/performance-sprint-warmup.html#c1794123526487180805"&gt;mentioned&lt;/a&gt; an effort to reduce ZCML load time by pickling the configuration actions.&amp;nbsp; Maybe it's possible to direct the ZCML actions at a local site manager instead which could then be persisted and used as the global site manager.&amp;nbsp; Then loading the ZCML at startup would be unnecessary.&amp;nbsp; In essence, this would mean *compiling* ZCML into a site manager pickle before deploying the applictaion to the cloud.&amp;nbsp; This notion of compiling configuration for deployment brushing shoulders with pickles has inspired some other interesting notions I hope to blog more about soon.&lt;/p&gt;
&lt;p&gt;As for AJAX, Viewlets seem like an ideal framework to exploit for AJAX composed request specialization.&amp;nbsp; I might be feasible to replace viewlet renderers with ones that insert JavaScript into the containing page which will load the viewlets in separate, specializable requests. Someone's already &lt;a class="external-link" href="http://play.pixelblaster.ro/blog/archive/2007/02/28/a-zope-3-ajax-viewlet-manager"&gt;tried it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As for Plone on GAE, there are other, possibly larger hurdles, not the least of which is Zope's use of C extensions.&amp;nbsp; I know work has already been done to lessen dependency on Acquisition wrappers, but I don't know how close that brings us to eliminating the C extensions there. As for persistent, I don't know if what is done in persistent.cPersistence can be done in python but I have heard noises that the effort to port ZODB to Jython may yield fruit here.&amp;nbsp; It also seems like it might be possible to use some of the ORM libraries out there to implement a python only version of BTrees that uses tables on the backend.&amp;nbsp; At any rate, all of this really is pie in the sky at this point, but I have a 10% Pie in the Sky Manifesto and an awful lot of good things have started with such thinking.&amp;nbsp; I'll be blogging on this more later.&lt;/p&gt;
&lt;p&gt;At this point I'm more interested in what computing in the cloud means in the more general senses detailed above but I'd love to hear any thoughts on any of this.&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-10-23T05:43:52Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/fine-grained-pm-on-small-projects">        <title>Fine-Grained PM on Small Projects - Increasing control while reducing project management costs</title>        <link>http://rpatterson.net/blog/fine-grained-pm-on-small-projects</link>        <description>
&lt;p&gt;I made a mistake recently that I've made a few times in the past.&amp;nbsp; Time to change something.&amp;nbsp; :)&lt;/p&gt;
&lt;p&gt;A small project I was working on had transitioned to a phase where very little of my time was required.&amp;nbsp; Unfortunately, there was still a whole lot of email correspondence flying around.&amp;nbsp; I wanted to avoid putting much time into PM when it would be disproportionate to the amount of development time.&amp;nbsp; Several of the emails contained explicit direction some of which superseded others.&amp;nbsp; At one point, I got it wrong in my head and did some work out of priority order.&amp;nbsp; In this case the situation was easily remedied but I'd really like to have a more robust approach to this problem before I make the same mistake when it's not so easily remedied.&lt;/p&gt;
&lt;p&gt;For large projects an issue tracker is a great PM tool.&amp;nbsp; A priority field can be used to order tickets.&amp;nbsp; Since so much time is being put into so many tickets, it tends not to be valuable to have explicit ordering to the degree that tickets must be worked on in a completely linear order.&amp;nbsp; IOW, if ticket foo and ticket bar have the same priority, it tends not to be worthwhile to worry about which one to work on first given that the time for each is small next to the amount of time being put in on all tickets.&amp;nbsp; Every team member can just bookmark the link to the canonical report that tells them what tickets to work on in what order and PM time can be minimized.&lt;/p&gt;
&lt;p&gt;For small projects, however, things can be very different.&amp;nbsp; It is very important to have explicit ticket ordering, but more than that it is often very important to track other explicit and *arbitrary* direction on a per-team-member basis.&amp;nbsp; As such, an issue tracker isn't really a good match, even if it supported arbitrary ordering.&amp;nbsp; Email is both noisy and lossy unless an inefficient amount of time is put into tracking it.&lt;/p&gt;
&lt;p&gt;I was brainstorming on this with a favorite project manager, &lt;a class="external-link" href="http://www.linkedin.com/in/skleinfeldt"&gt;Sally Kleinfeldt&lt;/a&gt;, when she hit upon the embarrassingly simply solution.&amp;nbsp; Use a canonical shared document somewhere for each team member requiring direction that is narrative rather than structured in nature.&amp;nbsp; IOW, I get my own document that the client, the PM, and myself can edit which will always represent all of my current direction.&amp;nbsp; If there are other team members requiring direction, they should each get their own page.&lt;/p&gt;
&lt;p&gt;This document can link to particular tickets in the issue tracker to affect arbitrary explicit ordering along side any of the kind of arbitrary narrative direction that tends to be a part of small projects. Email can still be used to track when my direction changes, but never again will I have to spend a half hour digging through emails to double verify that my next and only task is to put 15 minutes into a small fix. I simply go to my page, and move on.&amp;nbsp; This document could be a google doc, a wiki page, a special ticket in the issue tracker, whatever, so long as it is canonical.&lt;/p&gt;
&lt;p&gt;It's very simple, and so probably has been in use before, but I'm nonetheless very excited about it as a way to improve efficiency on small projects.&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-10-03T18:58:14Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/testbrowser-redirects-with-fragments">        <title>Testbrowser Redirects with Fragments - Using zope.testbrowser when a redirect URL includes a fragment</title>        <link>http://rpatterson.net/blog/testbrowser-redirects-with-fragments</link>        <description>&lt;p&gt;I was trying to add functional test coverage for commenting on content when I kept getting 404 NotFound errors.&amp;nbsp; I tried it in a real browser and everything worked just fine.&amp;nbsp; After a little googling, I found an answer in &lt;a class="external-link" href="http://mail.zope.org/pipermail/zope3-dev/2006-June/019671.html"&gt;a post&lt;/a&gt; on the zope3-dev mailing list:&lt;/p&gt;
&lt;p class="discreet"&gt;Note that the fragment identifier is *never* going to be passed to the server by a "real" browser:  instead, the browser strips of the fragment part, submits the remainder of the URL to the server, and then does a search for the appropriate '&amp;lt;a name="bar"&amp;gt;' element *on the client side*.&lt;/p&gt;
&lt;p class="discreet"&gt;I'm not sure how this is pertinent to the problem you have found, but Zope will never traverse '#bar' or '%23bar' in the real world.&lt;/p&gt;
&lt;p&gt;It seems like maybe testbrowser should not send fragments to the underlying mechanize browser.&amp;nbsp; But failing that, for now I just add a note to my tests about why we expect a 404, NotFound error in our tests that we won't see in a real browser.&lt;/p&gt;
&lt;p&gt;Hope this saves someone else the search time.&amp;nbsp; :)&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                    <dc:subject>Planet Zope</dc:subject>                <dc:date>2008-08-09T00:29:35Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/re-using-and-multiplexing-ssh">        <title>Re-using SSH Connections - Automatic master SSH connections for sharing and multiplexing </title>        <link>http://rpatterson.net/blog/re-using-and-multiplexing-ssh</link>        <description>
&lt;p&gt;Yet again I've discovered that somethign I've been dreaming of forever already existed for just about that long.&amp;nbsp; :)&lt;/p&gt;
&lt;p&gt;I use SSH for so many things these days that the startup time for connections really begins to add up.&amp;nbsp; Enter &lt;a class="external-link" href="http://www.torchbox.com/blog/ssh_tips_2.html"&gt;OpenSSH connection sharing&lt;/a&gt;.&amp;nbsp; See that blog post for details.&amp;nbsp; Also see &lt;a class="external-link" href="http://svn.haxx.se/dev/archive-2008-07/0494.shtml"&gt;this thread&lt;/a&gt; on the SVN development list for details of a workaround for an svn+ssh issue.&lt;/p&gt;
&lt;p&gt;I was still left wanting, however.&amp;nbsp; The lion's share of the time I want to save re-using SSH connections is for svn+ssh.&amp;nbsp; The SVN workaround requires that I think enough ahead to start the master for every host I connect to.&amp;nbsp; I connect to a lot of hosts and they're constantly changing so I wanted something I didn't have to think about.&amp;nbsp; Also mildly annoying is the fact that the first SSH session to a host would become the master and couldn't be closed or killed without killing all slaves and, of course, killing the master.&lt;/p&gt;
&lt;p&gt;I wrote a wrapper for SSH that would start the master in the background if need be and then run the ssh command as a normal slave.&amp;nbsp; This solution allows the individual connection to close or be killed without affecting the master.&amp;nbsp; It also obviates the need for the svn+ssh workaround.&amp;nbsp; Enjoy:&lt;/p&gt;
&lt;pre&gt;#!/bin/sh
## Wrapper script for ssh that backgrounds the control master if one
## isn't already started.

## the real ssh
SSH="/usr/bin/ssh"

## optstring assembled from `man ssh`
optstring="+1246AaCfgKkMNnqsTtVvXxYb:c:D:e:F:i:L:l:m:O:o:p:R:S:w:"
## get ssh options
opts=`getopt -- "$optstring" "$@"`

## the non-option args follow "--"
## convert to an array of IFS separated strings
args=(${opts#*--})

## the host is the first non-option arg
## use eval to process the quoted strings returned by getopt
host=`eval echo ${args[0]}`

## if the master isn't running, start it in the background
$SSH -q -O check $host 2&amp;gt;/dev/null || $SSH -MNf $host

## replace ourselves with the reall ssh call
exec $SSH "$@"
&lt;/pre&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-07-26T07:07:22Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/user-name-with-spaces-and-psvn.el">        <title>Spaces in User Names and psvn.el - Handling SVN user names with spaces in emacs' svn-status.</title>        <link>http://rpatterson.net/blog/user-name-with-spaces-and-psvn.el</link>        <description>
&lt;p&gt;I recently started on a project using &lt;a class="external-link" href="http://svnbook.red-bean.com/en/1.4/svn-book.html#svn.serverconfig.svnserve.sshtricks.fixedcmd"&gt;svnserve's --tunnel-user&lt;/a&gt; option where many of the committers have user names with spaces.&amp;nbsp; Much to my chagrin, my beloved svn-status in emacs choked on those user names un able to tell where the user name ended and the filename began.&lt;/p&gt;
&lt;p&gt;Then I found a comment in the &lt;a class="external-link" href="http://xsteve.at/prg/emacs/psvn.el"&gt;current version of psvn.el&lt;/a&gt; detailing how to work around this.&amp;nbsp; Just be sure you have the current version on your load-path and add something like the following to your ~/.emacs:&lt;/p&gt;
&lt;pre&gt;(setq svn-user-names-including-blanks '(\"feng shui\" \"mister blank\"))
(add-hook 'svn-pre-parse-status-hook 'svn-status-parse-fixup-user-names-including-blanks)
&lt;/pre&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-07-25T17:38:22Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/strange-critters">        <title>Strange Critters - A few strange critters I ran into hiking</title>        <link>http://rpatterson.net/blog/strange-critters</link>        <description>
&lt;p&gt;Starting with the disclaimers, I'm not a photographer nor much of a
naturalist.&amp;nbsp; As a story teller, I love photography and hate
snapshots.&amp;nbsp; My hypocrisy justifies the photos below as "documentation"
which also serves as my excuse for their quality or lack there of.&amp;nbsp; I'm
an avid hiker because I love covering terrain.&amp;nbsp; I do love to look at
all the flora and fauna as I hike, I just know very little about it.&amp;nbsp;
So I'm making no claims that anything is special.&lt;/p&gt;
&lt;p&gt;Over the last few months of hiking I've run into a few strange critters and snapped some pretty crappy photos of them with my phone.&amp;nbsp; Anyone have any ideas what these are?&lt;/p&gt;
&lt;p&gt;Here's an oversize centipede-like bug found on Ridge Road in Big Basin.&amp;nbsp; It's hard to see, you might want to open the full sized image and zoom in.&lt;/p&gt;
&lt;p&gt;&lt;a title="Very Large Centipede Like Bug" class="internal-link" href="/blog/0603081315a.jpg"&gt;&lt;img class="image-inline" src="/blog/0603081315a.jpg/image_mini" alt="Very Large Centipede Like Bug" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also ran across a couple of small brown snakes or worms.&amp;nbsp; They were dead when I found them.&amp;nbsp; I don't know if these are the same critter or not.&lt;/p&gt;
&lt;p&gt;&lt;a title="Small Brown Snake" class="internal-link" href="/blog/0428081050.jpg"&gt;&lt;img class="image-inline image-inline" src="/blog/0428081050.jpg/image_mini" alt="Small Brown Snake" /&gt;&lt;/a&gt;&lt;a title="Small Brown Snake 2" class="internal-link" href="/blog/0612081759a.jpg"&gt;&lt;img class="image-inline" src="/blog/0612081759a.jpg/image_mini" alt="Small Brown Snake 2" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spider was so remarkable.&amp;nbsp; Unfortunately, the picture came out blurry.&amp;nbsp; Sorry!&lt;/p&gt;
&lt;p&gt;&lt;a title="Spider with Remarkable Coloring" class="internal-link" href="/blog/0606081416.jpg"&gt;&lt;img class="image-inline" src="/blog/0606081416.jpg/image_mini" alt="Spider with Remarkable Coloring" /&gt;&lt;/a&gt;&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>admin</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-06-30T03:29:37Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/foxglove">        <title>Foxglove - White foxglove from East Ridge Road in Big Basin.</title>        <link>http://rpatterson.net/blog/foxglove</link>        <description>
&lt;p&gt;Starting with the disclaimers, I'm not a photographer nor much of a naturalist.&amp;nbsp; As a story teller, I love photography and hate snapshots.&amp;nbsp; My hypocrisy justifies the photos below as "documentation" which also serves as my excuse for their quality or lack there of.&amp;nbsp; I'm an avid hiker because I love covering terrain.&amp;nbsp; I do love to look at all the flora and fauna as I hike, I just know very little about it.&amp;nbsp; So I'm making no claims that anything is special.&lt;/p&gt;
&lt;p&gt;At any rate, I noticed a flower I hadn't taken note of before and it kinda stuck in my head.&amp;nbsp; Later, I ran into &lt;a class="external-link" href="http://scottpeden.smugmug.com/"&gt;Scott Peden&lt;/a&gt; and asked him about it since he definitely does know this kind of stuff.&amp;nbsp; He guessed foxglove from my description and was, of course, right.&amp;nbsp; The next time I passed them, I snapped a few pictures with my phone.&lt;/p&gt;
&lt;p&gt;Here's another white one:&lt;/p&gt;
&lt;p&gt;&lt;a title="White Foxglove 2" class="internal-link" href="/blog/0530081504.jpg"&gt;&lt;img class="image-inline" src="/blog/0530081504.jpg/image_mini" alt="White Foxglove 2" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here's a bright purple one:&lt;/p&gt;
&lt;p&gt;&lt;a title="Purple Foxglove" class="internal-link" href="/blog/0530081505.jpg"&gt;&lt;img class="image-inline image-inline" src="/blog/0530081505.jpg/image_mini" alt="Purple Foxglove" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And finally a more lavender one I ran across a little later:&lt;/p&gt;
&lt;p&gt;&lt;a title="Lavender Foxglove" class="internal-link" href="/blog/0615081514.jpg"&gt;&lt;img class="image-inline image-inline" src="/blog/0615081514.jpg/image_mini" alt="Lavender Foxglove" /&gt;&lt;/a&gt;&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>admin</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-06-30T03:03:46Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/eagle-rock-view">        <title>Eagle Rock View - Faux panoramic from Eagle Rock in Little Basin</title>        <link>http://rpatterson.net/blog/eagle-rock-view</link>        <description>
&lt;p&gt;Starting with the disclaimers, I'm not a photographer nor much of a
naturalist.&amp;nbsp; As a story teller, I love photography and hate
snapshots.&amp;nbsp; My hypocrisy justifies the photos below as "documentation"
which also serves as my excuse for their quality or lack there of.&amp;nbsp; I'm
an avid hiker because I love covering terrain.&amp;nbsp; I do love to look at
all the flora and fauna as I hike, I just know very little about it.&amp;nbsp;
So I'm making no claims that anything is special.&lt;/p&gt;
&lt;p&gt;Try zooming in on any of them, they actually came out alright.&lt;/p&gt;
&lt;a title="View From Eagle Rock 12" class="internal-link" href="/blog/0417081814c.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081814c.jpg/image_mini" alt="View From Eagle Rock 12" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 11" class="internal-link" href="/blog/0417081814b.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081814b.jpg/image_mini" alt="View From Eagle Rock 11" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 10" class="internal-link" href="/blog/0417081814a.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081814a.jpg/image_mini" alt="View From Eagle Rock 10" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 9" class="internal-link" href="/blog/0417081814.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081814.jpg/image_mini" alt="View From Eagle Rock 9" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 8" class="internal-link" href="/blog/0417081813d.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081813d.jpg/image_mini" alt="View From Eagle Rock 8" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 7" class="internal-link" href="/blog/0417081813c.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081813c.jpg/image_mini" alt="View From Eagle Rock 7" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 6" class="internal-link" href="/blog/0417081813b.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081813b.jpg/image_mini" alt="View From Eagle Rock 6" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 5" class="internal-link" href="/blog/0417081813a.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081813a.jpg/image_mini" alt="View From Eagle Rock 5" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 4" class="internal-link" href="/blog/0417081813.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081813.jpg/image_mini" alt="View From Eagle Rock 4" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 3" class="internal-link" href="/blog/0417081812b.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081812b.jpg/image_mini" alt="View From Eagle Rock 3" /&gt;&lt;/a&gt;&lt;a title="View From Eagle Rock 2" class="internal-link" href="/blog/0417081812a.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081812a.jpg/image_mini" alt="View From Eagle Rock 2" /&gt;&lt;/a&gt;&lt;a title="View from Eagle Rock" class="internal-link" href="/blog/0417081812.jpg"&gt;&lt;img class="image-inline" src="/blog/0417081812.jpg/image_mini" alt="View from Eagle Rock" /&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>admin</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Ideas</dc:subject>                <dc:date>2008-06-30T03:58:52Z</dc:date>        <dc:type>News Item</dc:type>    </item>
    <item rdf:about="http://rpatterson.net/blog/adding-testbrowser-form-inputs">        <title>Adding testbrowser Form Inputs - Mock dynamic form inputs with zope.testbrowser</title>        <link>http://rpatterson.net/blog/adding-testbrowser-form-inputs</link>        <description>&lt;p&gt;When writing functional tests that cover forms with elements that are dynamically manipulated from JavaScript, such as the ReferenceBrowserWidget, I often simply didn't cover those elements becuase it simply wasn't worth it to add Selenium or zc.testbrowser.real as a testing dependency&amp;nbsp; for what are usually very small pieces of what is being tested.&lt;/p&gt;
&lt;p&gt;What I've always wanted was a way to reproduce the effects of the dynamic manipulation in the testbrowser.&amp;nbsp; When I was recently bitten by a bug that I didn't catch for lack of functional coverage of a ReferenceField, I dug into the ClientForm package that zope.testbrowser uses and found the HTMLForm.new_control() method.&amp;nbsp; This is the method that ClientForm uses to construct the controls that zope.testbrowser provides lookup for.&lt;/p&gt;
&lt;p&gt;Since Firefox allows you to inspect the DOM either by selecting the elements and using "View selection source" or with Web Developer's DOM inspector, you can ferret out what the dynamic manipulation created and use that information to construct the HTMLForm.new_control() call that will reproduce that.&amp;nbsp; The following example would add the foo object to the related items on another object's edit form.&lt;/p&gt;
&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; form = browser.getForm(name="edit_form")
&amp;gt;&amp;gt;&amp;gt; form.mech_form.new_control(
...     type='checkbox',
...     name='relatedItems:list',
...     attrs=dict(checked='checked', value=foo.UID()))
&lt;/pre&gt;
&lt;p&gt;See the ClientForm source for more details.&lt;/p&gt;
&lt;p&gt;BTW, it seems the the ReferenceBrowserWidget includes an empty string on submission of the form.&amp;nbsp; This empty string case seems to be handled in the &lt;em&gt;field's&lt;/em&gt; set() method and not in the widget where it seems like it should be.&amp;nbsp; Not knowing this, I implemented a custom mutator with a bug that I didn't catch because I didn't have test coverage on the form submission.&amp;nbsp; Now I do.&amp;nbsp; :)&lt;/p&gt;
</description>        <dc:publisher>No publisher</dc:publisher>        <dc:creator>ross</dc:creator>        <dc:rights></dc:rights>                    <dc:subject>Front Page</dc:subject>                    <dc:subject>Planet Plone</dc:subject>                    <dc:subject>Ideas</dc:subject>                    <dc:subject>Planet Zope</dc:subject>                <dc:date>2008-06-01T18:48:20Z</dc:date>        <dc:type>News Item</dc:type>    </item>




</rdf:RDF>
