<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Open Plans (dev)</title>
	<link rel="self" href="http://planetdev.openplans.org/atom.xml"/>
	<link href="http://planetdev.openplans.org/"/>
	<id>http://planetdev.openplans.org/atom.xml</id>
	<updated>2008-08-28T07:05:12+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry>
		<title type="html">[from rmarianski] Web to get more social as OAuth is sanctioned for use</title>
		<link href="http://arstechnica.com/news.ars/post/20080827-web-to-get-more-social-as-oauth-is-sanctioned-for-use.html"/>
		<id>http://arstechnica.com/news.ars/post/20080827-web-to-get-more-social-as-oauth-is-sanctioned-for-use.html</id>
		<updated>2008-08-27T22:59:37+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from rmarianski] Ajaxian » Proxy issues with querystrings in path names</title>
		<link href="http://ajaxian.com/archives/proxy-issues-with-querystrings-in-path-names"/>
		<id>http://ajaxian.com/archives/proxy-issues-with-querystrings-in-path-names</id>
		<updated>2008-08-27T13:46:22+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Comment on Frisbee Design! by Williamveronica</title>
		<link href="http://www.openplans.org/projects/opencore/blog/2007/01/03/frisbee-design/#comment-124"/>
		<id>http://www.openplans.org/projects/opencore/blog/2007/01/03/frisbee-design/#comment-124</id>
		<updated>2008-08-27T09:31:31+00:00</updated>
		<content type="html">&lt;p&gt;Had to leave my mark, Nice site! Rugzar&lt;/p&gt;</content>
		<author>
			<name>OpenCore Blog Comments</name>
			<uri>http://www.openplans.org/projects/opencore/blog</uri>
		</author>
		<source>
			<title type="html">Comments for OpenCore Software</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/opencore/blog/comments/feed/"/>
			<id>http://www.openplans.org/projects/opencore/blog/comments/feed/</id>
			<updated>2008-08-28T07:05:02+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A protocol for volunteering opportunities? Part II</title>
		<link href="http://blog.survv.org/2008/08/27/a-protocol-for-volunteering-opportunities-part-ii/"/>
		<id>http://blog.survv.org/?p=28</id>
		<updated>2008-08-27T04:15:40+00:00</updated>
		<content type="html">&lt;p&gt;Today, I again met with a member (&lt;a href=&quot;http://www.bandillero.com/mattcoop/index.html&quot;&gt;Matthew Cooperrider&lt;/a&gt;) of the &lt;a href=&quot;http://web.meetup.com/27/&quot;&gt;Web4Roots meetup group&lt;/a&gt;.  Our goal was to pare down what a protocol for exchanging information about volunteering opportunities should look like.&lt;/p&gt;
&lt;p&gt;First a quick summary of the problem:&lt;br /&gt;
1) Organizations need a standard way to syndicate volunteer opportunities they create.&lt;br /&gt;
2) Volunteers need an easy way to search for volunteer opportunities that match their location, schedule and interests.&lt;/p&gt;
&lt;p&gt;During our &lt;a href=&quot;http://blog.survv.org/2008/07/10/a-protocol-for-volunteering-opportunities/&quot;&gt;first hack at this problem&lt;/a&gt;, we tried to treat volunteers and organizations as completely different entities.  This time our thought process was to see if we could model volunteers and organizations in the same way.  So what is fundamentally the same between volunteers and organizations?  Both have something to offer (volunteers: time, money, experience, etc.; organizations: tax right offs, a good time, free food, etc) and both have something they need (volunteers: tax write off, recommendation, satisfaction, etc; organizations: labor, money, supplies, etc).  So in effect, every time a person volunteers, he exchanges what he can give to the organization for what he wants from the organization.  The reverse is true for organizations.  So how can we model this?&lt;/p&gt;
&lt;p&gt;Say we have a volunteer name John, who lives in New York City, enjoys cooking, is free on week nights, and wants to volunteer for 5 hours a month.  Additionally, he is only willing to volunteer for an organization that can give him a $5000 tax write off.  How would the protocol represent this character?&lt;/p&gt;
&lt;pre&gt;&amp;lt;exchange&amp;gt;
  &amp;lt;export&amp;gt;
    &amp;lt;type&amp;gt;Cooking&amp;lt;/type&amp;gt;
    &amp;lt;location&amp;gt;Boston&amp;lt;/location&amp;gt;
    &amp;lt;datetime&amp;gt;Weeknights&amp;lt;/datetime&amp;gt;
    &amp;lt;quantity&amp;gt;5 hours per month&amp;lt;/quantity
  &amp;lt;/export&amp;gt;
  &amp;lt;import&amp;gt;
    &amp;lt;type&amp;gt;tax write off&amp;lt;/type&amp;gt;
    &amp;lt;location&amp;gt;USA&amp;lt;/location&amp;gt;
    &amp;lt;datetime&amp;gt;Now - Jan 1st 2010&amp;lt;/datetime&amp;gt;
    &amp;lt;quantity&amp;gt;$5000&amp;lt;/quantity&amp;gt;
  &amp;lt;/import&amp;gt;
&amp;lt;/exchange&amp;gt;&lt;/pre&gt;
&lt;p&gt;By the same token, say if we have an organization in New York City who is trying to redesign their website by March 1, 2009.  Furthermore, it wants a volunteer who is willing to commit 20 hours a month to this project.  In return, the organization is willing to write a letter or recommendation for the volunteer:&lt;/p&gt;
&lt;pre&gt;&amp;lt;exchange&amp;gt;
  &amp;lt;import&amp;gt;
    &amp;lt;type&amp;gt;Advanced PHP Web Develop&amp;lt;/type&amp;gt;
    &amp;lt;location&amp;gt;New York City&amp;lt;/location&amp;gt;
    &amp;lt;datetime&amp;gt;By March 1, 2009&amp;lt;/datetime&amp;gt;
    &amp;lt;quantity&amp;gt;20 hours per Month&amp;lt;/quantity
  &amp;lt;/import&amp;gt;
  &amp;lt;export&amp;gt;
    &amp;lt;type&amp;gt;recommendation&amp;lt;/type&amp;gt;
    &amp;lt;location&amp;gt;USA&amp;lt;/location&amp;gt;
    &amp;lt;datetime&amp;gt;anytime&amp;lt;/datetime&amp;gt;
    &amp;lt;quantity&amp;gt;1&amp;lt;/quantity&amp;gt;
  &amp;lt;/export&amp;gt;
&amp;lt;/exchange&amp;gt;&lt;/pre&gt;
&lt;p&gt;Each &amp;#8220;exchange&amp;#8221; package can have 0 or more import and export blocks.  Furthermore, each of these packages would have to name the web service that generated the data (and a unique identifier within that service).  For example, if a client on Survv asked for help for a certain issue, Survv would create a unique URI for the volunteer opportunity before it syndicated the opportunity:&lt;/p&gt;
&lt;pre&gt;&amp;lt;unique id&amp;gt;http://survv.org/opportunities/19192&amp;lt;/unique id&amp;gt;&lt;/pre&gt;
&lt;p&gt;Each &amp;#8220;exchange&amp;#8221; package could also have extra optional data such as keywords, tags, categories, and the name of the creator.&lt;/p&gt;</content>
		<author>
			<name>Law 2.0 - Anil Makhijani</name>
			<uri>http://blog.survv.org</uri>
		</author>
		<source>
			<title type="html">Law 2.0</title>
			<subtitle type="html">Law's Place on the New Web</subtitle>
			<link rel="self" href="http://blog.survv.org/feed/"/>
			<id>http://blog.survv.org/feed/</id>
			<updated>2008-08-27T05:05:14+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from rmarianski] Firefox - Ubiquity</title>
		<link href="http://labs.mozilla.com/2008/08/introducing-ubiquity/"/>
		<id>http://labs.mozilla.com/2008/08/introducing-ubiquity/</id>
		<updated>2008-08-27T02:26:55+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from rmarianski] Ride the City: safe bike routes made easy</title>
		<link href="http://ridethecity.com/"/>
		<id>http://ridethecity.com/</id>
		<updated>2008-08-26T01:40:31+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Comment on Hi, I’m the Opencore Release Manager by Pierre</title>
		<link href="http://www.openplans.org/projects/opencore/blog/2008/06/27/hi-im-the-opencore-release-manager/#comment-123"/>
		<id>http://www.openplans.org/projects/opencore/blog/2008/06/27/hi-im-the-opencore-release-manager/#comment-123</id>
		<updated>2008-08-20T05:32:57+00:00</updated>
		<content type="html">&lt;p&gt;Hello Paul, &lt;/p&gt;
&lt;p&gt;this is Pierre,  looking to get in mail contact , from the  midterm perspective of  world social forum - ( see &lt;a href=&quot;http://www.openfsm.net&quot; rel=&quot;nofollow&quot;&gt;www.openfsm.net&lt;/a&gt; and &lt;a href=&quot;http://www.openesf.net&quot; rel=&quot;nofollow&quot;&gt;www.openesf.net&lt;/a&gt; )&lt;/p&gt;</content>
		<author>
			<name>OpenCore Blog Comments</name>
			<uri>http://www.openplans.org/projects/opencore/blog</uri>
		</author>
		<source>
			<title type="html">Comments for OpenCore Software</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/opencore/blog/comments/feed/"/>
			<id>http://www.openplans.org/projects/opencore/blog/comments/feed/</id>
			<updated>2008-08-28T07:05:02+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Comment on 5 Easy Steps to Tab Completion in the Interactive Python Shell by magicbronson</title>
		<link href="http://www.openplans.org/projects/opencore/blog/2008/04/04/x-easy-steps-to-tab-completion-in-an-interactive-python-shell/#comment-122"/>
		<id>http://www.openplans.org/projects/opencore/blog/2008/04/04/x-easy-steps-to-tab-completion-in-an-interactive-python-shell/#comment-122</id>
		<updated>2008-08-19T20:26:37+00:00</updated>
		<content type="html">&lt;p&gt;if you&amp;#8217;re used to hitting tab for indenting in your interactive python, either switch to using a single space, or change complete to some other keybinding, e.g. readline.parse_and_bind(&amp;#8217;\C-J: complete&amp;#8217;)&lt;/p&gt;</content>
		<author>
			<name>OpenCore Blog Comments</name>
			<uri>http://www.openplans.org/projects/opencore/blog</uri>
		</author>
		<source>
			<title type="html">Comments for OpenCore Software</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/opencore/blog/comments/feed/"/>
			<id>http://www.openplans.org/projects/opencore/blog/comments/feed/</id>
			<updated>2008-08-28T07:05:02+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from rafrombrc] Regular Expression to match email addresses according to the various RFCs</title>
		<link href="http://thefrozenfire.com/data/emailregex.txt"/>
		<id>http://thefrozenfire.com/data/emailregex.txt</id>
		<updated>2008-08-18T19:56:09+00:00</updated>
		<content type="html">yowza!  what a doozy!</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from closedplans] Tarek's new python book</title>
		<link href="http://tarekziade.wordpress.com/2008/08/08/a-new-python-book-expert-python-programming/"/>
		<id>http://tarekziade.wordpress.com/2008/08/08/a-new-python-book-expert-python-programming/</id>
		<updated>2008-08-14T16:11:40+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Comment on Week 1: Xinha, no more popups by nicholasbs</title>
		<link href="http://www.openplans.org/projects/topp-engineering/blog/2008/06/30/week-1-xinha-no-more-popups/#comment-5"/>
		<id>http://www.openplans.org/projects/topp-engineering/blog/2008/06/30/week-1-xinha-no-more-popups/#comment-5</id>
		<updated>2008-08-14T14:43:03+00:00</updated>
		<content type="html">&lt;p&gt;Your plugin was actually quite flexible and met all our basic needs better than the other plugins we looked at. The reason we didn&amp;#8217;t use it was that someone else had already done exactly what we wanted to do (replace Xinha&amp;#8217;s popup windows with lightboxes), and he had written all of the code from scratch, so the lightbox work was mostly done.&lt;/p&gt;
&lt;p&gt;Good luck with nyroModal! I&amp;#8217;m going to be working on a personal project soon, and I might be using it for that.&lt;/p&gt;</content>
		<author>
			<name>TOPP Engineering Comments</name>
			<uri>http://www.openplans.org/projects/topp-engineering/blog</uri>
		</author>
		<source>
			<title type="html">Comments for Topp Engineering</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/topp-engineering/blog/comments/feed"/>
			<id>http://www.openplans.org/projects/topp-engineering/blog/comments/feed</id>
			<updated>2008-08-28T07:05:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Finding the location of the current bash script</title>
		<link href="http://douglas.mayle.org/2008/08/13/finding-location-current-bash-script/"/>
		<id>http://douglas.mayle.org/2008/08/13/finding-location-current-bash-script/</id>
		<updated>2008-08-14T00:41:53+00:00</updated>
		<content type="html">&lt;p&gt;In my work for &lt;a title=&quot;The Open Planning Project&quot; href=&quot;http://topp.openplans.org&quot;&gt;&lt;span class=&quot;caps&quot;&gt;TOPP&lt;/span&gt;&lt;/a&gt;, I&amp;#8217;m the middle of some changes to our build system.&amp;#160; We&amp;#8217;re using an in-house build tool called fassembler.&amp;nbsp; Considering that it&amp;#8217;s completely specific to our needs, and was written mostly from scratch, it&amp;#8217;s got some pretty great features (e.g. color coded output, database initialization).&amp;nbsp; Our config files are stored in subversion, checked out, and then compared against when there&amp;#8217;s an update.&amp;nbsp; If they differ, you&amp;#8217;re prompted to either replace, discard, view the diff, or merge the files.&amp;nbsp; This is great for when you&amp;#8217;re running a&amp;nbsp;build.&lt;/p&gt;&lt;p&gt;As the Deployment Manager for &lt;a title=&quot;OpenPlans&quot; href=&quot;http://www.openplans.org&quot;&gt;openplans.org&lt;/a&gt;, however, I&amp;#8217;m running tens or hundreds of builds.&amp;nbsp; My goal is to make building and maintaining a deployment easier, and so I need to be able to run the build unattended, and not in a way that blindly discards or overwrites those&amp;nbsp;changes.&lt;/p&gt;&lt;p&gt;Enter &lt;a title=&quot;Gentoo Linux&quot; href=&quot;http://www.gentoo.org/&quot;&gt;Gentoo Linux&lt;/a&gt;.&amp;nbsp; Gentoo is a distribution of linux where all of the packages are built from source.&amp;nbsp; On a system-wide level, or for each individual package, build options can be set before installing a piece of software.&amp;nbsp; A fully installed Gentoo system, whether a server or desktop, can contain hundreds of packages, and users don&amp;#8217;t have the time to sit interactively through the building and updating of each&amp;nbsp;package.&lt;/p&gt;&lt;p&gt;Gentoo uses a script called etc-update to handle the merging of configuration files separately from the building of software.&amp;nbsp; It works by saving the new configurations with a mangled name (e.g. httpd.conf would become ._cfg0000_httpd.conf), building the list of these files, and then allowing the user to diff, overwrite, discard, or merge any of the new configurations.&amp;nbsp; It allows you to configure which tools to use, defaulting to diff, smerge, and nano.&amp;nbsp; I&amp;#8217;m a vi user, but I have that set at a system level, so that&amp;#8217;s picked up by the script.&amp;nbsp; smerge is just fine for me, but I prefer &lt;a title=&quot;Syntax coloring wrapper for diff&quot; href=&quot;http://colordiff.sourceforge.net/&quot;&gt;colordiff&lt;/a&gt; (some &lt;a title=&quot;Screenshot images of colordiff output&quot; href=&quot;http://colordiff.sourceforge.net/screenshots.html&quot;&gt;screenshots&lt;/a&gt;), because of it&amp;#8217;s nicely readable output, and so I have that overridden in a configuration&amp;nbsp;file.&lt;/p&gt;&lt;p&gt;etc-update is licensed under version 2 of the &lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt;, and so we will be redistributing it bundled with the rest of our build software.&amp;nbsp; Where our situation is different, however, is that we can build in a myriad of locations, and the configuration files are specific to each build.&amp;nbsp; In Gentoo&amp;#8217;s version of the script, portage (their packaging system) is queried for the location of configuration files, but we don&amp;#8217;t have the luxury of a system level tool to perform that work for us. I looked at a couple of possible solutions to the&amp;nbsp;problem:&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;The command line&lt;br /&gt; &lt;/dt&gt;&lt;dd&gt;etc-update alread includes a way to pass directories on the command line, but this requires too much typing by the user.&lt;/dd&gt;&lt;dt&gt;Building a custom script&lt;/dt&gt;&lt;dd&gt;Easy to type, but it means installing modified versions of the script all over the place, which is just harder to maintain.&lt;/dd&gt;&lt;dt&gt;Reading from the environment&lt;/dt&gt;&lt;dd&gt;It requires the user to set the environment somehow, requiring extra steps, and is very hacky&lt;/dd&gt;&lt;dt&gt;Look in a path relative to the current script&lt;/dt&gt;&lt;dd&gt;Some magic involved, but if we at least use a configuration file relative to the script, it&amp;#8217;s relatively straightforward, and the only magic involved is in expecting where the list of directories is saved.&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Based on these options, I decided on the latter option.&amp;nbsp; But this all hinges on knowing during execution where the script is located.&amp;nbsp; Well, I know how the script has been called.&amp;nbsp; That&amp;#8217;s available as Arg0 ( $0 ) in the shell, I figured it would be pretty easy to go from there to the actual location of the&amp;nbsp;script.&lt;/p&gt;&lt;p&gt;Being a python programmer, my first instinct was to code the logic in python,&amp;nbsp; This wasn&amp;#8217;t too tough.&amp;nbsp; I took advantage of the fact that you can pipe a script to the python shell, but used bash string interpolation to pass the argument hardcoded into the script.&amp;nbsp; Since it was a multiline program, I used a bash here document to make it readable. Here&amp;#8217;s an example script (that just returns&amp;nbsp;Arg0).&lt;/p&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;caps&quot;&gt;RESULT&lt;/span&gt;=`python &amp;lt;&amp;lt; &lt;span class=&quot;caps&quot;&gt;EOF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;print '$0'&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;caps&quot;&gt;EOF&lt;/span&gt;`&lt;/pre&gt;&lt;p&gt;It took me about five minutes to put together a final script. It first checked to see if the script was called with any path information (e.g. relative: ../script.sh or absolute: /home/script.sh)&amp;nbsp; If not, it looked for the script file in the $&lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt; command variable.&amp;nbsp; Failing that, it tried to join the current directory to Arg0 to find the actual location.&amp;nbsp; (Python&amp;#8217;s os.path.normpath command will override the base path if the search path is&amp;nbsp;absolute).&lt;/p&gt;&lt;p&gt;This script worked, and was easy to ready for python programmers.&amp;nbsp; It bothered me a bit, however, because: 1) I was embedding a python script into a bash script, which could be rather confusing, and 2) it was 32 lines long, not exactly the shortest of solutions.&amp;nbsp; This is that&amp;nbsp;script:&lt;/p&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;# Python script to figure out where this file is located.&lt;br /&gt;&lt;span class=&quot;caps&quot;&gt;HERE&lt;/span&gt;=`python &amp;lt;&amp;lt; &lt;span class=&quot;caps&quot;&gt;EOF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;import os &lt;br /&gt;import sys &lt;br /&gt;&lt;br /&gt;# The path environemnt variable as a list.&lt;br /&gt;path='$&lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt;'.split(':') &lt;br /&gt;&lt;br /&gt;# How the script was called    &lt;br /&gt;arg0='$0'&lt;br /&gt;&lt;br /&gt;# The current working directory.&lt;br /&gt;working_dir='$&lt;span class=&quot;caps&quot;&gt;PWD&lt;/span&gt;' &lt;br /&gt;&lt;br /&gt;# If the script was called in any way that includes path information (relative&lt;br /&gt;# or absolute), we will not look in the system path.&lt;br /&gt;search_in_path=(arg0==os.path.basename(arg0))&lt;br /&gt;&lt;br /&gt;if search_in_path:&lt;br /&gt;    for dir in path: &lt;br /&gt;        if os.path.exists(os.path.join(dir, arg0)):&lt;br /&gt;            print os.path.join(dir, arg0)&lt;br /&gt;            sys.exit(0) &lt;br /&gt;&lt;br /&gt;fullpath=os.path.normpath(os.path.join(working_dir, arg0))&lt;br /&gt;if os.path.exists(fullpath):   &lt;br /&gt;    print fullpath &lt;br /&gt;    sys.exit(0) &lt;br /&gt;&lt;br /&gt;sys.exit(1)&lt;br /&gt;&lt;span class=&quot;caps&quot;&gt;EOF&lt;/span&gt;`&lt;/pre&gt;&lt;p&gt;My next thought was to re-implement the script algorithm natively in bash.&amp;nbsp; Unfortunately, bash doesn&amp;#8217;t have the python standard library at its disposal.&amp;nbsp; Thankfully, however, there are a number of commands that allow us to achieve more or less what I wrote above.&amp;nbsp; I use &amp;#8220;readlink -f /basepath/../somepath&amp;#8221; to convert two joined paths into a normalized path.&amp;nbsp; The only problem with this is that when we executed a symlink to a shell program, it returns the location of the actual file and not the symlink.&amp;nbsp; I&amp;#8217;m not really sure if this is a problem that merits any worrying, but I could imagine having a single &amp;#8220;source&amp;#8221; script, and symlinking it into different environments.&amp;nbsp; The second command I needed to replicate was os.path.basename (used to extract the directory from the scripts full path); luckily the basename program handles this&amp;nbsp;identically.&lt;/p&gt;&lt;p&gt;I ran into one final problem in interpreting this algorithm in bash, and that was splitting the $&lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt; variable.&amp;nbsp; Normally the for..in control structure in bash splits a string by spaces.&amp;nbsp; We could use sed or tr to convert the colon seperated pathinto a space seperated path, but that&amp;#8217;s going to run into problems when you have spaces in you directory names.&amp;nbsp; HEre&amp;#8217;s where the $&lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt; variable saves us.&amp;nbsp; The $&lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt; variable is a variable that tells bash what characters to use to split up a string into a set.&amp;nbsp; For our purposes, we temporarily save $&lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt; and set it to a single colon.&amp;nbsp; This allows you to perform a simple &amp;#8220;for &lt;span class=&quot;caps&quot;&gt;DIR&lt;/span&gt; in $&lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt;&amp;#8221;.&amp;nbsp; If you&amp;#8217;ve got colons in you directories, well hey, you could have used python&amp;#8230; ;-) Here&amp;#8217;s that&amp;nbsp;script:&lt;/p&gt;&lt;pre&gt; &lt;br /&gt;# The same algorithm implemented almost purely in bash&lt;br /&gt;if [ &quot;$0&quot; == &quot;`basename $0`&quot; ]; then &lt;br /&gt;    # The &lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt; internal variable tells bash how to split a string into variables&lt;br /&gt;    # for a list.  Since the &lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt; variable is colon seperated, we will&lt;br /&gt;    # temporarily change this variable in order to interpret the path.&lt;br /&gt;    export SAVED_IFS=&quot;${&lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt;}&quot;; &lt;br /&gt;    export &lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt;=&quot;:&quot;; &lt;br /&gt;&lt;br /&gt;    for &lt;span class=&quot;caps&quot;&gt;DIR&lt;/span&gt; in $&lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt;; do       &lt;br /&gt;        if [ -f &quot;${&lt;span class=&quot;caps&quot;&gt;DIR&lt;/span&gt;}/$0&quot; ] || [ -L &quot;${&lt;span class=&quot;caps&quot;&gt;DIR&lt;/span&gt;}/$0&quot; ]; then&lt;br /&gt;            &lt;span class=&quot;caps&quot;&gt;THERE&lt;/span&gt;=&quot;${&lt;span class=&quot;caps&quot;&gt;DIR&lt;/span&gt;}/$0&quot; ;&lt;br /&gt;            break;&lt;br /&gt;        fi;&lt;br /&gt;    done;&lt;br /&gt;    &lt;br /&gt;    # We restore the saved &lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt; variable to return string handling to normal.&lt;br /&gt;    export &lt;span class=&quot;caps&quot;&gt;IFS&lt;/span&gt;=&quot;${SAVED_IFS}&quot;  &lt;br /&gt;else&lt;br /&gt;    &lt;span class=&quot;caps&quot;&gt;THERE&lt;/span&gt;=`readlink -f $0` ;   &lt;br /&gt;fi&lt;/pre&gt;&lt;p&gt;The same script is 20 lines in bash, which is an improvement.&amp;nbsp; At this point I was happy enough with the result that I started to embed it into our local copy of etc-update.&amp;nbsp; In doing so, however, I ran across a usage of the type built-in command that piqued my interest.&amp;nbsp; It was being used to test for the existence of egrep on the system.&amp;nbsp; It turns out that &amp;#8220;type -p path&amp;#8221; looks for a file-based command and prints it if it exists.&amp;nbsp; I figured that this could be used in an even shorter bash only script, and wrote a test script to do so.&amp;nbsp; In checking out the various permutations (in a symlink, from the path, etc.) I found out something interesting: when you invoke a script through in the path directly, bash sets Arg0 to the full path.&amp;nbsp; &amp;#8220;Great!&amp;#8221; I thought, combine that with readlink from above, and I have a&amp;nbsp;one-liner.&lt;/p&gt;&lt;p&gt;And then it hit&amp;nbsp;me.&lt;/p&gt;&lt;pre&gt;which&lt;/pre&gt;&lt;p&gt;From the which man&amp;nbsp;page:&lt;/p&gt;&lt;blockquote&gt;&lt;strong&gt;Which&lt;/strong&gt; takes one or more arguments. For each of its arguments it prints to stdout the full path of the executables that would have been executed when this argument had been entered at the shell prompt. It does this by searching for an executable or script in the directories listed in the environment variable &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt;&lt;/strong&gt; using the same algorithm as &lt;strong&gt;bash(1)&lt;/strong&gt;.&lt;/blockquote&gt;&lt;p&gt;The captian obvious award of the day goes to me.&amp;nbsp; &amp;#8220;which $0&amp;#8221; will
always return the full path, as bash sees it, of the script&amp;nbsp;file. &lt;/p&gt;</content>
		<author>
			<name>Douglas</name>
			<uri>http://douglas.mayle.org/tag/planetdev/</uri>
		</author>
		<source>
			<title type="html">douglas.mayle.org blog posts with tag intersection planetdev</title>
			<link rel="self" href="http://douglas.mayle.org/feeds/atom/tag/planetdev/"/>
			<id>http://douglas.mayle.org/tag/planetdev/</id>
			<updated>2008-08-28T07:05:10+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Comment on Week 1: Xinha, no more popups by Nyro</title>
		<link href="http://www.openplans.org/projects/topp-engineering/blog/2008/06/30/week-1-xinha-no-more-popups/#comment-4"/>
		<id>http://www.openplans.org/projects/topp-engineering/blog/2008/06/30/week-1-xinha-no-more-popups/#comment-4</id>
		<updated>2008-08-13T22:45:46+00:00</updated>
		<content type="html">&lt;p&gt;Hi,&lt;br /&gt;
I just read this blog post. Glad you liked my plugin.&lt;br /&gt;
If I well understood, you finally choose to write your own code, right?&lt;br /&gt;
What was the problem with my plugin? Maybe I can work on it and write some code to produce a plugin more flexible?&lt;/p&gt;
&lt;p&gt;And keep going with your WYSIWYG.&lt;/p&gt;</content>
		<author>
			<name>TOPP Engineering Comments</name>
			<uri>http://www.openplans.org/projects/topp-engineering/blog</uri>
		</author>
		<source>
			<title type="html">Comments for Topp Engineering</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/topp-engineering/blog/comments/feed"/>
			<id>http://www.openplans.org/projects/topp-engineering/blog/comments/feed</id>
			<updated>2008-08-28T07:05:04+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from closedplans] Blockquote then and now</title>
		<link href="http://www.sitepoint.com/blogs/2008/08/12/blockquote-then-and-now/"/>
		<id>http://www.sitepoint.com/blogs/2008/08/12/blockquote-then-and-now/</id>
		<updated>2008-08-13T20:06:03+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Glimpse From The Future - Hassle-Free Builds</title>
		<link href="http://www.openplans.org/projects/operations/blog/2008/08/13/a-glimpse-from-the-future-hassle-free-builds/"/>
		<id>http://www.openplans.org/projects/operations/blog/2008/08/13/a-glimpse-from-the-future-hassle-free-builds/</id>
		<updated>2008-08-13T19:13:25+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;ve been working over the last week on fassembler&amp;#8217;s conflict management for configuration files.&amp;nbsp; As I mentioned in an email to the fassembler mailing list, I&amp;#8217;ve been working on integrating Gentoo&amp;#8217;s wonderful etc-update script.&amp;nbsp; This script works by saving new versions of a config using a special mangled syntax (e.g. cabochon.ini becomes ._cfg0000_cabochon.ini), and then using standard system tools for diffing, merging, and hand-editing conflicts.
&lt;/p&gt;
&lt;p&gt;When embedding it into fassembler, however, I ran into a two major difficulties.&amp;nbsp; The first was handling configuration on a per-environment basis.&amp;nbsp; A few simple modifications later, and etc-update no longer queries portage, but looks for config relative to the installed script file.&amp;nbsp; The second was stickier, as a number of fassembler projects contains steps not just for building the software, but also for performing data modifications to make it easier to go from zero to working for out of the box installs.&amp;nbsp; In order for these steps to work, the config has to already be in place, or starting necessary services will faill in a spectacular fashion.
&lt;/p&gt;
&lt;p&gt;This led me to create the concept of phases for fassembler.&amp;nbsp; In the etc-update branch of fassembler, every task has a phase, inherited from the base class, defaulting to &amp;#8216;build&amp;#8217;.&amp;nbsp; A few tasks are overriden at the class level, so that they are automatically placed into the &amp;#8217;setup&amp;#8217; phase.&amp;nbsp; (Running Zopectl scripts is a task like this).&amp;nbsp; Finally, some tasks allow you to specify the phase as part of their init functions.&amp;nbsp; (A good example of this is the Script task.&amp;nbsp; It defaults to the build phase, but if your are running a script that populates a database, for example, you can specify phase=&amp;#8217;setup&amp;#8217;, and that particular script will be deffered to the setup phase.
&lt;/p&gt;
&lt;p&gt;The phases are left as a text field to allow more flexibility in the future.&amp;nbsp; Right now, the build phase is triggered, then etc-update is launched, and finally the setup phase is triggered.&amp;nbsp; In the future, it could be possible to add pre and post hooks for every phase, or allow custom phases, but I&amp;#8217;ll let that happen if there&amp;#8217;s ever a need.
&lt;/p&gt;
&lt;p&gt; I want to present an example run on my system of opencore 0.12.1.&amp;nbsp; The first text below is what happens when you build using fassembler trunk:
&lt;/p&gt;
&lt;pre&gt;­&lt;code&gt;Start
0:00
    douglas@cezan ~/topp/etc $ ./newbuild.sh openplans/releases/opencore-0.12.1

    ------------------------------------- SNIP -----------------------------------------

Prompt 1
+2:42
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/deliverance/deliverance.ini [y/n/d/b/m/?] d
    --- /home/douglas/topp/etc/builds/20080813/etc/deliverance/deliverance.ini (old content)
    +++ /home/douglas/topp/etc/builds/20080813/etc/deliverance/deliverance.ini (new content)
    @@ -6,7 +6,7 @@
     email_to = ianb@openplans.org
     smtp_server = localhost
     error_email_from = paste@cezan.openplans.org
    -base_path = /home/douglas/topp/etc/builds/20080807-1
    +base_path = /home/douglas/topp/etc/builds/20080813

     [server:main]
     use = egg:Paste#http
    @@ -16,7 +16,7 @@
     [app:main]
     use = egg:DeliveranceVHoster
     data_dir = /home/douglas/topp/etc/var/deliverance/hosts
    -custom_error_dir = /home/douglas/topp/etc/builds/20080807-1/deliverance/src/deliverancevhoster/errors/www.openplans.org
    +custom_error_dir = /home/douglas/topp/etc/builds/20080813/deliverance/src/deliverancevhoster/errors/www.openplans.org
     #debug_headers = true
     # To view bodies:
     #debug_bodies = true

    Overwrite /home/douglas/topp/etc/builds/20080813/etc/deliverance/deliverance.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 2
+2:50
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/deliverance.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 3
+3:30
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/cabochon.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 4
+4:12
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/twirlip/twirlip.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 5
+4:18
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/twirlip.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 6
+5:03
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/tasktracker/tasktracker.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 7
+5:09
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/tasktracker.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 8
+5:17
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/wordpress/httpd-wordpress.conf [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 9
+5:33
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/wordpress.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 10
+9:36
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/opencore/zope_etc/zope.conf [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 11
+9:43
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/properties.xml [y/n/d/b/m/?] d
    --- /home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/properties.xml (old content)
    +++ /home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/properties.xml (new content)
    @@ -1,12 +1,14 @@
    -
    +
    +

      False

    -
    + 

    - OpenPlans
    + OpenCore Site

    - greetings@openplans.org
    + greetings@localhost.localdomain

    Overwrite /home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/properties.xml [y/n/d/b/m/?] n

    ------------------------------------- SNIP -----------------------------------------

Prompt 12
+9:51
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/opencore.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 13
+9:59
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/opencore-zeo.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 14
+11:31
    Overwrite /home/douglas/topp/etc/builds/20080813/opencore/src/opencore-bundle/MaildropHost/config.py [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 15
+11:43
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/maildrop.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

Prompt 16
+13:16
    Overwrite /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/erroreater.ini [y/n/d/b/m/?] y

    ------------------------------------- SNIP -----------------------------------------

FINISHED
+13:37
    Installation successful.
    douglas@cezan ~/topp/etc $ &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; As you can see, over a period of 13 and a half minutes, you are prompted to make decisions 16 times.&amp;nbsp; Not only do you have to know which changes to accept and reject, but that&amp;#8217;s time you have to spend dedicated to that build process.&amp;nbsp; If you need to be doing other things, the build time quickly increases as you was time waiting for each step.
&lt;/p&gt;
&lt;p&gt;Below, is an example build using the etc-update branch
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Start
0:00
    douglas@cezan ~/topp/etc $ ./newbuild.sh openplans/releases/opencore-0.12.1

    ------------------------------------- SNIP -----------------------------------------

Prompt 1
+11:58
    Scanning Configuration files...
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/cabochon.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/deliverance/deliverance.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/deliverance.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/erroreater.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/wordpress/httpd-wordpress.conf
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/maildrop.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/opencore.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/opencore-zeo.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/tasktracker.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/tasktracker/tasktracker.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/twirlip.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/twirlip/twirlip.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/supervisor.d/wordpress.ini
    Automerging trivial changes in: /home/douglas/topp/etc/builds/20080813/etc/opencore/zope_etc/zope.conf
    The following is the list of files which need updating, each
    configuration file is followed by a list of possible replacement files.
    1) /home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/properties.xml (1)
    2) /home/douglas/topp/etc/builds/20080813/opencore/src/opencore-bundle/MaildropHost/config.py (1)
    Please select a file to edit by entering the corresponding number.
                  (don't use -3, -5, -7 or -9 if you're unsure what to do)
                  (-1 to exit) (-3 to auto merge all remaining files)
                               (-5 to auto-merge AND not use 'mv -i')
                               (-7 to discard all updates)
                               (-9 to discard all updates AND not use 'rm -i'): 1

    File: /home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/._cfg0000_properties.xml
    1) Replace original with update
    2) Delete update, keeping original as is
    3) Interactively merge original with update
    4) Show differences again
    Please select from the menu above (-1 to ignore this update): 2
    Deleting /home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/._cfg0000_properties.xml
    rm: remove regular file `/home/douglas/topp/etc/builds/20080813/etc/opencore/gs_profile/._cfg0000_properties.xml'? y

    The following is the list of files which need updating, each
    configuration file is followed by a list of possible replacement files.
    2) /home/douglas/topp/etc/builds/20080813/opencore/src/opencore-bundle/MaildropHost/config.py (1)
    Please select a file to edit by entering the corresponding number.
                  (don't use -3, -5, -7 or -9 if you're unsure what to do)
                  (-1 to exit) (-3 to auto merge all remaining files)
                               (-5 to auto-merge AND not use 'mv -i')
                               (-7 to discard all updates)
                               (-9 to discard all updates AND not use 'rm -i'): 2

    File: /home/douglas/topp/etc/builds/20080813/opencore/src/opencore-bundle/MaildropHost/._cfg0000_config.py
    1) Replace original with update
    2) Delete update, keeping original as is
    3) Interactively merge original with update
    4) Show differences again
    Please select from the menu above (-1 to ignore this update): 1
    Replacing /home/douglas/topp/etc/builds/20080813/opencore/src/opencore-bundle/MaildropHost/config.py with /home/douglas/topp/etc/builds/20080813/opencore/src/opencore-bundle/MaildropHost/._cfg0000_config.py
    mv: overwrite `/home/douglas/topp/etc/builds/20080813/opencore/src/opencore-bundle/MaildropHost/config.py'? y

    Exiting: Nothing left to do; exiting. &lt;img src=&quot;http://www.openplans.org/projects/operations/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; 

    ------------------------------------- SNIP -----------------------------------------

FINISHED
+12:53
    Installation successful.
    douglas@cezan ~/topp/etc $
­&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The build was started.&amp;nbsp; After twelve minutes, the system scans over the config files, determines which ones don&amp;#8217;t need user attention, and prompts you for the only two files with any significant difference­.&amp;nbsp; Another minute later, and the setup tasks have complted.
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;When this completed last night, and I realized the amount of effort it would save me, it nearly brought a tear to my eye&amp;#8230; &lt;img src=&quot;http://www.openplans.org/projects/operations/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Now this post is titled a glimpse from the future, and that&amp;#8217;s because the branch isn&amp;#8217;t mature enough to merge it to trunk.&amp;nbsp; There are still a couple of questions left before I&amp;#8217;m ready to enable it for anyone.&amp;nbsp; For example, fassembler keeps track of which projects are completed, and doesn&amp;#8217;t rerun them when using the missing keyword.&amp;nbsp; I&amp;#8217;ve got to verify that the project isn&amp;#8217;t marked complete until all of it&amp;#8217;s phases have finished.&amp;nbsp; Also, there isn&amp;#8217;t yet a way to trigger a specific phase from the command line, so it&amp;#8217;s an all or nothing approach.&amp;nbsp; Finally, when running in non-interactive mode, the system stops after the build phase, which combined with the problem above, there&amp;#8217;s no way to repeat the setup phase.&amp;nbsp; Fortunately for me, this allows me to run builds without worrying about starting zeo on the same port, or modifying live data, but not everyone is building in exactly the same way as me.
&lt;/p&gt;
&lt;p&gt;All of my future builds will be using this branch (which you can acheive by switching fassembler over to the branch &lt;a href=&quot;https://svn.openplans.org/svn/fassembler/branches/etc-update&quot;&gt;https://svn.openplans.org/svn/fassembler/branches/etc-update&lt;/a&gt;&amp;nbsp; ).&amp;nbsp; I hope that in the coming week or two, I&amp;#8217;ll be able to polish it up enough to merge back to trunk&amp;#8230;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;Happy Building!&lt;br /&gt;
  &lt;/p&gt;</content>
		<author>
			<name>Operations Blog Posts</name>
			<uri>http://www.openplans.org/projects/operations/blog</uri>
		</author>
		<source>
			<title type="html">operations</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/operations/blog/feed/"/>
			<id>http://www.openplans.org/projects/operations/blog/feed/</id>
			<updated>2008-08-28T07:05:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">My first Django app</title>
		<link href="http://www.openplans.org/projects/topp-engineering/blog/2008/08/12/my-first-django-app/"/>
		<id>http://www.openplans.org/projects/topp-engineering/blog/2008/08/12/my-first-django-app/</id>
		<updated>2008-08-13T00:15:11+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;m about to head off on vacation, so this seemed like as good a time as any to kick this out of my drafts folder&amp;#8230;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt; As some of you know, I&amp;#8217;ve been doing the &lt;a href=&quot;http://openplans.org/projects/brainpower&quot;&gt;brainpower&lt;/a&gt; project as a &lt;a href=&quot;http://www.djangobook.com/en/1.0/chapter06/&quot;&gt;Django admin&lt;/a&gt; application.
&lt;/p&gt;
&lt;p&gt;The reasons for this decision were:&lt;br /&gt;
  
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django admin is touted as a very quick way to build CRUD applications, since it generates a UI from your model that in many cases is good enough for end users. No forms to write, maybe just a little tweaking. Brainpower is nothing other than a simple CRUD application, so this sounded like a perfect match.&lt;br /&gt;
   &lt;/li&gt;
&lt;li&gt;Good excuse to learn a little about Django.&lt;br /&gt;
   &lt;/li&gt;
&lt;li&gt;Get me to do something other than Zope for once in my freakin&amp;#8217; life. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  &lt;br /&gt;So how did that pan out?
&lt;/p&gt;
&lt;p&gt;Well, in one month since our first requirements-gathering meeting with our &amp;#8220;customer&amp;#8221; (Liz and Robin from Streetfilms), in addition to all the other stuff I&amp;#8217;ve been doing, I built something they said was good enough to start using. I did in really just a week or so of work, alone, from scratch, with almost zero advance knowledge of Django. I even spent some time testing and tuning performance (just enough that I feel confident we won&amp;#8217;t ever have a problem with it). This also includes a full suite of Flunc tests; a random content generation script that I used for the performance tests; and a build script for development &amp;amp; deployment using Fassembler.
&lt;/p&gt;
&lt;p&gt;The core code is tiny: the bulk of it is in a 250-line models.py module that is reasonably clean.
&lt;/p&gt;
&lt;p&gt; As usual, writing the core code is only a small part of the story. A large portion of my time went to things like figuring out how to conveniently run external functional tests against django with a scratch database, writing and fixing the build script, and troubleshooting my initial attempts at deployment (tripping on &lt;a href=&quot;http://code.djangoproject.com/ticket/7595&quot;&gt;a django bug&lt;/a&gt;.).
&lt;/p&gt;
&lt;p&gt;I do have some general early impressions of Django.
&lt;/p&gt;
&lt;h3&gt;Things I liked&lt;br /&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The admin interface is, indeed, pretty slick (with a few minor oddnesses like a pretty useless Time widget).&lt;/li&gt;
&lt;li&gt;If I had another little CRUD app to build that seemed well-matched for Django, I could probably do it &lt;em&gt;ridiculously&lt;/em&gt; fast.&lt;/li&gt;
&lt;li&gt;The Django docs are pretty decent for the most part, much better than the current state of, say, Zope 2 docs, and more extensive and thorough than the Pylons docs. (Too bad I had to quickly un-learn a bunch of stuff when I had to switch to developing against more recent django checkouts.)&lt;/li&gt;
&lt;li&gt;The stable release&amp;#8217;s way to create an admin UI &amp;#8212; by writing an inner class named Admin inside your Model &amp;#8212; smelled really bad to me. Thankfully, this is gone in the newforms-admin branch. Similarly, you used to wire up custom validators inside your Model class and do cleanup in its save() method; now you can do custom validation in a ModelForm subclass, and you can do data cleanup in the same place. Newforms-admin is pretty nice!&lt;br /&gt;
  &lt;/li&gt;
&lt;li&gt;Got a multiple choice field that you need users to be able to extend with new choices?&amp;nbsp; Just add a foreign key field to your model referencing another model, and it just plain works in exactly the way you&amp;#8217;d hope.&amp;nbsp; Slick!&lt;br /&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  
&lt;/p&gt;

&lt;h3&gt;Gripes&lt;br /&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I wish they had used an existing template language, I don&amp;#8217;t see anything compellingly different about Django&amp;#8217;s.&lt;br /&gt;
   &lt;/li&gt;
&lt;li&gt;I wish Django&amp;#8217;s setup.py had a &amp;#8220;develop&amp;#8221; command.&lt;/li&gt;
&lt;li&gt;I wish the tools for syncing your models to your database were more developed. You seem to be entirely on your own for migrations. For example, if you modify the type of a field in a Model, you&amp;#8217;ll likely need to either drop your tables and recreate them, or if you have production data to preserve, either do a dump-modify-restore cycle or hand-hack the database in place to keep your app working. At one point I ended up needing to do a dump-modify-restore using xml exports and lxml transforms; it took longer than I would have liked and I might try another strategy next time. For other model modifications such as adding a field, you might be able to get away with re-running manage.py syncdb; unfortunately I don&amp;#8217;t know how to predict when this will just work and when it won&amp;#8217;t.&lt;/li&gt;
&lt;li&gt;I wish all Django manage.py operations could be performed non-interactively. For example, for my flunc tests I wanted to reliably create and destroy a scratch database with a test admin user. Django provides a way to do most of this, but the commands that create an admin user must be run interactively. I tried using a database fixture, but that didn&amp;#8217;t work reliably &amp;#8212; I&amp;#8217;m wildly guessing there&amp;#8217;s some salt that gets reset and I don&amp;#8217;t know when? I ended up having my test script use &lt;a href=&quot;http://www.noah.org/wiki/Pexpect&quot;&gt;pexpect&lt;/a&gt; to drive the interactive commands.&lt;/li&gt;
&lt;li&gt;It seems I arrived at an inconvenient time. Django 0.96.2 may be the &amp;#8220;latest stable release&amp;#8221;, but it&amp;#8217;s aging. The developers are all focused on a &amp;#8220;newforms-admin&amp;#8221; branch, which is cleaner and more extensible, but this work hasn&amp;#8217;t landed on trunk yet. I don&amp;#8217;t know when that will happen, or what else will change before another stable release. I opted to develop against the old stable release. I thought I was being smartly conservative :-p Unfortunately I soon hit a &lt;a href=&quot;http://code.djangoproject.com/ticket/7528&quot;&gt;really irritating bug&lt;/a&gt;. While trying to understand the admin code enough to find a workaround (and feeling like I was on &lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;q=z+shaped+learning+curve+zope&amp;amp;btnG=Search&quot;&gt;a familiar learning curve&lt;/a&gt;), I was advised to check if trunk still had the same problem, which meant an hour or two adjusting my code to work against trunk. Trunk turned out to fix only half of the problem. Then a week later the bug got fully fixed&amp;#8230; on the newforms-admin branch. So much for trying to stick to a stable release! Maybe I was just unlucky. If I didn&amp;#8217;t need to search fields from a join, I wouldn&amp;#8217;t have hit this bug. (But isn&amp;#8217;t that a common need?)&lt;br /&gt;
   &lt;/li&gt;
&lt;li&gt;Customizing and extending the admin UI is commonly done in a way that also seems &lt;a href=&quot;http://plone.org/documentation/tutorial/creating-plone-themes&quot;&gt;vaguely familiar&lt;/a&gt;: You just make a copy of the thing you want to modify and hack away on it. I&amp;#8217;ve already had a hint of pain with this &amp;#8212; my two modified template copies broke on both Django upgrades. That&amp;#8217;s how things typically go in the Plone world: Every single skin override you did on a Plone site would add a drop of future pain to every Plone upgrade you ever tried to do.
&lt;p&gt;This is a hard problem to solve. Just as Plone did, Django admin seems to be gradually adding more plug-in extension points so you don&amp;#8217;t have to override the core templates as often; instead you just flip some configuration switch and/or add another template that magically gets slurped into the right place. Which has its own headaches, as every one of those bits of flexibility adds to the learning curve.&amp;nbsp; Let&amp;#8217;s hope &lt;a href=&quot;http://en.wikipedia.org/wiki/Greenspun's_Tenth_Rule&quot;&gt;Greenspun&amp;#8217;s Tenth&lt;/a&gt; doesn&amp;#8217;t grow a corollary substituting Plone for Lisp :-]&lt;br /&gt;
  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  &lt;/p&gt;</content>
		<author>
			<name>TOPP Engineering</name>
			<uri>http://www.openplans.org/projects/topp-engineering/blog</uri>
		</author>
		<source>
			<title type="html">Topp Engineering</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/topp-engineering/blog/feed"/>
			<id>http://www.openplans.org/projects/topp-engineering/blog/feed</id>
			<updated>2008-08-28T07:05:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Opencore 0.13 released with Plone 3 support</title>
		<link href="http://www.openplans.org/projects/opencore/blog/2008/08/12/opencore-013-released-with-plone-3-support/"/>
		<id>http://www.openplans.org/projects/opencore/blog/2008/08/12/opencore-013-released-with-plone-3-support/</id>
		<updated>2008-08-12T23:58:26+00:00</updated>
		<content type="html">&lt;h3&gt;What&amp;#8217;s New in Opencore 0.13&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;The biggest changes in this release are:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plone 3 required!&lt;br /&gt;
   &lt;/li&gt;
&lt;li&gt;Many things are noticeably faster, because Plone 3 is faster than Plone 2.5.&lt;/li&gt;
&lt;li&gt;Lots of minor bugfixes and usability improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; For more details, see CHANGES.txt in the opencore source.&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;This release also &lt;strong&gt;requires a data migration&lt;/strong&gt; that is &lt;strong&gt;not backward compatible!&lt;/strong&gt; Let me say that again:
&lt;/p&gt;
&lt;h3&gt;This release requires you to run a data migration that is not backward-compatible.&lt;br /&gt;
&lt;/h3&gt;
&lt;h3&gt; &lt;em&gt;Once you upgrade, you can&amp;#8217;t go back.&lt;/em&gt;&lt;br /&gt;
&lt;/h3&gt;
&lt;h2&gt;Always Make Backups!&lt;br /&gt;
  &lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;Ahem.
&lt;/p&gt;
&lt;p&gt;Also, if you have your own code that runs on top of opencore, you should plan on doing thorough testing and may need to modify your code to run under Plone 3.
&lt;/p&gt;
&lt;h3&gt;How to Upgrade&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;First, make a backup of your ZODB.
&lt;/p&gt;
&lt;p&gt;Next, run a pre-upgrade migration as described here:&lt;br /&gt;
  &lt;br /&gt;https://svn.openplans.org/svn/opencore/trunk/docs/Plone2.5-Plone3-migration.txt&lt;br /&gt;
  &lt;br /&gt;Note that you need to be on &lt;strong&gt;Opencore 0.12.1 &lt;/strong&gt;(or later, if we ever do an 0.12.2 etc.) to have that migration script available. So if you&amp;#8217;re running an earlier version, you&amp;#8217;ll need to upgrade to 0.12.1 first.&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;Then you&amp;#8217;re ready to upgrade to 0.13. For this upgrade, I highly recommend leaving your old build alone in case something goes wrong, and create a new build from scratch in a parallel directory. As with previous releases, Opencore still doesn’t work via easy_install, you have to get it by checking out the tag from subversion: &lt;a href=&quot;https://svn.openplans.org/svn/opencore/tags/0.13.0&quot;&gt;https://svn.openplans.org/svn/opencore/tags/0.13.0&lt;/a&gt; and then install using python setup.py develop. You&amp;#8217;d also have to install Zope 2.10 and our &lt;a href=&quot;https://svn.openplans.org/eggs/openplans-bundle-opencore-plone30-20080804.tar.bz2&quot;&gt;plone 3 Products tarball. &lt;/a&gt; Or use &lt;a href=&quot;http://www.openplans.org/projects/opencore/getting-started&quot;&gt;TOPP’s usual build tools&lt;/a&gt; which will do all that for you.
&lt;/p&gt;
&lt;p&gt;I highly recommend the latter approach, it&amp;#8217;s a lot more convenient. We have requirements profiles ready for you to build:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For a pretty stripped down opencore build (just Opencore, Zope, Zeo, and supervisor; no Tasktracker, no Wordpress, etc.), you can use these requirements: https://svn.openplans.org/svn/build/requirements/opencore-minimal/tags/opencore-0.13.0&lt;/li&gt;
&lt;li&gt;For a full-featured build like openplans.org, with wordpress and tasktracker and everything, you can use these requirements: https://svn.openplans.org/svn/build/requirements/openplans/branches/opencore-0.13&lt;br /&gt;
  &lt;br /&gt;&amp;#8230; although I&amp;#8217;m not sure that&amp;#8217;s the right place for that requirements set; Doug Mayle, the deployment manager, could overrule me and put it somewhere else. I&amp;#8217;d suggest keeping an eye on &lt;a href=&quot;https://svn.openplans.org/svn/build/requirements/releases&quot;&gt;https://svn.openplans.org/svn/build/requirements/releases&lt;/a&gt; where the final requirements are likely to show up once Doug does all his work to prepare for deploying to openplans.org. That would also be a good sign that we&amp;#8217;re getting confident enough to deploy it ourselves &lt;img src=&quot;http://www.openplans.org/projects/opencore/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After you upgrade, you&amp;#8217;ll need to run the post-upgrade migrations. Again, see:&lt;br /&gt;
  &lt;br /&gt;https://svn.openplans.org/svn/opencore/trunk/docs/Plone2.5-Plone3-migration.txt
&lt;/p&gt;
&lt;p&gt;Start things up and you should be all set!
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Special Thanks&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;The Plone 3 porting was almost entirely performed by Rob Miller. It was a big job, thanks Rob for moving us forward!
&lt;/p&gt;
&lt;h3&gt;Support&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;As always, if you have any problems, contact us on the opencore-users mailing list or look us up on the #openplans IRC channel on freenode.&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;I will be on vacation until 2008/08/25. Good luck while I&amp;#8217;m gone &lt;img src=&quot;http://www.openplans.org/projects/opencore/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt;&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;
  &lt;br /&gt;&amp;#8211; Paul Winkler
&lt;/p&gt;
&lt;p&gt;
  &lt;/p&gt;</content>
		<author>
			<name>OpenCore Blog Posts</name>
			<uri>http://www.openplans.org/projects/opencore/blog</uri>
		</author>
		<source>
			<title type="html">OpenCore Software</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/opencore/blog/feed/"/>
			<id>http://www.openplans.org/projects/opencore/blog/feed/</id>
			<updated>2008-08-28T07:05:03+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from whitmo] Sam Ruby: Life after Bug Tracking Systems</title>
		<link href="http://intertwingly.net/blog/2008/07/18/Life-after-Bug-Tracking-Systems"/>
		<id>http://intertwingly.net/blog/2008/07/18/Life-after-Bug-Tracking-Systems</id>
		<updated>2008-08-11T17:27:13+00:00</updated>
		<content type="html">Interesting view on using your SCM to communicate.</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from whitmo] The Chandler Project Blog » Blog Archive » Chandler 1.0!</title>
		<link href="http://blog.chandlerproject.org/2008/08/08/chandler-10/"/>
		<id>http://blog.chandlerproject.org/2008/08/08/chandler-10/</id>
		<updated>2008-08-10T22:22:57+00:00</updated>
		<content type="html">omg... chandler beat opencore to 1.0!?!??!?! (insert pithy quote about the quantum reality of release numbers)</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from whitmo] Python Package Index : z3c.versionedresource 0.3.0</title>
		<link href="http://pypi.python.org/pypi/z3c.versionedresource/0.3.0"/>
		<id>http://pypi.python.org/pypi/z3c.versionedresource/0.3.0</id>
		<updated>2008-08-10T22:12:40+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Happy Birthday PotteryBlog</title>
		<link href="http://blog.ianbicking.org/2008/08/10/happy-birthday-potteryblog/"/>
		<id>http://blog.ianbicking.org/2008/08/10/happy-birthday-potteryblog/</id>
		<updated>2008-08-10T19:15:15+00:00</updated>
		<content type="html">&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;A happy 4th Birthday &lt;a class=&quot;reference external&quot; href=&quot;http://potteryblog.com/2008/08/four-years-of-pottery-blog.html&quot;&gt;Emily&amp;#8217;s Blog&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Ian Bicking</name>
			<uri>http://blog.ianbicking.org</uri>
		</author>
		<source>
			<title type="html">Ian Bicking: a blog</title>
			<link rel="self" href="http://blog.ianbicking.org/feed/"/>
			<id>http://blog.ianbicking.org/feed/</id>
			<updated>2008-08-10T20:05:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Is there a good reason for this to be annoying?</title>
		<link href="http://www.openplans.org/projects/melkjug/blog/2008/08/10/is-there-a-good-reason-for-this-to-be-annoying/"/>
		<id>http://www.openplans.org/projects/melkjug/blog/2008/08/10/is-there-a-good-reason-for-this-to-be-annoying/</id>
		<updated>2008-08-10T19:12:30+00:00</updated>
		<content type="html">&lt;p&gt; ­&lt;img alt=&quot;dice.jpg&quot; src=&quot;http://www.openplans.org/projects/melkjug/attachments/dice.jpg&quot; align=&quot;right&quot; height=&quot;120&quot; width=&quot;120&quot; /&gt;For some reason my imaginary version of SQL has some nice operations to take a r­andom sample of rows from some table.&amp;nbsp; In reality, the most common query that I&amp;#8217;ve seen is something like:
&lt;/p&gt;
&lt;pre&gt;SELECT * FROM sometable ORDER BY RAND() LIMIT ­samplesize&lt;/pre&gt;
&lt;p&gt;In MySQL, this appears to do just what it says: generate a random number for every row then sort them and return the lowest few &amp;#8212; which is prohibitively slow for any reasonably big table.
&lt;/p&gt;
&lt;p&gt;If you know the identifiers of rows in the table and they form a gapless sequence, the story is somewhat better;&amp;nbsp; you can generate samplesize random numbers from the range and select those identifiers.&amp;nbsp; Of course, this is generally not the case (and almost begs the question).&amp;nbsp; The best approach along these lines that I&amp;#8217;ve seen requires maintaining a table that maps from a gapless sequence of integers to the identifiers of the table that you want to sample from using a bunch of triggers &amp;#8212; &lt;a href=&quot;http://jan.kneschke.de/projects/mysql/order-by-rand&quot;&gt;http://jan.kneschke.de/projects/mysql/order-by-rand&lt;/a&gt; .
&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also unsure of the right way to tackle this in databases like couchdb or the appengine datastore.&amp;nbsp; Maybe a similar tactic with views/query indexes? Anyone implemented anything similar?&lt;br /&gt;
  &lt;/p&gt;</content>
		<author>
			<name>ltucker</name>
			<uri>http://www.openplans.org/projects/melkjug/blog</uri>
		</author>
		<source>
			<title type="html">Melkjug Project</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/melkjug/blog/feed/atom/"/>
			<id>http://www.openplans.org/projects/melkjug/blog/feed/atom/</id>
			<updated>2008-08-28T07:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from greebsnarf] virtualenvwrapper | And Now For Something Completely Different</title>
		<link href="http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html"/>
		<id>http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html</id>
		<updated>2008-08-09T19:40:28+00:00</updated>
		<content type="html">Commands for working with multiple virtualenvs (creating, removing, and switching active environments)</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from ianb] byCycle.org - Bicycle Trip Planner - Portland, OR, metro region</title>
		<link href="http://bycycle.org/regions/portlandor/geocodes;find?q=-122.67745971679688%2C45.51548937545859"/>
		<id>http://bycycle.org/regions/portlandor/geocodes;find?q=-122.67745971679688%2C45.51548937545859</id>
		<updated>2008-08-07T17:12:51+00:00</updated>
		<content type="html">The street data for this bicycle mapping seems to have improved (still just for Portland and Milwaukee though)</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from scrollie] nyc-travails-5016 on Flickr - Photo Sharing!</title>
		<link href="http://www.flickr.com/photos/jwillys/2718713790/in/set-72157606566769262/"/>
		<id>http://www.flickr.com/photos/jwillys/2718713790/in/set-72157606566769262/</id>
		<updated>2008-08-07T01:44:22+00:00</updated>
		<content type="html">I was skimming through a photoset on Flickr entitled &amp;quot;Rich People Rooftops NYC&amp;quot; and happened across this image of Lime HQ.</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">melkjug redesign concept</title>
		<link href="http://www.openplans.org/projects/melkjug/blog/2008/08/06/melkjug-redesign-concept/"/>
		<id>http://www.openplans.org/projects/melkjug/blog/2008/08/06/melkjug-redesign-concept/</id>
		<updated>2008-08-06T15:53:05+00:00</updated>
		<content type="html">&lt;p&gt;Here&amp;#8217;s some snazzy eyecandy from Phil&amp;#8217;s work on sprucing up the melkjug user interface.&amp;nbsp; Speaks for itself I think :)&lt;/p&gt;
&lt;p&gt;­&lt;a href=&quot;http://www.openplans.org/projects/melkjug/attachments/melkjug_redesign_concept.png&quot;&gt;­&lt;img alt=&quot;melkjug_redesign_concept_small.png&quot; src=&quot;http://www.openplans.org/projects/melkjug/attachments/melkjug_redesign_concept_small.png&quot; height=&quot;519&quot; width=&quot;600&quot; /&gt;&lt;/a&gt; ­ ­&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>ltucker</name>
			<uri>http://www.openplans.org/projects/melkjug/blog</uri>
		</author>
		<source>
			<title type="html">Melkjug Project</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/melkjug/blog/feed/atom/"/>
			<id>http://www.openplans.org/projects/melkjug/blog/feed/atom/</id>
			<updated>2008-08-28T07:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from cabraham] Malwebolence - The World of Web Trolling - NYTimes.com</title>
		<link href="http://www.nytimes.com/2008/08/03/magazine/03trolls-t.html"/>
		<id>http://www.nytimes.com/2008/08/03/magazine/03trolls-t.html</id>
		<updated>2008-08-06T13:13:38+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The Chicago GAE Hack-a-thon and App Engine wikis</title>
		<link href="http://www.openplans.org/projects/topp-engineering/blog/2008/08/05/the-chicago-gae-hack-a-thon-and-app-engine-wikis/"/>
		<id>http://www.openplans.org/projects/topp-engineering/blog/2008/08/05/the-chicago-gae-hack-a-thon-and-app-engine-wikis/</id>
		<updated>2008-08-05T18:44:00+00:00</updated>
		<content type="html">&lt;p&gt;Last week I attended the &lt;a href=&quot;http://googleappengine.blogspot.com/2008/07/app-engine-hack-thon-chicago.html&quot;&gt;Chicago Google App Engine Hack-A-Thon&lt;/a&gt;, which was a small day-long event to hang out at the Chicago Google offices and work on things related to App Engine.
&lt;/p&gt;
&lt;p&gt;I was hoping for something structured more like a &lt;a href=&quot;http://www.onlamp.com/pub/a/python/2006/10/19/running-a-sprint.html&quot;&gt;coding sprint&lt;/a&gt;, where people would work together on small projects. I think some other people were also expecting something like this, but the day kind of wandered by without any clear &amp;#8220;let&amp;#8217;s start doing stuff together&amp;#8221; moment, and the opportunity was lost. Some people followed a tutorial given by Marzia Niccolai, some worked on their own projects, and there was a bit of chatting.
&lt;/p&gt;
&lt;p&gt;I started working on a simple project I&amp;#8217;d started to make a very (very) simple &lt;a href=&quot;http://svn.colorstudy.com/home/ianb/PickyWiki/trunk&quot;&gt;CMS/Wiki&lt;/a&gt;. After playing with Javascript for a little while I was chatting about wikis and &lt;a href=&quot;http://moinmo.in/&quot;&gt;MoinMoin&lt;/a&gt; came up. After a quick look at the code I realized it was very tightly bound to the filesystem, and lacked even the most basic abstraction layer for storage. MoinMoin &lt;em&gt;should&lt;/em&gt; have an abstraction layer, but I wasn&amp;#8217;t really inclined to work on that. Instead I thought: why not try a fake writable filesystem?
&lt;/p&gt;
&lt;p&gt;I knew from the start that the idea was a bit absurd. The App Engine data store isn&amp;#8217;t much like a filesystem. Files are quick to read and write, okay for scanning, hard to query. The data store is okay to read and write, very slow to scan, and easy to query. But I figured there was some hack value to it.
&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know that I really accomplished my goal, but I did get &lt;a href=&quot;http://appengine-monkey.googlecode.com/svn/trunk/module-replacements/filesystem.py&quot;&gt;some code&lt;/a&gt; in &lt;a href=&quot;http://code.google.com/p/appengine-monkey/&quot;&gt;appengine-monkey&lt;/a&gt;. It &lt;em&gt;kind of&lt;/em&gt; worked, but my strategy was probably wrong: I simulated an entire filesystem, except those places that were mingled with code (where templates would typically be stored). Instead I should have required explicit locations that would be handled by the data store (e.g., &lt;code&gt;/wiki-data&lt;/code&gt;). Python doesn&amp;#8217;t expect file operations to lead to a lot of Python routines, and there were some circular situations deep in the Python code as a result. I seemed to mostly work those out, but didn&amp;#8217;t actually get MoinMoin to render anything, I only got it to work &lt;em&gt;very&lt;/em&gt; hard on the slow process of setting up its files.
&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been a little annoyed with the App Engine environment from the start, because it left out lots of routines that are present in every other environment (e.g., &lt;code&gt;os.utime&lt;/code&gt;). You can&amp;#8217;t use these routines in App Engine because there is no file writing. But it would all be more sensible if every call to these routines just raised a permission error. This is the kind of error that existing code understands. Instead you can&amp;#8217;t even import the routines, making App Engine incompatible with lots of existing code. That would be fine except the incompatibility is so &lt;em&gt;trivial&lt;/em&gt;. appengine-monkey seeks to relieve some of this, but it would be much simpler if it was just there in the platform to start with.
&lt;/p&gt;
&lt;p&gt;­Conclusion? Porting code is hard, but porting old, organically developed code like MoinMoin is &lt;em&gt;really&lt;/em&gt; hard. And App Engine still needs a good wiki.&lt;/p&gt;</content>
		<author>
			<name>TOPP Engineering</name>
			<uri>http://www.openplans.org/projects/topp-engineering/blog</uri>
		</author>
		<source>
			<title type="html">Topp Engineering</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/topp-engineering/blog/feed"/>
			<id>http://www.openplans.org/projects/topp-engineering/blog/feed</id>
			<updated>2008-08-28T07:05:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from ianb] Python Package Index : EggFreezer</title>
		<link href="http://pypi.python.org/pypi/EggFreezer/"/>
		<id>http://pypi.python.org/pypi/EggFreezer/</id>
		<updated>2008-08-05T16:33:35+00:00</updated>
		<content type="html">Creates a bundle of all packages for an installation.  Could be a nice complement to some other installation stuff we have.</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">moongifted</title>
		<link href="http://www.openplans.org/projects/melkjug/blog/2008/08/05/moongifted/"/>
		<id>http://www.openplans.org/projects/melkjug/blog/2008/08/05/moongifted/</id>
		<updated>2008-08-05T15:25:35+00:00</updated>
		<content type="html">&lt;p&gt; &lt;img alt=&quot;japan.png&quot; src=&quot;http://www.openplans.org/projects/melkjug/attachments/japan.png&quot; align=&quot;right&quot; height=&quot;134&quot; width=&quot;130&quot; /&gt;Melkjug was featured on the japanese tech blog &lt;a href=&quot;http://moongift.jp&quot;&gt;moongift&lt;/a&gt; yesterday &amp;#8212; thanks guys! Here&amp;#8217;s &lt;a href=&quot;http://www.moongift.jp/2008/08/melkjug/&quot;&gt;the original&lt;/a&gt;, and &lt;a href=&quot;http://translate.google.com/translate?u=http://www.moongift.jp/2008/08/melkjug/&amp;amp;hl=en&amp;amp;ie=UTF8&amp;amp;sl=ja&amp;amp;tl=en&quot;&gt;google&amp;#8217;s translation&lt;/a&gt;.&amp;nbsp; We probably aren&amp;#8217;t as prepared for international visitors as we ought to be, but I hope everyone is finding the site to be usable.&amp;nbsp; I put a quick patch through to fix up filtering using non latin parameters.&amp;nbsp; &lt;a href=&quot;http://melkjug.org/feedback&quot;&gt;Please let us know if you run into any problems&lt;/a&gt;! Suggestions ( and translations ^_^ ) are welcome.&lt;br /&gt;
  &lt;/p&gt;</content>
		<author>
			<name>ltucker</name>
			<uri>http://www.openplans.org/projects/melkjug/blog</uri>
		</author>
		<source>
			<title type="html">Melkjug Project</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/melkjug/blog/feed/atom/"/>
			<id>http://www.openplans.org/projects/melkjug/blog/feed/atom/</id>
			<updated>2008-08-28T07:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from closedplans] Label placement</title>
		<link href="http://css-tricks.com/label-placement-on-forms/"/>
		<id>http://css-tricks.com/label-placement-on-forms/</id>
		<updated>2008-08-04T18:20:16+00:00</updated>
		<content type="html">An interesting look at web forms, with an eye towards design and user interaction...</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from closedplans] Erlang services as middleware</title>
		<link href="http://debasishg.blogspot.com/2008/08/erlang-as-middleware.html"/>
		<id>http://debasishg.blogspot.com/2008/08/erlang-as-middleware.html</id>
		<updated>2008-08-04T17:34:16+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Getting data in and out of listen</title>
		<link href="http://www.openplans.org/projects/topp-engineering/blog/2008/08/04/getting-data-in-and-out-of-listen/"/>
		<id>http://www.openplans.org/projects/topp-engineering/blog/2008/08/04/getting-data-in-and-out-of-listen/</id>
		<updated>2008-08-04T15:45:38+00:00</updated>
		<content type="html">&lt;p&gt;­­­­Robert Marianski and I have been working on adding the ability to import and export data from &lt;a href=&quot;http://www.openplans.org/projects/listen/project-home&quot;&gt;listen&lt;/a&gt; mailing lists&lt;sup&gt;*&lt;/sup&gt;. Specifically, we&amp;#8217;ve been working on exporting mailing list subscribers to CSV files, exporting messages as mbox files, and importing mbox files into the mailing list archive.&lt;/p&gt;
&lt;p&gt;By far the most interesting of these is importing mbox files into the mailing list archive. First (along with exporting) it allows for a new use case: Transitioning from one list to another. This gives users more flexibility and helps to avoid lock-in.&lt;/p&gt;
&lt;p&gt;Second, it presents some challenging design problems. Importing can be seen in some respects as a relatively &amp;#8220;dangerous&amp;#8221; operation, as in the process it&amp;#8217;s possible to accidentally import the wrong file or even import a corrupt file (this is in fact is something that&amp;#8217;s gotten me in the past while migrating from one mail client to another; my &amp;#8220;solution&amp;#8221; involved manually deleting a lot of messages and then editing the source of the mbox file to fix the errors, hardly something that most users would ever want to do). In either case, your mailing list archive is now polluted with a bunch of messages you don&amp;#8217;t want there. Worse, listen doesn&amp;#8217;t currently support deleting messages from the archive, meaning once messages are in the archive, there&amp;#8217;s no getting them out.&lt;/p&gt;
&lt;p&gt;The question is, how do you prevent this from happening? One way to at least mitigate the issue is to give a confirmation warning before actually importing the messages into the archive. This may help in the event that the user accidentally selected the wrong file, but it&amp;#8217;s hardly ideal and it&amp;#8217;s still quite possible something could go wrong. Even better would be to show a preview of the messages that would be imported and let the user look at them to make sure they are correct. But this brings with it its own set of questions: How large should the preview be? Should the full messages be shown or just some of the headers? Do you make the user submit the file twice (once initially, once again when confirming) or do you store it on the server? What happens if the user never clicks anything on the confirmation page? What happens when the user confirms and then changes his mind?&lt;/p&gt;
&lt;p&gt;Rob and I quickly realized that this was a case of &lt;a href=&quot;http://www.alistapart.com/articles/neveruseawarning&quot;&gt;using a warning when we really meant undo&lt;/a&gt;. What would be most useful for a user would be to be able to &lt;em&gt;undo&lt;/em&gt; any import &amp;#8212; at any time.&lt;/p&gt;
&lt;p&gt;From a technical standpoint, this is actually not too complicated (save for a few nasty and hard to isolate Zope bugs, which I won&amp;#8217;t bore you all with here&amp;#8230;). All we had to do was store the message IDs, along with some other meta data (e.g., the time of the import), and provide an interface for removing just those messages from the archive. And this is exactly what we did: You can now remove any messages associated with any past import, even if you&amp;#8217;ve subsequently imported other messages after them.
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;The branch we worked on is &lt;a href=&quot;http://svn.plone.org/svn/collective/listen/branches/export/&quot;&gt;here&lt;/a&gt;, and here&amp;#8217;s a screenshot to give you a better idea of what we did:
&lt;/p&gt;
&lt;p&gt;
  
&lt;/p&gt;
&lt;p&gt; &lt;img alt=&quot;import.png&quot; src=&quot;http://www.openplans.org/projects/topp-engineering/project-home/import.png&quot; height=&quot;306&quot; width=&quot;735&quot; /&gt;&lt;/p&gt;
&lt;p&gt;* There were a few days a couple weeks ago that I&amp;#8217;ve missed chronicling so far. During those days Anil and I worked on the Feed Me plugin for WordPress, which makes it easy to incorporate feeds from Delicious, Flickr, and YouTube into any WordPress blog. The plugin has been used by Streetsblog for a while , but we generalized it and added a handy admin interface that lets you easily customize the number and type of feeds used. Check out the &lt;a href=&quot;http://www.openplans.org/projects/feed-me-plugin/blog/&quot;&gt;project page&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>TOPP Engineering</name>
			<uri>http://www.openplans.org/projects/topp-engineering/blog</uri>
		</author>
		<source>
			<title type="html">Topp Engineering</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/topp-engineering/blog/feed"/>
			<id>http://www.openplans.org/projects/topp-engineering/blog/feed</id>
			<updated>2008-08-28T07:05:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from nicholasbs] Why Free Software has poor usability, and how to improve it</title>
		<link href="http://mpt.net.nz/archive/2008/08/01/free-software-usability"/>
		<id>http://mpt.net.nz/archive/2008/08/01/free-software-usability</id>
		<updated>2008-08-03T16:35:29+00:00</updated>
		<content type="html">A decent look at some of the challenges faced by the FOSS community in developing well-designed UIs, as well as suggestions of how we can do better.</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Doctest Wishlist</title>
		<link href="http://blog.ianbicking.org/2008/07/31/a-doctest-wishlist/"/>
		<id>http://blog.ianbicking.org/2008/07/31/a-doctest-wishlist/</id>
		<updated>2008-08-01T04:11:11+00:00</updated>
		<content type="html">&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;Lately I&amp;#8217;ve been doing most of my testing with &lt;a class=&quot;reference external&quot; href=&quot;http://python.org/doc/current/lib/module-doctest.html&quot;&gt;doctest&lt;/a&gt;, primarily using &lt;a class=&quot;reference external&quot; href=&quot;http://python.org/doc/current/lib/doctest-simple-testfile.html&quot;&gt;stand-alone text files&lt;/a&gt;.  I generally like it (otherwise I wouldn&amp;#8217;t be using it), but it does make me frustrated with doctest sometimes.  On my wishlist (roughly in order):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;I wish output was always displayed, even when there&amp;#8217;s an exception.  I see no reason for the current behavior.  Really exceptions could be treated like any other output (if ELLIPSIS was on by default).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;I wish you could turn on options like ELLIPSIS from within a doctest, for all expressions.  (&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;doctest:&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;+ELLIPSIS&lt;/span&gt;&lt;/tt&gt; on every line is beyond ugly.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;&amp;lt;BLANKLINE&amp;gt;&lt;/span&gt;&lt;/tt&gt; is terribly ugly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;There&amp;#8217;s no way of saying &amp;quot;I don&amp;#8217;t care what this prints&amp;quot;.  You can&amp;#8217;t do:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
&amp;gt;&amp;gt;&amp;gt; some_function()
...
&lt;/pre&gt;
&lt;p&gt;because the &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;&amp;#8230;&lt;/span&gt;&lt;/tt&gt; is treated like a continuation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;Plugging in an alternate output checker is kind of tedious, and can&amp;#8217;t be done from within a doctest (without horrible hacks).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;I&amp;#8217;d like to be able to easily jump into an interactive state from doctest.  Maybe &lt;a class=&quot;reference external&quot; href=&quot;http://python.org/doc/current/lib/module-pdb.html&quot;&gt;pdb&lt;/a&gt; can do this, but I&amp;#8217;ve never figured that out exactly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;Getting &lt;a class=&quot;reference external&quot; href=&quot;http://code.google.com/p/python-nose/&quot;&gt;nose&lt;/a&gt; to run &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;.txt&lt;/span&gt;&lt;/tt&gt; files as doctests is really hard, involving a combination of options I always forget.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;There&amp;#8217;s no way to abort the doctest.  Sometimes I&amp;#8217;d like to run some environment checks early on, and be able to stop the test if they fail.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;I wish it was easier to apply to non-Python code.  (I&amp;#8217;ve adapted it via subclassing &lt;a class=&quot;reference external&quot; href=&quot;http://pylogo.org/&quot;&gt;for Logo&lt;/a&gt; but I wouldn&amp;#8217;t do that often.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;I wish I could copy and paste from doctests to consoles.  But I don&amp;#8217;t see any solution to this problem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;The &lt;a class=&quot;reference external&quot; href=&quot;http://python.org/doc/current/lib/doctest-unittest-api.html&quot;&gt;integration&lt;/a&gt; with &lt;a class=&quot;reference external&quot; href=&quot;http://python.org/doc/current/lib/module-unittest.html&quot;&gt;unittest&lt;/a&gt; is pretty hacky.  Not that I&amp;#8217;ve used unittest in years.  But some other test frameworks build off this integration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;first&quot;&gt;&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;python&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;doctest&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;sometest.txt&lt;/span&gt;&lt;/tt&gt; doesn&amp;#8217;t do what it should do.  Instead it runs doctest&amp;#8217;s self-tests.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content>
		<author>
			<name>Ian Bicking</name>
			<uri>http://blog.ianbicking.org</uri>
		</author>
		<source>
			<title type="html">Ian Bicking: a blog</title>
			<link rel="self" href="http://blog.ianbicking.org/feed/"/>
			<id>http://blog.ianbicking.org/feed/</id>
			<updated>2008-08-10T20:05:13+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Comment on Moving to a new deployment structure by admin</title>
		<link href="http://www.openplans.org/projects/operations/blog/2008/07/24/moving-to-a-new-deployment-structure/#comment-45"/>
		<id>http://www.openplans.org/projects/operations/blog/2008/07/24/moving-to-a-new-deployment-structure/#comment-45</id>
		<updated>2008-07-31T20:35:22+00:00</updated>
		<content type="html">&lt;p&gt;Yay. This also is a necessary prerequisite to running both stacks at once behind a load balancer, which we&amp;#8217;ve been wanting for a while. RA is working on that.&lt;/p&gt;</content>
		<author>
			<name>Operations Blog Comments</name>
			<uri>http://www.openplans.org/projects/operations/blog</uri>
		</author>
		<source>
			<title type="html">Comments for operations</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/operations/blog/comments/feed/"/>
			<id>http://www.openplans.org/projects/operations/blog/comments/feed/</id>
			<updated>2008-08-28T07:05:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">OpenID Support is Coming</title>
		<link href="http://www.openplans.org/projects/melkjug/blog/2008/07/31/openid-support-is-coming/"/>
		<id>http://www.openplans.org/projects/melkjug/blog/2008/07/31/openid-support-is-coming/</id>
		<updated>2008-07-31T19:54:41+00:00</updated>
		<content type="html">&lt;p align=&quot;left&quot;&gt; A Melkjug user recently used the Feedback link on the site to recommend support for OpenID. Luke quickly forwarded the idea to the melkjug-dev list asking if anyone wanted to pick up the task. I stepped up.
&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;Thankfully, there exists a very nice &lt;a href=&quot;http://openidenabled.com/python-openid/&quot;&gt;python-openid&lt;/a&gt; package. The documentation assumes some knowledge of OpenID &lt;a href=&quot;http://openid.net/developers/specs/&quot;&gt;specifications&lt;/a&gt;, so I had to do some digging there to understand how I was supposed to extract identity information from the response.
&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;Here&amp;#8217;s a nice screenshot of me logging in using OpenID:
&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;&lt;img alt=&quot;openid_login.png&quot; src=&quot;http://www.openplans.org/projects/melkjug/attachments/openid_login.png&quot; height=&quot;327&quot; width=&quot;613&quot; /&gt;&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;The only tricky part to get working was Simple Registration. The OpenID specifications include a way to request Simple Registration information from the provider. In our case, we need a nickname and an e-mail address. Nicknames are used internally by Melkjug to find user&amp;#8217;s jugs. For example, my full reading list exists at http://melkjug.org/tilgovi/full.
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;in some cases, the OpenID provider does not honor the Simple Registration request. In other cases, the user fails to supply the proper information. In these cases, Melkjug will ask for the additional required information before allowing you to sign up with your OpenID (see screenshot). If everything looks good, you&amp;#8217;re in!
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;&lt;img alt=&quot;openid_signup.png&quot; src=&quot;http://www.openplans.org/projects/melkjug/attachments/openid_signup.png&quot; height=&quot;328&quot; width=&quot;613&quot; /&gt;&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Look out for OpenID logins in the next release of Melkjug.&lt;br /&gt;
  &lt;/p&gt;</content>
		<author>
			<name>rleeds</name>
			<uri>http://www.openplans.org/projects/melkjug/blog</uri>
		</author>
		<source>
			<title type="html">Melkjug Project</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/melkjug/blog/feed/atom/"/>
			<id>http://www.openplans.org/projects/melkjug/blog/feed/atom/</id>
			<updated>2008-08-28T07:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[ 10:29 Thursday, July 31, 2008 ]:</title>
		<link href="http://bitsyblog.biz/jhammel/20080731102927"/>
		<id>http://bitsyblog.biz/jhammel/20080731102927</id>
		<updated>2008-07-31T10:29:27+00:00</updated>
		<content type="html">trac is legos One of the first sentences on http://trac.edgewall.org is ...</content>
		<author>
			<name>BitsyBlog for jhammel</name>
			<uri>http://bitsyblog.biz/jhammel</uri>
		</author>
		<source>
			<title type="html">jhammel's blog</title>
			<subtitle type="html">latest blog entries for jhammel on bitsyblog</subtitle>
			<link rel="self" href="http://bitsyblog.biz/jhammel/rss"/>
			<id>http://bitsyblog.biz/jhammel/rss</id>
			<updated>2008-08-28T07:05:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">melkjug 0.3 is released</title>
		<link href="http://www.openplans.org/projects/melkjug/blog/2008/07/30/melkjug-03-is-released/"/>
		<id>http://www.openplans.org/projects/melkjug/blog/2008/07/30/melkjug-03-is-released/</id>
		<updated>2008-07-30T20:19:38+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img alt=&quot;launch.jpg&quot; src=&quot;http://www.openplans.org/projects/melkjug/attachments/launch.jpg&quot; align=&quot;right&quot; height=&quot;195&quot; width=&quot;130&quot; /&gt;The 0.3 release focuses on lowering barriers to entry for new users based on the work Sonali and Bryan have been putting in.&amp;nbsp; Most importantly, you can now check out the functionality of the site without creating an account and save what you make if you choose to sign up.&amp;nbsp; We&amp;#8217;ve also added a more informative &amp;#8220;about&amp;#8221; page, made the text more consistent overall and put better blank slates in place.&amp;nbsp; There&amp;#8217;s still a long way to go on this to get it where we want it, but I like how this first pass turned out.
&lt;/p&gt;
&lt;p&gt;For existing users, we&amp;#8217;ve implemented some of the most requested features/fixes like sharing links via email / facebook etc, an option to keep you logged in after closing the browser, improvements to speed,&amp;nbsp; and elimination of certain annoying duplicate articles.&amp;nbsp; We have also moved all management of feeds back into the normal reading window and moved the detailed configuration of filters out of the sidebar and into lightbox dialogs.&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;Of particular note is Josh&amp;#8217;s work to allow the tag filter to use multiple tags at once resulting from Bryan&amp;#8217;s work trying to put together a decent demo. &amp;nbsp; This makes tag filtering&amp;#8230; actually kind of useful.&amp;nbsp; Using this, you can group together related tags to represent a concept, or create clusters of synonymous tags to correct for differences between blogs.&amp;nbsp; Enjoy!
&lt;/p&gt;
&lt;p&gt;try it out at &lt;a href=&quot;http://melkjug.org&quot;&gt;melkjug.org&lt;/a&gt; &amp;#8212; download it at &lt;a href=&quot;http://melkjug.openplans.org&quot;&gt;melkjug.openplans.org&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;As always, feedback is appreciated&lt;br /&gt;
  &lt;/p&gt;</content>
		<author>
			<name>ltucker</name>
			<uri>http://www.openplans.org/projects/melkjug/blog</uri>
		</author>
		<source>
			<title type="html">Melkjug Project</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/melkjug/blog/feed/atom/"/>
			<id>http://www.openplans.org/projects/melkjug/blog/feed/atom/</id>
			<updated>2008-08-28T07:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Making a proxy with WSGI and lxml</title>
		<link href="http://blog.ianbicking.org/2008/07/30/making-a-proxy-with-wsgi-and-lxml/"/>
		<id>http://blog.ianbicking.org/2008/07/30/making-a-proxy-with-wsgi-and-lxml/</id>
		<updated>2008-07-30T16:52:22+00:00</updated>
		<content type="html">&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;You can use WSGI to make rewriting middleware; &lt;a class=&quot;reference external&quot; href=&quot;http://pythonpaste.org/webob/&quot;&gt;WebOb&lt;/a&gt; specifically makes it easy to write.  And that&amp;#8217;s cool, but it&amp;#8217;s more satisfying to use your middleware right away without having to think about writing applications that might live behind the middleware.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s two libraries I&amp;#8217;ll describe here to make that possible: &lt;a class=&quot;reference external&quot; href=&quot;http://pythonpaste.org/modules/proxy.html#paste.proxy.Proxy&quot;&gt;paste.proxy&lt;/a&gt; to send WSGI requests out via HTTP, and &lt;a class=&quot;reference external&quot; href=&quot;http://codespeak.net/lxml/lxmlhtml.html&quot;&gt;lxml.html&lt;/a&gt; which lets you rewrite the HTML to fix up the links.&lt;/p&gt;
&lt;p&gt;To start, we need some kind of middleware that at least is noticeable.  How about something to make a word jumble of the page?  We&amp;#8217;ll use lxml as well:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
from lxml import html
from random import shuffle

def jumble_words(doc):
    &amp;quot;&amp;quot;&amp;quot;Mixes up the words in an HTML document (doesn't touch tags or attributes)&amp;quot;&amp;quot;&amp;quot;
    doc = html.fromstring(doc)
    # .text_content() gives the text without tags or attributes,
    # .body is the &amp;lt;body&amp;gt; tag:
    words = doc.body.text_content().split()
    shuffle(words)
    for el in doc.body.iterdescendants():
        # The ElementTree model puts all text in .text and .tail on elements, so that's
        # what we mix up:
        el.text = random_words(el.text, words)
        el.tail = random_words(el.tail, words)
    return html.tostring(doc)

def random_words(text, words):
    &amp;quot;&amp;quot;&amp;quot;Pulls some words from the list words, with the same number of words in
    the previous `text`&amp;quot;&amp;quot;&amp;quot;
    # text can be None, so we need this test:
    if not text:
        return text
    word_count = len(text.split())
    try:
        return ' '.join(words.pop() for i in range(word_count))
    except IndexError:
        # This shouldn't happen, because we should have exactly
        # the right number of words, but just in case...
        return text

from webob import Request

class JumbleMiddleware(object):
    &amp;quot;&amp;quot;&amp;quot;Middleware that jumbles the words of HTML responses
    &amp;quot;&amp;quot;&amp;quot;
    # This __init__ and __call__ are the basic pattern for middleware:
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        req = Request(environ)
        # We don't want 304 Not Modified responses, because we mix up the response
        # differently every time.  So we'll make sure all the headers that could call that
        # (If-Modified-Since, etc) are removed with .remove_conditional_headers():
        req.remove_conditional_headers()
        # This calls the application with the request, and then returns a response; this
        # is the typical pattern for response-modifying middleware using WebOb:
        resp = req.get_response(self.app)
        if resp.content_type == 'text/html':
            resp.body = jumble_words(resp.body)
        return resp(environ, start_response)
&lt;/pre&gt;
&lt;p&gt;Well, you don&amp;#8217;t really need to jumble up your &lt;em&gt;own&lt;/em&gt; pages, right?  Much more fun to jumble other people&amp;#8217;s pages.  Enter the proxy.  Here&amp;#8217;s a basic proxy:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
from paste.proxy import Proxy
# We use this to make sure we didn't mess up anything with JumbleMiddleware;
# the validator checks for many WSGI requirements:
from wsgiref.validate import validator
import sys

def main():
    proxy_url = sys.argv[1]
    app = JumbleMiddleware(
        Proxy(proxy_url))
    app = validator(app)
    from paste.httpserver import serve
    serve(app, 'localhost', 8080)

if __name__ == '__main__':
    main()
&lt;/pre&gt;
&lt;p&gt;If you look at the &lt;a class=&quot;reference external&quot; href=&quot;http://svn.colorstudy.com/home/ianb/recipes/rewritingproxy.py&quot;&gt;full source&lt;/a&gt; the command-line is a bit fancier, but it&amp;#8217;s all obvious stuff.&lt;/p&gt;
&lt;p&gt;OK, so this will work, but the links will often be broken unless the server only gives relative links.  But you can rewrite the links using lxml&amp;#8230;&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
import urlparse

class LinkRewriterMiddleware(object):
    &amp;quot;&amp;quot;&amp;quot;Rewrites the response, assuming the HTML was generated as though based at
    `dest_href`, and needs to be rewritten for the incoming request&amp;quot;&amp;quot;&amp;quot;

    # The normal __init__, __call__ pattern:
    def __init__(self, app, dest_href):
        self.app = app
        if dest_href.endswith('/'):
            dest_href = dest_href[:-1]
        self.dest_href = dest_href

    def __call__(self, environ, start_response):
        req = Request(environ)
        # .path_info (aka environ['PATH_INFO']) is the path of the request
        # (URL rewriting doesn't really have to care about query strings)
        dest_path = req.path_info
        dest_href = self.dest_href + dest_path
        # req.application_url is the base URL not including path_info or the query string:
        req_href = req.application_url
        def link_repl_func(link):
            link = urlparse.urljoin(dest_href, link)
            if not link.startswith(dest_href):
                # Not a local link
                return link
            new_url = req_href + '/' + link[len(dest_href):]
            return new_url
        resp = req.get_response(self.app)
        # This decodes any possible gzipped content:
        resp.decode_content()
        if (resp.status_int == 200
            and resp.content_type == 'text/html'):
            doc = html.fromstring(resp.body, base_url=dest_href)
            doc.rewrite_links(link_repl_func)
            resp.body = html.tostring(doc)
        # Redirects need their redirect locations rewritten:
        if resp.location:
            resp.location = link_repl_func(resp.location)
        return resp(environ, start_response)
&lt;/pre&gt;
&lt;p&gt;Then we rewire the application:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
app = JumbleMiddleware(
    LinkRewriterMiddleware(Proxy(proxy_url), proxy_url))
&lt;/pre&gt;
&lt;p&gt;Now there&amp;#8217;s a fun little proxy for you to play with.  You can see the code &lt;a class=&quot;reference external&quot; href=&quot;http://svn.colorstudy.com/home/ianb/recipes/rewritingproxy.py&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Ian Bicking</name>
			<uri>http://blog.ianbicking.org</uri>
		</author>
		<source>
			<title type="html">Ian Bicking: a blog</title>
			<link rel="self" href="http://blog.ianbicking.org/feed/"/>
			<id>http://blog.ianbicking.org/feed/</id>
			<updated>2008-08-10T20:05:13+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from whitmo] Wide Awake Developers: Beyond the Village</title>
		<link href="http://www.michaelnygard.com/blog/2008/07/beyond_the_village.html"/>
		<id>http://www.michaelnygard.com/blog/2008/07/beyond_the_village.html</id>
		<updated>2008-07-30T14:39:38+00:00</updated>
		<content type="html">150 is generally accepted as the dunbar number for homo sapiens (http://en.wikipedia.org/wiki/Dunbar&amp;#039;s_number).</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from rafrombrc] Catalog query plan — ZCatalog performance improvements</title>
		<link href="http://www.jarn.com/blog/catalog-query-plan"/>
		<id>http://www.jarn.com/blog/catalog-query-plan</id>
		<updated>2008-07-29T18:10:40+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from closedplans] Rich HTML Editing in the browser</title>
		<link href="http://dev.opera.com/articles/view/rich-html-editing-in-the-browser-part-1/"/>
		<id>http://dev.opera.com/articles/view/rich-html-editing-in-the-browser-part-1/</id>
		<updated>2008-07-28T18:24:49+00:00</updated>
		<content type="html">A great look at the state of web based WYSIWYG editors...</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Me In Berlin &amp;amp; Amsterdam</title>
		<link href="http://blog.ianbicking.org/2008/07/28/me-in-berlin-amsterdam/"/>
		<id>http://blog.ianbicking.org/2008/07/28/me-in-berlin-amsterdam/</id>
		<updated>2008-07-28T16:22:32+00:00</updated>
		<content type="html">&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;I&amp;#8217;m going on vacation in a couple weeks to Berlin and Amsterdam, flying to Berlin on August 12, leaving from Amsterdam on August 27, and transitioning between the two sometime in between.  Things &lt;a class=&quot;reference external&quot; href=&quot;http://potteryblog.com&quot;&gt;Emily&lt;/a&gt; and I should see or do?  Care to meet up?  On vacations my evenings tend to be underscheduled.&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Ian Bicking</name>
			<uri>http://blog.ianbicking.org</uri>
		</author>
		<source>
			<title type="html">Ian Bicking: a blog</title>
			<link rel="self" href="http://blog.ianbicking.org/feed/"/>
			<id>http://blog.ianbicking.org/feed/</id>
			<updated>2008-08-10T20:05:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Greylisting for comments</title>
		<link href="http://douglas.mayle.org/2008/07/25/greylisting-comments/"/>
		<id>http://douglas.mayle.org/2008/07/25/greylisting-comments/</id>
		<updated>2008-07-28T06:56:09+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a title=&quot;Greylisting&quot; href=&quot;http://en.wikipedia.org/wiki/Greylisting&quot;&gt;Greylisting&lt;/a&gt; is an interesting idea that comes from the world of mail servers.&amp;#160; It&amp;#8217;s a system used to combat &lt;span class=&quot;caps&quot;&gt;SPAM&lt;/span&gt; that&amp;#8217;s quite ingenious, and at least on my mail server, is 99% effective.&amp;nbsp; It&amp;#8217;s very effective at blocking &lt;span class=&quot;caps&quot;&gt;SPAM&lt;/span&gt; for three&amp;nbsp;reasons:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The internet protocol used for sending mail (&lt;span class=&quot;caps&quot;&gt;SMTP&lt;/span&gt;) is quite complex.&amp;nbsp; Most spammers don&amp;#8217;t have the time to write complete mail servers, they instead take shortcuts to cover the majority of&amp;nbsp;cases.&lt;/li&gt;&lt;li&gt;Spam is about turning computer time into money.&amp;nbsp; Spammers send out millions of mails per day, so if you increase the cost (in time) of sending mail, than you make spamming less&amp;nbsp;attractive.&lt;/li&gt;&lt;li&gt;While both whitelisting and blacklisting require humans to maintain lists of good and bad servers, greylisting is completely automated.&amp;nbsp; Since it&amp;#8217;s automated, it&amp;#8217;s easy to&amp;nbsp;use.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;They way greylisting works is by keeping a database of people sending mail to your server.&amp;nbsp; For each mail it receives, it looks at three&amp;nbsp;things:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The person sending the&amp;nbsp;mail&lt;/li&gt;&lt;li&gt;The person receiving the&amp;nbsp;mail&lt;/li&gt;&lt;li&gt;The computer performing the&amp;nbsp;delivery.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If the server doesn&amp;#8217;t already recognize all three of these properties, it responds with an error that tells the sender to try back a little bit later.&amp;nbsp; Real email servers will try again shortly, usually in less than 15 minutes.&amp;nbsp; A good number of spammers are stopped right here because their spam tools don&amp;#8217;t handle this case.&amp;nbsp; When the real server tries again, this time the mail will just pass right through and be&amp;nbsp;delivered.&lt;/p&gt;&lt;p&gt;That&amp;#8217;s it!&amp;nbsp; That&amp;#8217;s the magic of it all.&amp;nbsp; For any mail coming from people that your users already know, there&amp;#8217;s no wait; they don&amp;#8217;t see any difference, and mail just keeps coming in.&amp;nbsp; The first time someone sends a mail to your users, there will be a short wait, normally less than 15 minutes, and since mail isn&amp;#8217;t guaranteed to be immediate, most people don&amp;#8217;t notice the&amp;nbsp;difference.&lt;/p&gt;&lt;p&gt;Now on top of greylisting, people often throw in &lt;a title=&quot;Tarpitting&quot; href=&quot;http://en.wikipedia.org/wiki/Tarpit_%28networking%29&quot;&gt;Tarpitting&lt;/a&gt;.&amp;nbsp; A tarpit in computers is something that slows down the server, so the server responds more slowly, as if it were under a heavy load.&amp;nbsp; When combined with greylisting, this means that each mail coming from a new source costs the sender a whole lot more in computer time.&amp;nbsp; In the case of someone who will be sending you mails regularly, this one-time cost is quickly amortized, costing the sender nothing in the long run.&amp;nbsp; Spammers, however, who depend on sending millions of unique mails, see this cost with each email they send, and so your server becomes an unattractive&amp;nbsp;target.&lt;/p&gt;&lt;p&gt;How does this relate to comments, you may ask?&amp;nbsp; Well, I&amp;#8217;ve written a a greylisting/tarpitting Django-app for this and patched the code for this blog to use it.&amp;nbsp; For now, you can download it here: &lt;a title=&quot;Greylisting Django app&quot; href=&quot;http://douglas.mayle.org/files/greylist.tgz&quot;&gt;http://douglas.mayle.org/files/greylist.tgz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you&amp;#8217;d like the patch to enable this for your byteflow blog, it&amp;#8217;s available at &lt;a title=&quot;Greylisting enhancement ticket&quot; href=&quot;http://byteflow.su/ticket/93&quot;&gt;Byteflow Trac Ticket&amp;nbsp;#93&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Douglas</name>
			<uri>http://douglas.mayle.org/tag/planetdev/</uri>
		</author>
		<source>
			<title type="html">douglas.mayle.org blog posts with tag intersection planetdev</title>
			<link rel="self" href="http://douglas.mayle.org/feeds/atom/tag/planetdev/"/>
			<id>http://douglas.mayle.org/tag/planetdev/</id>
			<updated>2008-08-28T07:05:10+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from whitmo] No Secret Software!</title>
		<link href="http://www.tbray.org/ongoing/When/200x/2008/07/27/No-Secret-Software"/>
		<id>http://www.tbray.org/ongoing/When/200x/2008/07/27/No-Secret-Software</id>
		<updated>2008-07-28T02:56:42+00:00</updated>
		<content type="html">right up our alley</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from paulhope] The brave new world of e-hatred</title>
		<link href="http://www.economist.com/world/international/displayStory.cfm?source=hptextfeature&amp;story_id=11792535"/>
		<id>http://www.economist.com/world/international/displayStory.cfm?source=hptextfeature&amp;amp;story_id=11792535</id>
		<updated>2008-07-26T03:59:07+00:00</updated>
		<content type="html">The Economist rights about the dark side of internet politics</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from whitmo] Talks about Prophet and Sharecropping</title>
		<link href="http://syncwith.us/talks"/>
		<id>http://syncwith.us/talks</id>
		<updated>2008-07-24T23:45:57+00:00</updated>
		<content type="html">oops... now we are just another sharecropper...</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">opencore 0.12.1 released</title>
		<link href="http://www.openplans.org/projects/opencore/blog/2008/07/24/opencore-0121-released/"/>
		<id>http://www.openplans.org/projects/opencore/blog/2008/07/24/opencore-0121-released/</id>
		<updated>2008-07-24T18:15:32+00:00</updated>
		<content type="html">&lt;p&gt; Hi folks, opencore 0.12.1 was released today.&lt;/p&gt;
&lt;p&gt;This is a bugfix release with no user-visible new features. &lt;a href=&quot;https://svn.openplans.org/svn/opencore/branches/0.12.1&quot;&gt;&lt;br /&gt;
  &lt;br /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;As with the previous release, it still doesn&amp;#8217;t work via easy_install, you have to get it by checking out the tag from subversion: &lt;a href=&quot;https://svn.openplans.org/svn/opencore/tags/0.12.1&quot;&gt;https://svn.openplans.org/svn/opencore/tags/0.12.1&lt;/a&gt; and then install using python setup.py develop. Or use &lt;a href=&quot;http://www.openplans.org/projects/opencore/getting-started&quot;&gt;TOPP&amp;#8217;s usual build tools&lt;/a&gt; which will do that for you; however, we don&amp;#8217;t yet have a requirements profile ready that uses this tag. You could modify requirements/opencore-req.txt if you have an existing fassembler build that you want to upgrade.
&lt;/p&gt;
&lt;p&gt;The biggest changes in this release are:&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Force project content deletion to be done via POST; if it&amp;#8217;s a GET, redirect to a confirmation form. Reduces chance of accidental content delete by non-javascript clients. Thanks to Alex Clark for being so helpful and patient with us on this one.&lt;/li&gt;
&lt;li&gt;Added migrations/unmake-sites.py script to unmake the local sites at the app root and the Plone site root. Run this JUST BEFORE updating to a Plone 3-based version of opencore, which will be the &lt;strong&gt;next&lt;/strong&gt; feature release, version 0.13. &lt;strong&gt;Do not&lt;/strong&gt; run this migration under &lt;strong&gt;any&lt;/strong&gt; other circumstances or you will break your site! For more info, see: https://svn.openplans.org/svn/opencore/trunk/docs/Plone2.5-Plone3-migration.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As always, if you have any problems, contact us on the opencore-users mailing list or look us up on the #openplans IRC channel on freenode.&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt; I will be on vacation until 2008/07/31, I&amp;#8217;m hoping my fellow TOPP employees can provide support while I&amp;#8217;m gone.&lt;br /&gt;
  &lt;br /&gt;&amp;#8211; Paul Winkler&lt;br /&gt;
  &lt;/p&gt;</content>
		<author>
			<name>OpenCore Blog Posts</name>
			<uri>http://www.openplans.org/projects/opencore/blog</uri>
		</author>
		<source>
			<title type="html">OpenCore Software</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/opencore/blog/feed/"/>
			<id>http://www.openplans.org/projects/opencore/blog/feed/</id>
			<updated>2008-08-28T07:05:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Moving to a new deployment structure</title>
		<link href="http://www.openplans.org/projects/operations/blog/2008/07/24/moving-to-a-new-deployment-structure/"/>
		<id>http://www.openplans.org/projects/operations/blog/2008/07/24/moving-to-a-new-deployment-structure/</id>
		<updated>2008-07-24T17:20:12+00:00</updated>
		<content type="html">&lt;p&gt;While working on today&amp;#8217;s micro-deployment, I decided I need a few diagrams to make it clear to myself what was really going.&amp;nbsp; Since I went to the effort of making them, I thought I&amp;#8217;d share them here with everyone.
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;Below is the deploy structure we&amp;#8217;ve been using for quite a while.&amp;nbsp; There are some more pieces to the puzzle, but for the purpose of this deployment, they&amp;#8217;re irrelevant.&amp;nbsp; Notice that we have multiple complete setups, but they all exist within an analogous space.&amp;nbsp; Only one set can be running at a time, and squid is always pointing to whichever stack is running.&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Our Past Deployment Structure&quot; src=&quot;http://www.openplans.org/projects/operations/project-home/deployment.png&quot; height=&quot;513&quot; width=&quot;561&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;The current live deployment is a little bit messy, since we have two side by side setups, but with both zope instances pointing to the same instance zeo.&amp;nbsp; While providing the side by side deployment that I prefer, the intertangling is messy and just not sustainable.&lt;br /&gt;
    
  &lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Our Durrent Deployment Structure&quot; src=&quot;http://www.openplans.org/projects/operations/project-home/deployment-current.png&quot; height=&quot;774&quot; width=&quot;522&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;This is the deplyment we&amp;#8217;ll have after today.&amp;nbsp; There will be a separate zeo instance that both zope instances will point to.&amp;nbsp; Care has to be kept to give zeo access to any code that performs zeo write conflict resolution.&amp;nbsp; Currently, the only Product we use that does is the QueueCatalog&amp;#8230;&lt;br /&gt;
    
  &lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Our Future Deplyment Plan&quot; src=&quot;http://www.openplans.org/projects/operations/project-home/deployment-future.png&quot; height=&quot;778&quot; width=&quot;562&quot; /&gt;&lt;br /&gt;
  &lt;/p&gt;</content>
		<author>
			<name>Operations Blog Posts</name>
			<uri>http://www.openplans.org/projects/operations/blog</uri>
		</author>
		<source>
			<title type="html">operations</title>
			<subtitle type="html">Just another  weblog</subtitle>
			<link rel="self" href="http://www.openplans.org/projects/operations/blog/feed/"/>
			<id>http://www.openplans.org/projects/operations/blog/feed/</id>
			<updated>2008-08-28T07:05:12+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from slinkp] Palladion Software: Avoiding Temptation: Notes on using 'unittest' effectively</title>
		<link href="http://www.palladion.com/home/tseaver/obzervationz/2008/unit_testing_notes-20080724"/>
		<id>http://www.palladion.com/home/tseaver/obzervationz/2008/unit_testing_notes-20080724</id>
		<updated>2008-07-24T16:02:11+00:00</updated>
		<content type="html"></content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc</id>
			<updated>2008-08-27T23:05:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[from whitmo] open_source_communism on Flickr - Photo Sharing!</title>
		<link href="http://flickr.com/photos/jagelado/16631508/"/>
		<id>http://flickr.com/photos/jagelado/16631508/</id>
		<updated>2008-07-24T04:25:22+00:00</updated>
		<content type="html">we *are* the red menace!</content>
		<author>
			<name>openplansdev tags</name>
			<uri>http://delicious.com/inbox/openplansdev</uri>
		</author>
		<source>
			<title type="html">Delicious/inbox/openplansdev</title>
			<subtitle type="html">bookmarks sent by others to openplansdev</subtitle>
			<link rel="self" href="http://feeds.delicious.com/rss/for/openplansdev?private=48ae02d179f966fc8f4e174a185db1fc"/>
			<id>http://feeds.delicious.com/rss/for/