<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18973184</id><updated>2011-08-03T01:50:31.317-07:00</updated><title type='text'>Ideally It Wouldn't Matter</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18973184.post-115146594322957180</id><published>2006-06-27T19:49:00.000-07:00</published><updated>2006-06-27T20:39:04.223-07:00</updated><title type='text'>Haystack</title><content type='html'>Haystack is a product for Plone used to do auto-classification of content.  I've talked about it a little bit before but never given much of an introduction to it before.&lt;br /&gt;&lt;br /&gt;Haystack is built around libots which is available for many platforms. &lt;span style="font-weight: bold;"&gt;ots&lt;/span&gt; is a set of Python bindings to the library and I've made it available on cheeseshop. This means you can ez_install its&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;easy_install ots&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or you can grab it yourself from either:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cheeseshop.python.org/pypi?name=ots&amp;version=0.4.2.1&amp;amp;:action=display"&gt;cheeseshop&lt;/a&gt; or from &lt;a href="http://svn.objectrealms.net/view/public/ots/trunk/"&gt;svn&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After that you'll want to get &lt;a href="http://svn.objectrealms.net/view/public/haystack/trunk/"&gt;Haystack,&lt;/a&gt; the product for Plone that will get you started.&lt;br /&gt;&lt;br /&gt;Once that is installed you'll have access to a new portlet that will show you the interrelationships between content on the system and a tool that will give you more control over the analysis of content.&lt;br /&gt;&lt;br /&gt;Of interest:&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;haystack_tool.summarize(unicode, asHTML=False, ...)&lt;br /&gt;    &lt;/span&gt;return either a unicode or html highlited summary of the text you passed in&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;haystack_tool.topics(unicode, count=5, ...)&lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;return a list of topics extracted from the content&lt;br /&gt;&lt;br /&gt;Its pretty simple to things like auto suggest keywords/subjects with this tool and Bling in conjunction. Topic maps and other fun things are pretty simple as well. As it gets more use there are many options to expand on the kind of classification and clustering that are available.&lt;br /&gt;&lt;br /&gt;Have Fun&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-115146594322957180?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/115146594322957180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=115146594322957180' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/115146594322957180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/115146594322957180'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2006/06/haystack.html' title='Haystack'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-115111250783862058</id><published>2006-06-23T17:01:00.000-07:00</published><updated>2006-06-26T12:12:01.646-07:00</updated><title type='text'>PeeJays</title><content type='html'>PJS (pronounced PeeJays) is the Python equivlent to RJS done in Rails. Its still a little wet behind the ears but is already quite useful.&lt;br /&gt;&lt;br /&gt;The intention is to have a language native way to get at the Javascript code your client is running. In this case the language is Python and we expose the underlying Prototype primitives, but it would be possible to re-target this whole deal for something like Dojo or MochiKit.&lt;br /&gt;&lt;br /&gt;So what does it do? How do you use it? Pretty simple really. Now just to disclaim again, not everything you might want to do works but enough does that I am still going to show this. All the tests and runtime are pure Python with no Zope dependencies, but in the context of these examples I use a handy FSJavascript object which means we have a file in your Plone skin path with a &lt;span style="font-weight: bold;"&gt;.pjs&lt;/span&gt; extension that will render itself as &lt;span style="font-style: italic;"&gt;text/javascript&lt;/span&gt;. There is an implicit &lt;span style="font-weight: bold;"&gt;page&lt;/span&gt; object available to FSJavascript objects, but if you were doing this by hand if would just be:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;page = pjs.JavascriptPage&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;       ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;       print page&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Ok, now for a real example, or what goes in the ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are a number of very standard things we want to do from PJS.&lt;br /&gt;&lt;br /&gt;Access an element of the page by its id.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;page[id]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Refer to a Javascript variable directly&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;page.jsvar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and then call methods on those and pass them around.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;page['portlet-news'].highlight(delay=1.0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;which might highlight the news portlet for one second when triggered.&lt;br /&gt;&lt;br /&gt;We can also do slightly more complex things. For example suppose we have a Tree widget in Javascript and we want to add elements to it that result from doing a query. An AJAX callback to the server might trigger a .pjs file that looks&lt;br /&gt;as follows.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;##parameters=of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;catalog = context.portal_catalog&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ob = catalog(UID=of)[0].getObject()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;files = page.files&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;files.clear()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;for title, data in ob.treeFolderContents():&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; padding-left: 4em;font-family:courier new;" &gt;    files.addItem(title, data)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Looks just like a regular Python Script in Zope. Parameters tells Zope what to demand from the caller (in this case the AJAX request) and then runs as normal.&lt;br /&gt;This produces the proper Javascript which is returned to the client.  All in all its pretty simple. You'd have to understand that &lt;span style="font-weight: bold;"&gt;files&lt;/span&gt; is a&lt;span style="font-weight: bold;"&gt; Tree&lt;/span&gt; object and has a &lt;span style="font-weight: bold;"&gt;addItem&lt;/span&gt; methodand  you didn't have to worry about marshalling arguments, or escaping code in some strange cross language way (if you don't know what I mean count your blessings).&lt;br /&gt;&lt;br /&gt;There are unit and doc tests for this stuff and its still evolving. Its fun to play with, give it a try.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;    This is checked into Bling which can still be had from&lt;br /&gt;&lt;br /&gt;http://svn.plone.org/svn/collective/Bling/trunk/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-115111250783862058?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/115111250783862058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=115111250783862058' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/115111250783862058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/115111250783862058'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2006/06/peejays.html' title='PeeJays'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-115035462188405641</id><published>2006-06-14T23:48:00.000-07:00</published><updated>2006-06-14T23:57:01.896-07:00</updated><title type='text'>For your pleasure...</title><content type='html'>Its been a long time since I've posted. I pushed out releases of some software in the hopes that it will be useful to people.&lt;br /&gt;&lt;br /&gt;&lt;table class="list"&gt;&lt;tbody&gt;&lt;tr class="odd"&gt;&lt;td&gt;&lt;a href="http://cheeseshop.python.org/pypi/skeletor/0.4.0.dev-r23725"&gt;skeletor 0.4.0.dev-r23725&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://cheeseshop.python.org/pypi/chimera/0.4.0"&gt;chimera 0.4.0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://cheeseshop.python.org/pypi/rbtree/0.7"&gt;rbtree 0.7&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table class="history"&gt;&lt;tbody&gt;&lt;tr class="last"&gt;&lt;td&gt;    &lt;a href="http://cheeseshop.python.org/packages/2.4/o/ots/ots-0.4.2-py2.4-linux-i686.egg"&gt;ots-0.4.2-py2.4-linux-i686.egg&lt;/a&gt;   &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Skeletor is the zope products and cluster generator.&lt;br /&gt;&lt;br /&gt;Chimera is the image generation and manipulation tool. Reco did some &lt;a href="http://plone.org/documentation/how-to/installing-chimera-on-debian/howto_view"&gt;install&lt;/a&gt; docs. Which are helpful, there are a lot of dependencies. There is also an EGG on cheeseshop but this doesn't track the system level deps.&lt;br /&gt;&lt;br /&gt;OTS is the wrapper around libots (which is now included) and is used to power haystack, the auto text summarizer. There is so much that can be done here beyond what is currently shown.&lt;br /&gt;&lt;br /&gt;rbtree is generally useful. If you need a datastructre that offers the best of lists and dicts and allows things like key driven slices and so on in Python, this is for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-115035462188405641?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/115035462188405641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=115035462188405641' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/115035462188405641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/115035462188405641'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2006/06/for-your-pleasure.html' title='For your pleasure...'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-114143811862084677</id><published>2006-03-03T17:52:00.000-08:00</published><updated>2006-03-03T18:08:38.636-08:00</updated><title type='text'>Video</title><content type='html'>Jonah recently blogged about a &lt;a href="http://theploneblog.org/archive/2006/03/02/faster-better-cheaper"&gt;video review&lt;/a&gt; and screen cast Plone and a number of other frameworks. I was happy to see how well Plone compared some of the other frameworks in question. The ArchGenXML folks really deserve a big hand for this one. I am hoping that in conjunction with tools like &lt;a href="http://svn.plone.org/svn/collective/skeletor/trunk/"&gt;Skeletor&lt;/a&gt; will put filesystem development at or beyond what we see with other frameworks. Our runtime is already far more powerful, its time the Rapid Application Development and Deployment became simpler to those not already in the know.&lt;br /&gt;&lt;br /&gt;On a related note Whit and I have put a little more time into Skeletor and hope to make an official release soon. Whit has updated a branch using setuputils and its quite nice. I wrote a tiny lxml driven registry that allows simple merging of XML trees and fragment and scoped name look ups throughout the project hierarchy.&lt;br /&gt;&lt;br /&gt;This means two things, one projects will be able to include their own Skeletor plugins if they wish to allow more/different things to be generated for projects. The act of creating a Skeletor plugin is pretty simple, the act of registering it and having it merge questions into the generation process should be as well. This means that if your fancy project includes a set of Five adapters and some standard configuration that would bind those adapters to the projects&lt;br /&gt;new types you should be able to include a plugin that will generate this for users of your project.&lt;br /&gt;&lt;br /&gt;The namespaced name lookups have been there since the beginning but have been cleaned up thanks to the recent work. This will let projects, plugins and authors persist variables from run to run of Skeletor at the correct scope. For example, you might generate projects with a fixed default license, email contact information, etc. You won't be asked for this information each time you run it, Skeletor can retain this information for you. The goal is to make this tool as powerful and painless as possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-114143811862084677?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/114143811862084677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=114143811862084677' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/114143811862084677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/114143811862084677'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2006/03/video.html' title='Video'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113945064428875939</id><published>2006-02-08T17:50:00.000-08:00</published><updated>2006-02-08T18:04:04.303-08:00</updated><title type='text'>Repository reordering</title><content type='html'>People requested that I move some code from the objectrealms.net svn and darcs repos into the collective. I've been hoping that people would try darcs to get at some of the code in that repo (which we think is quite good) but people haven't and it doesn't look like this changes. So I am going to fold.&lt;br /&gt;&lt;br /&gt;Bricolite::  &lt;a href="https://svn.plone.org/svn/collective/bricolite/"&gt;https://svn.plone.org/svn/collective/bricolite/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Skeletor::  &lt;a href="https://svn.plone.org/svn/collective/skeletor"&gt;https://svn.plone.org/svn/collective/skeletor&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Expect Chimera soon, the newer versions of that have Archetypes widgets included that can do things like render textual images in the font and style of your choice directly from data kept in Archetypes objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113945064428875939?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113945064428875939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113945064428875939' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113945064428875939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113945064428875939'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2006/02/repository-reordering.html' title='Repository reordering'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113943208662469025</id><published>2006-02-08T12:51:00.000-08:00</published><updated>2006-02-08T13:00:37.883-08:00</updated><title type='text'>The mdns patch for Zope</title><content type='html'>People asked for it. This is about the simplest version of the thing I could come up with but you will need the Avahi and DBUS Python bindings up and running. After that this patch should apply to the Zope 2.8/2.9 releases pretty easily.&lt;br /&gt;&lt;br /&gt;Then you just restart Zope and you should see these services on your network.&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow: scroll; white-space: pre; background-color: rgb(204, 204, 153);"&gt;&lt;br /&gt;diff -ur Zope-2.8.5-final/lib/python/ZServer/FTPServer.py Zope-2.8.5-mdns/lib/python/ZServer/FTPServer.py&lt;br /&gt;--- Zope-2.8.5-final/lib/python/ZServer/FTPServer.py    2005-12-18 23:25:56.000000000 -0800&lt;br /&gt;+++ Zope-2.8.5-mdns/lib/python/ZServer/FTPServer.py     2006-02-08 12:46:15.000000000 -0800&lt;br /&gt;@@ -80,6 +80,7 @@&lt;br /&gt;import marshal&lt;br /&gt;import stat&lt;br /&gt;import time&lt;br /&gt;+from utils import mdns_announce&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class zope_ftp_channel(ftp_channel):&lt;br /&gt;@@ -640,6 +641,10 @@&lt;br /&gt;                self.hostname,&lt;br /&gt;                self.port&lt;br /&gt;                ))&lt;br /&gt;+        mdns_announce(None,&lt;br /&gt;+                      self.port,&lt;br /&gt;+                      service="_ftp._tcp")&lt;br /&gt;+&lt;br /&gt;&lt;br /&gt;def clean_shutdown_control(self,phase,time_in_this_phase):&lt;br /&gt;if phase==2:&lt;br /&gt;diff -ur Zope-2.8.5-final/lib/python/ZServer/HTTPServer.py Zope-2.8.5-mdns/lib/python/ZServer/HTTPServer.py&lt;br /&gt;--- Zope-2.8.5-final/lib/python/ZServer/HTTPServer.py   2005-12-18 23:25:56.000000000 -0800&lt;br /&gt;+++ Zope-2.8.5-mdns/lib/python/ZServer/HTTPServer.py    2006-02-08 12:47:46.000000000 -0800&lt;br /&gt;@@ -58,6 +58,7 @@&lt;br /&gt;from zLOG import LOG, register_subsystem, BLATHER, INFO, WARNING, ERROR&lt;br /&gt;import DebugLogger&lt;br /&gt;from medusa import logger&lt;br /&gt;+from utils import mdns_announce&lt;br /&gt;&lt;br /&gt;register_subsystem('ZServer HTTPServer')&lt;br /&gt;&lt;br /&gt;@@ -384,6 +385,7 @@&lt;br /&gt;server_protocol = 'HTTP'&lt;br /&gt;channel_class = zhttp_channel&lt;br /&gt;shutup=0&lt;br /&gt;+    service = "_http._tcp"&lt;br /&gt;&lt;br /&gt;def __init__ (self, ip, port, resolver=None, logger_object=None):&lt;br /&gt;self.shutup=1&lt;br /&gt;@@ -397,6 +399,9 @@&lt;br /&gt;    self.server_port&lt;br /&gt;    ))&lt;br /&gt;&lt;br /&gt;+        self.mdns = mdns_announce(None, port, service = self.service, info=self.SERVER_IDENT)&lt;br /&gt;+&lt;br /&gt;+&lt;br /&gt;def clean_shutdown_control(self,phase,time_in_this_phase):&lt;br /&gt;if phase==2:&lt;br /&gt;    self.log_info('closing %s to new connections' % self.server_protocol)&lt;br /&gt;@@ -422,3 +427,4 @@&lt;br /&gt;&lt;br /&gt;class zwebdav_server(zhttp_server):&lt;br /&gt;server_protocol = 'WebDAV'&lt;br /&gt;+    service = "_webdav._tcp"&lt;br /&gt;diff -ur Zope-2.8.5-final/lib/python/ZServer/utils.py Zope-2.8.5-mdns/lib/python/ZServer/utils.py&lt;br /&gt;--- Zope-2.8.5-final/lib/python/ZServer/utils.py        2005-12-18 23:25:56.000000000 -0800&lt;br /&gt;+++ Zope-2.8.5-mdns/lib/python/ZServer/utils.py 2006-02-08 12:48:02.000000000 -0800&lt;br /&gt;@@ -56,3 +56,39 @@&lt;br /&gt;from medusa import logger&lt;br /&gt;# override the service name in logger.syslog_logger&lt;br /&gt;logger.syslog_logger.svc_name='ZServer'&lt;br /&gt;+try:&lt;br /&gt;+    import avahi, dbus, dbus.glib&lt;br /&gt;+    hostname = None&lt;br /&gt;+    def mdns_announce(name, port, service="_http._tcp",&lt;br /&gt;+                      **kwargs):&lt;br /&gt;+        global hostname&lt;br /&gt;+        bus = dbus.SystemBus()&lt;br /&gt;+        server = dbus.Interface(bus.get_object(avahi.DBUS_NAME,&lt;br /&gt;+                                               avahi.DBUS_PATH_SERVER),&lt;br /&gt;+                                avahi.DBUS_INTERFACE_SERVER)&lt;br /&gt;+&lt;br /&gt;+        g = dbus.Interface(bus.get_object(avahi.DBUS_NAME,&lt;br /&gt;+                                          server.EntryGroupNew()),&lt;br /&gt;+                           avahi.DBUS_INTERFACE_ENTRY_GROUP)&lt;br /&gt;+&lt;br /&gt;+&lt;br /&gt;+        if name is None:&lt;br /&gt;+            if hostname is None:&lt;br /&gt;+                hostname = "%s:%s" % (server.GetHostName(), port)&lt;br /&gt;+            name = hostname&lt;br /&gt;+&lt;br /&gt;+        info = ["%s=%s" % (k,v) for k,v in kwargs.items()]&lt;br /&gt;+        g.AddService(avahi.IF_UNSPEC,&lt;br /&gt;+                     avahi.PROTO_UNSPEC, 0,&lt;br /&gt;+                     name,&lt;br /&gt;+                     service,&lt;br /&gt;+                     "", "", # domain, host (let the system figure it out)&lt;br /&gt;+                     dbus.UInt16(port),&lt;br /&gt;+                     info,&lt;br /&gt;+                     )&lt;br /&gt;+        g.Commit()&lt;br /&gt;+        return g&lt;br /&gt;+&lt;br /&gt;+except ImportError:&lt;br /&gt;+    def mdns_announce(server, name, port): pass&lt;br /&gt;+&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113943208662469025?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113943208662469025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113943208662469025' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113943208662469025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113943208662469025'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2006/02/mdns-patch-for-zope.html' title='The mdns patch for Zope'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113887105039517836</id><published>2006-02-02T00:47:00.000-08:00</published><updated>2006-02-02T01:44:11.543-08:00</updated><title type='text'>Bonjour Zope</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7444/1868/1600/Screenshot-Network.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7444/1868/320/Screenshot-Network.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;So I thought how nice would it be for Zope to announce itself using  Zero Configuration technology on the network. On Linux we have &lt;a href="http://avahi.org"&gt;Avahi&lt;/a&gt; and &lt;a href="http://www.freedesktop.org/Software/dbus"&gt;DBUS&lt;/a&gt; which make it easy to do such publications. Happily they both have simple Python bindings as well. With a small patch I was able to get my Zope servers to announce themselves on startup for HTTP, FTP and WebDav. They will automatically show up in tools like Nautilus (on GNOME) or Finder (on Mac OS X).&lt;br /&gt;&lt;br /&gt;This has got to be nice in situations like Sprints where bunches of developers are passing links to DHCP generated address around adhoc networks. Heck, its nice just when I can't remember which port I left something on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113887105039517836?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113887105039517836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113887105039517836' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113887105039517836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113887105039517836'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2006/02/bonjour-zope.html' title='Bonjour Zope'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113398729751275543</id><published>2005-12-07T11:38:00.000-08:00</published><updated>2005-12-07T13:55:48.630-08:00</updated><title type='text'>Bling!</title><content type='html'>Dynamic this and that... Everyone wants it, why doesn't Plone have it? There are alot of people and groups working on the AJAXification of Zope technologies with varying degrees of success. Here are the main trends I see people pointing at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't invent a new Javascript library&lt;/li&gt;&lt;li&gt;Don't force the developer to learn  Javascript&lt;/li&gt;&lt;/ul&gt;I am sure there are others. Right now the flavors of the day are MochiKit and the Prototype family of products. I would say that both of them are great, they both provide OO abstractions around writing JS, making it more fun. MochiKit borrows ideas from Python and Twisted and is quite nice to program with. Prototype, Scripaculous and OpenRico excel in the library of existing visual effects and widgets. They also have great mindshare around them in the form that they are included with and used in Rails.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Don't invent something new, don't code Javascript&lt;/span&gt;&lt;br /&gt;I've been experimenting with both in the context of Plone. Here is how it breaks down.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;Mochikit might be better if you are writing alot of Javascript. This is not however the goal of my experimentation. I like auto generated forms and widgets and I'd rather just make those come alive than. Prototype and family are already used in this capacity in Rails so there is experience in what makes a logical binding between the server side and the client.&lt;br /&gt;&lt;br /&gt;If we are not writing Javascript then what do we write? Well, Plone UI people know TAL and a bit of Python so I thought I'd aim for that. Introduce &lt;span style="font-style: italic;"&gt;Bling&lt;/span&gt;, some helper code than can be used in TAL to spit out the Javascript you need.&lt;br /&gt;I only wrote this yesterday so its a little halfed backed but here is how it might work. This will create a "checkedField", something that validates server-side on change using AJAX and then writes to or clears an error div on the client.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="function-name"&gt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt;label for="foo"&amp;gt;&lt;/span&gt;&lt;span class="function-name"&gt;FOO&amp;lt;/label&amp;gt; &amp;lt;input type="text" id="foo"&lt;br /&gt; name="foo"\/&amp;gt;&lt;br /&gt;&lt;/span&gt;&amp;lt;div tal:replace=&lt;span class="string"&gt;"structure python:ajax.checkedField(&lt;br /&gt;      here.portal_url() + '/dval',&lt;/span&gt; '&lt;span class="string"&gt;foo', error='error')"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;which might generate something like&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;label for=&lt;span class="string"&gt;"foo"&lt;/span&gt;&amp;gt;FOO&amp;lt;/label&amp;gt; &amp;lt;input id=&lt;span class="string"&gt;"foo"&lt;/span&gt; name=&lt;span class="string"&gt;"foo"&lt;/span&gt; type=&lt;span class="\string"&gt;"text"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;script type=&lt;span class="string"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&lt;br /&gt;  new Form.Element.EventObserver($('foo'),&lt;br /&gt;function(element, value) { new Ajax.Updater({success:&lt;br /&gt;                                          $('error'),failure:&lt;br /&gt;                                          $('error')},&lt;br /&gt;                                          'http://site/bling/dval', {&lt;br /&gt;onFailure:function(request){&lt;br /&gt;      new Effect.Appear($('error'),{})&lt;span class="comment"&gt;; Fie\ld.activate('foo');},&lt;br /&gt;parameters:Form.Element.serialize($('foo')),&lt;br /&gt;onSuccess:function(request){new Effect.DropOut($('error'),{})},&lt;br /&gt;asynchronous:true,insertion:null,method:'post\'} )  })&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Fun Prototype callouts you didn't have to write or think about. Most of the kinds of tags you'd expect in rails are here already and I've added a few more to show how something like Plone could carry a standard array of reuable behaviors and visual effects.&lt;br /&gt;&lt;br /&gt;Next we change something like Archetypes that already has per-field validation logic and vocabulary support and allow for things like auto-completion and validition from the widget layer with out change.&lt;br /&gt;&lt;br /&gt;To show how simple this is I've written it into a product already. This will install the proper scripts into the resource registries in Plone. Just create a new site, install this product and play with the test.pt template in its skin path. The methods of interest are in Bling/ajax.py&lt;br /&gt;&lt;br /&gt;To get the bundle you need darcs:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;darcs get http://darcs.objectrealms.net/repos/Bling&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;or you can just look at the repo at &lt;a href="http://darcs.objectrealms.net/darcsweb.cgi/bling"&gt;&lt;br /&gt;http://darcs.objectrealms.net/darcsweb.cgi/bling&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113398729751275543?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113398729751275543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113398729751275543' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113398729751275543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113398729751275543'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/12/bling.html' title='Bling!'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113342475706827549</id><published>2005-12-01T00:07:00.000-08:00</published><updated>2005-12-01T00:12:37.076-08:00</updated><title type='text'>Events, Frameworks and FUD</title><content type='html'>First, a little history. Lets start with the question, "Why doesn't Plone have an event system?" For an event system to really work I would suppose that it needs to be used in all or at least many of the major system in play in a given system. In Plone this would mean that CMFish things would need to fire and consume the same events as the rest of Plone, as the rest of Archetypes, as the events as third party products. In other words an events solution needs to be arrived at from the lowest layers or &lt;a href="http://www.specialinvestor.com/terms/2115.html"&gt;boil the ocean&lt;/a&gt;. Well years into this project none of the lower stack levels have put forward anything usable and nothing has been promoted from application land.  Does this mean that no one has tried? Of course not, many have, too many have. In fact in Plone land alone we had 3 different 'event systems' of various size and scope in play for the last few years.&lt;br /&gt;&lt;br /&gt;Because no previous effort has won enough development mindshare or devotion to become 'the' event system used in the Plone stack people have by and large been reluctant to use any of them till a winner emerges. We've had a stalemate. To make matters worse the promise of Zope 3 and its clean refinement of the Zope architecture and stack has in many ways halted significant progress in Plone land. We are left making incremental improvements to exiting feature without breaking any new ground. And guess what... That's OK, Zope 3 is better and we have quite a few people waiting for it, experimenting with it, and even a few deploying on it.&lt;br /&gt;&lt;br /&gt;Back in Plone land though, no events... oh we can abuse the catalog hooks all we want, those are almost in the right place that we can keep adding things to them to keep extending the system but this is no answer. As a result, it was my impression that the term Event has a certain negative stigma around it, a kind of false promise. For marketing reasons I looked for another term. From a technical perspective events as they are dealt with via the catalog hooks have a particular semantic and a real lack of flexibility and yet still some people see these as events. For technical reasons I sought another term.&lt;br /&gt;&lt;br /&gt;If I used the term framework I apologize. That's the flavor of the day word for, "I'd  like to be victimized (by the community I am trying to help)" and I should know better than to toss it about, but I don't think I ever said that. The code in question is a pluggable routing class for event payloads and a tool that can manage subscriptions persistently. We recently tried to update it to use Five events for payloads and install a bridge between Z3's 'notify' API and the 'fireEvent' call that makes sense in a Z2 Acquisition hierarchy. That's it.&lt;br /&gt;&lt;br /&gt;Its small, its using Z3 concepts and code where we can and we asked for feedback.  That offer is still open.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113342475706827549?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113342475706827549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113342475706827549' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113342475706827549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113342475706827549'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/12/events-frameworks-and-fud.html' title='Events, Frameworks and FUD'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113286444982312523</id><published>2005-11-24T12:34:00.000-08:00</published><updated>2005-11-24T12:34:42.996-08:00</updated><title type='text'>Plotting a course</title><content type='html'>Whit and I spent some time talking about Archetypes in the context of Zope 3/Five technology. We spoke about where it stands today, why think its been successful and what to try to carry forward with our new toolbox of slings and arrows... I mean hammers and nails.&lt;p&gt;&lt;br /&gt;The fact that archetypes objects in their create/edit code paths might trigger (re)indexing &lt;em&gt;n&lt;/em&gt; time where n is greater that acceptable has been considered low hanging fruit for some of the new technologies. Heck it was low hanging fruit 2 years ago, the solution was never very hard, but requires commitment from the development community that we've not been able to make. We've long thought that events were a simple way do things like indexing. When notified that an object has changed (via an event) trigger an action in the catalog to update the indexes. If your event system can do just &lt;em&gt;a little bit&lt;/em&gt; more work this problem and a host of other problems have clearer, more understandable solutions. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;We've chosen to replace the term &lt;em&gt;event&lt;/em&gt; with the concept of &lt;strong&gt;messaging&lt;/strong&gt;. Messaging lacks some of the historical baggage of events in the Zope/Plone world. No one is asking which messaging system we should be using or how messaging system A compares to B or Zope 3 in general. None of those systems have messaging.  Events are the primitive that might enable messaging  but messaging implies slightly more than just events. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Events can be though of as callbacks using the subject/observer pattern. Object A says that when object B changes it needs to know and its going to trigger some action.  This is typically synchronous and immediately triggers the effect. The advantage of this simple system is that object A never need know that object B care about its change or is going to do anything. A's only responsibility is telling the world that its changed. The world is watching. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;What happens when we don't need/want synchronous actions? What if object B has some idea of the applications idea of a transaction and only wants to operate on an object after an entire set of operations have been done? For example, what if we change object A 3 times in one request? We might still only want to (re)index it  at the end of the request, not the 3+ times that might happen in the current implementation. How do events help us here?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;By themselves events won't help you, you'd need to build a higher level idea around them. The traditional Zope answer would be to put the smarts in the recipient, object B. We have examples of this, queued catalogs and a host of other things that leave the mechanics of queuing and deferring events to the recipient, object B in this case. This solution is less than ideal. It violates DRY (Don't repeat yourself), the handling logic is distributed and replicated in each of the places its needed. The patterns must be reused. I could go on, but thats bad enough.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Enter messaging, This can mean a number of things and rather than outline them all I will just show this one specific example. Object A changes, Object B wants to know. Introduce a message bus or a channel or whatever other word makes ya happy. What this means is that Object C listens for Object A's change and B talks to C now. C, the message bus, introduces ideas in the message handling that do things like manage queuing and collapsing events. Suppose that the catalog subscribes to object C, the ObjectChanged channel. Now when Object A changes object C tells B. B says "thanks, but I don't need to deal with this till later, I don't know when later is, you tell me later calling &lt;em&gt;this&lt;/em&gt; method". This is called deferring an event.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Before the end of the transaction the deferred messages will all be delivered back to object B at the same time. Object B can now look at all the messages specific to given objects and decide to merge them into one action or whatever. In the case of cataloging it might figure out the set of catalogs and indexes impacted by all the changes and issue the minimal number of actions to the catalog. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;We started a bundle for this, &lt;a href="https://svn.plone.org/svn/plone/bundles/messaging"&gt;https://svn.plone.org/svn/plone/bundles/messaging&lt;/a&gt; dependent on the Eventually messaging system that was written at the last snow sprint but never got any play. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Eventually has some reasonable &lt;a href="http://svn.objectrealms.net/view/public/eventually/trunk/Eventually/docs/THEORY.txt?view=markup"&gt;docs&lt;/a&gt; you might want to look at. We are changing Archetypes in this bundle to fire events and adding subscribers for things like that catalog. Think how easy it would be to use the same model to collapse storage events for something like the storage layer. It deals with major sources of pain under a single better abstraction. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113286444982312523?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113286444982312523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113286444982312523' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113286444982312523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113286444982312523'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/11/plotting-course.html' title='Plotting a course'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113261305064077157</id><published>2005-11-21T14:35:00.000-08:00</published><updated>2005-11-21T14:51:26.716-08:00</updated><title type='text'>Patched Planet</title><content type='html'>&lt;a href="http://planet.plone.org/"&gt;Planet Plone&lt;/a&gt; is using the excellent planetplanet.org software to manage its feeds. However I noticed there was a problem dealing with ATOM feeds such as those emitted from Blogger. I've patched out a version of planet to use a newer feedparser and it seems to have fixed the problem in local testing. Hopefully things will look healthier after the server gets update (thanks wiggy).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113261305064077157?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113261305064077157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113261305064077157' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113261305064077157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113261305064077157'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/11/patched-planet.html' title='Patched Planet'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113260405809906765</id><published>2005-11-21T12:14:00.000-08:00</published><updated>2005-11-21T12:14:58.310-08:00</updated><title type='text'>Plone's License</title><content type='html'>Paul and Sidnei are having a discussion about the GPL license and the reaction of people this. While I have many things I can say about how important it is to ensure the free flow of information I'd point those of you that haven't seen Lawrence Lessig's &lt;a href="http://randomfoo.net/oscon/2002/lessig/free.html"&gt;Free Culture &lt;/a&gt; to that excellent presentation. &lt;p&gt;&lt;br /&gt;It to those that imply that Plone going the GPL route is somehow stealing that I would add this. &lt;em&gt;The only possible theft of Free Software comes from placing restrictions on it that remove the rights of others to enjoy, explore and learn from the software the same way you did.&lt;/em&gt; The license ensures that at each step of the way its distributed with the same freedoms extending to each recipient. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;This is complicated when mixing GPL software with other software, obviously. In the cases in which you'd mix with software that would restrict the rights of its consumers, such as mixing with proprietary software, the GPL is pretty clear. Its in the case of mixing with other Open Source software products that things become less clear. If both products intend for example for the works to be distributed with the source always available but define different notions of what makes an aggregate work covered by the distribution terms of the license things grow increasingly complex. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Rather than detail various cases, I'd say this. Its important that software projects define the intent and understanding with which they use the license, and its far better to ship with known, better understood licenses (even with legally binding addendums and exceptions) than to invent your own. The Plone Foundation has a responsibility, as owner of the Plone IP, to more adequately define our intended usage, derivation model, etc, that we can better protect it and the rights of the software's consumers.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113260405809906765?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113260405809906765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113260405809906765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113260405809906765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113260405809906765'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/11/plones-license.html' title='Plone&apos;s License'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113212959220427645</id><published>2005-11-16T00:26:00.000-08:00</published><updated>2005-11-17T10:37:04.193-08:00</updated><title type='text'>Stop Energy</title><content type='html'>&lt;p&gt;Some people know the term &lt;a href="http://www.userland.com/whatIsStopEnergy"&gt;Stop Energy&lt;/a&gt;, others don't. If you don't you should. Its rampant and education is the key to stopping it. Stop Energy is any non-constructive, unreasoned response to an attempt to accomplish something.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;There is a common belief that when presented with a new idea, or even an old one, that a request for comments means criticism. Stop Energy is applied without thought of the bigger picture, its an effort to prevent the realization of an idea.&lt;/p&gt;Rather than recast the entire content of the link above I'd add the following:&lt;br /&gt;&lt;p&gt;Stop Energy is bad behavior. When confronted with a new idea try to think about how it can be made to work, try to think about how you can help. If there is constructive criticism to be realized about an idea it will fall naturally out of such an approach. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113212959220427645?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113212959220427645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113212959220427645' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113212959220427645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113212959220427645'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/11/stop-energy.html' title='Stop Energy'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113203796375899858</id><published>2005-11-14T22:59:00.000-08:00</published><updated>2005-11-17T09:11:30.300-08:00</updated><title type='text'>Skeletor</title><content type='html'>&lt;p&gt;Geoff Davis and myself recently participated in a &lt;a href="http://www.zopemag.com/Guides/miniGuide_ZopeSprinting.html"&gt;sprint&lt;/a&gt; devoted to packaging Plone products and best practices around product development. There have been a number of good tutorials including the &lt;a href="https://svn.objectrealms.net/svn/public/bricolite/trunk/Bricolite/"&gt;Bricolite&lt;/a&gt; one that I gave a while back in Vienna. We decided that a tool that could spit out project skeletons for Plone would help people take advantage of some of the better practices collected in the community. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Our tool generates a "Batteries Included" project skeleton. Its our hope that in the short term this will include:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;- automatically generating EGGs&lt;/p&gt;&lt;p&gt;&lt;br /&gt;- automatic generation of HTML/PDF documentation&lt;/p&gt;&lt;p&gt;&lt;br /&gt;- build in testing support with common interfaces tests out of the box&lt;/p&gt;&lt;p&gt;&lt;br /&gt;- built in support for pyflake and some other Python testing/analysis tools.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;The name of this mighty productivity aid? &lt;b&gt;Skeletor&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7444/1868/1600/skeletor.0.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: inline; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/7444/1868/320/skeletor.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Skeletor will be available from &lt;a href="http://darcs.objectrealms.net/darcsweb.cgi?r=projector;a=summary"&gt;my darcs repo&lt;/a&gt; in the near term. For now its still in development but if you have ideas its darcs, Check it out and send me a patch.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113203796375899858?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113203796375899858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113203796375899858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113203796375899858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113203796375899858'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/11/skeletor.html' title='Skeletor'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18973184.post-113201800906150136</id><published>2005-11-14T17:26:00.000-08:00</published><updated>2005-11-17T09:11:07.020-08:00</updated><title type='text'>Process Foundations</title><content type='html'>&lt;p&gt;The &lt;a href="http://plone.org/"&gt;Plone&lt;/a&gt; &lt;a href="http://plone.org/foundation"&gt;Foundation&lt;/a&gt; board is recommending that Plone developers start blogging about the good works that the community and Foundation Membership are up to. This is important. Plone is a powerful, flexible product but isn't getting the same product love as some of the other web development frameworks on the market today. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;I find that many in the community compare &lt;span style="font-style: italic;"&gt;us&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;them&lt;/span&gt; where them is a collection of frameworks for doing web presentation on top of simple relational databases. Many of these frameworks are cool in their own right and in their own product spaces but Plone is much more than any of them. Plone is a full fledged Content Management System that has competed with some of the very best commercial systems and won. It offers advanced features for workflow management of content, collaborative content development and a suite of other features that set it apart.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Frameworks that pride themselves on leanness and rapid application development offer those things because they give you the ability to manage so much less complexity. The world is complex and the problems people attempt to solve in it doubly so. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;I think proper positioning in the technology market will help developers hunting for frameworks and help to bring additional talent into our playground. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18973184-113201800906150136?l=bcsaller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bcsaller.blogspot.com/feeds/113201800906150136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18973184&amp;postID=113201800906150136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113201800906150136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18973184/posts/default/113201800906150136'/><link rel='alternate' type='text/html' href='http://bcsaller.blogspot.com/2005/11/process-foundations.html' title='Process Foundations'/><author><name>Benjamin Saller</name><uri>http://www.blogger.com/profile/09914365320447792839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_0_oA-MJB3t0/SfXYqSGa-QI/AAAAAAAAAPg/CQRuqk0CMjU/S220/DSC_0019_.jpg'/></author><thr:total>0</thr:total></entry></feed>
