<?xml version="1.0"?><!-- RSS generated by Radio UserLand v8.0.7 on Sat, 11 Jan 2003 19:25:05 GMT --><rss version="2.0">	<channel>		<title>Jeffrey P Shell: Objects and the Web</title>		<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/</link>		<description>Zope, SOAP, WebObjects, Servlets, .NET, Pink.</description>		<copyright>Copyright 2003 Jeffrey P Shell</copyright>		<lastBuildDate>Sat, 11 Jan 2003 19:25:05 GMT</lastBuildDate>		<docs>http://backend.userland.com/rss</docs>		<generator>Radio UserLand v8.0.7</generator>		<managingEditor>jeffr@euc.cx</managingEditor>		<webMaster>infor@euc.cx</webMaster>		<category domain="http://www.weblogs.com/rssUpdates/changes.xml">rssUpdates</category> 		<skipHours>			<hour>2</hour>			<hour>3</hour>			<hour>4</hour>			<hour>5</hour>			<hour>20</hour>			<hour>1</hour>			<hour>15</hour>			<hour>17</hour>			</skipHours>		<cloud domain="radio.xmlstoragesystem.com" port="80" path="/RPC2" registerProcedure="xmlStorageSystem.rssPleaseNotify" protocol="xml-rpc"/>		<ttl>60</ttl>		<item>			<title>Moving Toulouse</title>			<link>http://toulouse.amber.org/</link>			<description>Industrie Toulouse has moved to &lt;a href=&quot;http://toulouse.amber.org/&quot;&gt;A new home (toulouse.amber.org)&lt;/a&gt; and a new &lt;a href=&quot;http://www.movabletype.org/&quot;&gt;publishing system&lt;/a&gt;.  Most of the archives will be there soon.  The Radio site will remain up indefintely, but no new content will appear here.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2003/01/11.html#a268</guid>			<pubDate>Sat, 11 Jan 2003 19:24:27 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=268&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2003%2F01%2F11.html%23a268</comments>			</item>		<item>			<title>Zope 3 reStructuredText Document 0.1</title>			<link>http://www.zope.org/Members/jshell/z3-restdocument/z3restdoc-01-release</link>			<description>&lt;p&gt;With Zope 3X alpha 1 out, I decided it was time to jump in again and see how it would be to write a new content object for it with associated components (adapters, views).  I&apos;ve tried to include comments in the files and README to document what I was doing as I was going along.&lt;/p&gt;&lt;p&gt;It can be downloaded &lt;a href=&quot;http://www.zope.org/Members/jshell/z3-restdocument&quot;&gt;here&lt;/a&gt;, and requires &lt;a href=&quot;http://docutils.sourceforge.net/&quot;&gt;a fairly recent docutils&lt;/a&gt; and of course &lt;a href=&quot;http://dev.zope.org/Zope3/Downloads&quot;&gt;Zope 3X Alpha 1&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The current release is intended to focus more on documenting how to write a new content component for Zope 3 than on being a smart reStructuredText client.  That functionality may come later.&lt;/p&gt;&lt;p&gt;I have some other &lt;a href=&quot;http://www.zopezen.org/Members/jshell/News_Item.2003-01-04.4803&quot;&gt;thoughts about the process&lt;/a&gt; posted on &lt;a href=&quot;http://www.zopezen.org/&quot;&gt;ZopeZen&lt;/a&gt;.&lt;/p&gt;</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2003/01/04.html#a263</guid>			<pubDate>Sat, 04 Jan 2003 18:53:11 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=263&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2003%2F01%2F04.html%23a263</comments>			</item>		<item>			<title>FDoc</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/10/27.html#a223</link>			<description>I&apos;ve been asked recently about this &lt;strong&gt;FDoc&lt;/strong&gt; project I keep mentioning.  Today, I wrote a new document about it.&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://radio.weblogs.com/0106123/stories/2002/10/27/regardingFdoc.html&quot;&gt;Regarding FDoc&lt;/a&gt; -- this is the new document, and goes over some of the design ideas as and after they&apos;ve been put into use.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://radio.weblogs.com/0106123/outlines/compoundZopeDocuments.html&quot;&gt;Compound Zope Documents&lt;/a&gt; -- this is an older document, written a few months ago during some of the initial coding of the base framework and a default end-user implementation.&lt;/li&gt;&lt;/ul&gt;</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/10/27.html#a223</guid>			<pubDate>Sun, 27 Oct 2002 21:47:53 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=223&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F10%2F27.html%23a223</comments>			</item>		<item>			<title>On .Mac, part 1.3 - availability wrap up</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/10/08.html#a214</link>			<description>Without going into too much details, tonight after mad birthday celebrations (where I spent too much time being tired drunk instead of too-much-dancing drunk), I came home to an email from Apple concerning the .Mac outages.  Their claim, which I believe, is that there have been equipment problems.  They claim the vendor has not been able to promise no more problems in the future, and work is underway to install new equipment.Hopefully this works out well for them and for us subscribers, and it&apos;s nice to be notified.  In the past, when the service was free, I didn&apos;t mind outages and interruptions, but as web services get integrated more and more into desktop applications and environments, service availability is going to be a critical issue.  Hopefully having paying subscribers will offset the high cost of service availability.  Large scale web services like &lt;a href=&quot;http://www.mac.com/&quot;&gt;.Mac&lt;/a&gt;, whatever &lt;a href=&quot;http://www.microsoft.com/net/&quot;&gt;Microsoft .NET&lt;/a&gt; &lt;em&gt;My Services&lt;/em&gt; morphs into, and other large offerings require more than just a single web server sitting in California.  Backup, caching, and location issues abound for service providers.  Even Userland&apos;s &quot;Radio&quot; servers have had problems in the past (but have run smoothly now for months).  Other services, like &lt;a href=&quot;http://www.livejournal.com/&quot;&gt;LiveJournal&lt;/a&gt; have also had availability issues, and in fact LiveJournal is closed to free accounts that don&apos;t come in off of a referral.There are some other weblogs about &lt;a href=&quot;http://www.rds.com/doug/weblogs/webServicesStrategies/&quot;&gt;Web Service Strategies&lt;/a&gt; that have better details than I can offer about the aspects of web services beyond SOAP, REST, or however the basic protocal is spelled for you.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/10/08.html#a214</guid>			<pubDate>Tue, 08 Oct 2002 08:53:01 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=214&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F10%2F08.html%23a214</comments>			</item>		<item>			<title>A Zope 3 story - augmenting other components</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/09/02.html#a194</link>			<description>It&apos;s very late, so I&apos;ll try to make this quick and write up more later.  Today, I finally had enough free time in my coffers to download &quot;Python&quot; from CVS (aka - 2.3 pre-alpha) onto my old iMac, and augment that with &quot;Zope 3&quot; - the &lt;em&gt;ComponentArchitecture&lt;/em&gt; project.  Then I installed the simple but usable &lt;a href=&quot;http://cvs.zope.org/ZopeProducts/JobBoardEx/&quot;&gt;Job Board Example&lt;/a&gt;.  I soon noticed that said JobBoardExample was missing out on a couple of things - an editing interface, and an XML-RPC interface. One of the notions of Zope 3 is that it&apos;s supposed to be easier for developers to embrace and extend other components by being able to write new &quot;views&quot; for them.  So, I decided to write a JobEditView.  I made a new Product (esentially, a plain Python package) called JobBoardEditor, and filled it with a couple of files - &lt;tt&gt;EditJobView.py&lt;/tt&gt;, &lt;tt&gt;edit.pt&lt;/tt&gt; (the page template to edit a single job with), and &lt;tt&gt;configure.zcml&lt;/tt&gt;, the configuration file that ties it into the Zope system.  It wasn&apos;t long until I could go to a Job object and traverse to my new edit form, and then have the submit go to my &apos;edit&apos; method.  But, at this point, I&apos;m running into security issues that are beyond my measure to figure out, especially at 1:00 am with a beer headache. &quot;;-&gt;&quot;My other thing to try out was putting a simple XML-RPC interface on to the JobList.  This was particularly interesting to me as I&apos;ve found that while traditional &quot;Zope&quot; method calls should - in theory - work fine with something like XML-RPC, they seldom do.  Sometimes it&apos;s because too much HTML is returned from a call, but most of the time lately (for me at least), it&apos;s that I want the server to do some processing of the results before sending them out to the client, using the relatively simple data types afforded to XML-RPC.  As a result, I&apos;ve been adding in extra Python Scripts particularly for XML-RPC, and letting them work in the proper places either via acquisition or some other clever tricks.  It&apos;s not a bad system, but it&apos;s not exactly formalized or repeatable, since it&apos;s not in a formal Product.In Zope 3, this is different.  I wrote a simple XMLRPCView class.  &apos;View&apos; objects in Zope 3 have two state members - &apos;request&apos; (the incoming request object), and &apos;context&apos; - the object the View is applied against.  So, for me to add in the new functionality whereby I could just get a list of approved Job titles, I wrote the following Python file in my JobBoardEditor product:&lt;pre&gt;from Zope.Publisher.XMLRPC.XMLRPCView import XMLRPCViewfrom ZopeProducts.JobBoardEx.IJob import JobState class JobListXMLRPCView(XMLRPCView):    __implements__ = XMLRPCView.__implements__     def listJobTitles(self):        joblist = self.context        job_ids = joblist.query(state=JobState.Approved)        out = []        for jid in job_ids:            out.append(joblist[jid].summary)        return tuple(out)&lt;/pre&gt;Then, I added the following to &lt;code&gt;JobBoardEditor/configure.zcml&lt;/code&gt; (after adding &lt;code&gt;xmlns:xmlrpc=&apos;&lt;a href=&quot;http://namespaces.zope.org/xmlrpc&quot;&gt;http://namespaces.zope.org/xmlrpc&lt;/a&gt;&apos;&lt;/code&gt; to the head zopeConfigure element):&lt;pre&gt;&amp;lt;xmlrpc:view    name=&quot;joblistmethods&quot;    for=&quot;ZopeProducts.JobBoardEx.IJobList.&quot;    factory=&quot;.JobListXMLRPCView.&quot; /&amp;gt;&lt;/pre&gt;With this configuration statement, I&apos;ve added a new View to be published on the XMLRPC channel (which in Zope 3 runs on a different port than normal HTTP requests, which is probably wise) for objects that implement the IJobList interface.  I was able to do all of this outside of the JobBoardEx product.  I just had to ensure that the Product was added in &lt;em&gt;after&lt;/em&gt; JobBoardEx by using the site&apos;s &lt;em&gt;products.zcml&lt;/em&gt; file to affect the ordering.After restarting Zope 3 (which is a very slow restart on this machine), I was able to do this:&lt;pre&gt;Py$ s = Server(&apos;&lt;a href=&quot;http://localhost:8281/zoo/joblistmethods&quot;&gt;http://localhost:8281/zoo/joblistmethods&lt;/a&gt;&apos;)Py$ s.listJobTitles()[&apos;test test test&apos;]&lt;/pre&gt;I actually had created two jobs through the web interface, but had only approved one.  So I ducked in to the web interface to approve the other job, and then made the call again:&lt;pre&gt;Py$ s.listJobTitles()[&apos;test test test&apos;, &apos;the other job&apos;]&lt;/pre&gt;So, what are some benefits of this?  One that comes to mind is issue trackers.  Earlier in the day, I was writing a Python script to farm through some Tracker data and format it nicely for XML-RPC, with the intent of writing a simple AppleScript Studio application to list pending/accepted Tracker issues.  I did this informally, dropping a Python Script into the folder above a particular tracker.  Ultimately, it didn&apos;t work - and I think a lot of the blame goes on XML-RPC&apos;s utter disregard for semi-proper security.  Since Zope&apos;s always published objects on the web with regards to web security standards (or embarrasments, depending on your view) such as &apos;Basic Auth&apos;, it&apos;s had problems with the &quot;security by passing in arguments&quot; design of many XML-RPC API&apos;s.  But the point I was really going for was packaging.  Even if the Tracker Issue finding Python Script had worked over XML-RPC, now I have to find other places to put it by copying and pasting it, ultimately adding another name onto an ever growing namespace.With Zope 3, however, I could write an XML-RPC view particularly for the application I was designing as a normal Python component, and install and configure it as necessary (and hopefully that configuration work will be better than copying and pasting plain Python Script code).  I can name it specially, essentially adding a new namespace for my application.  I can distribute it to other users fairly easily.Another example would be implementing the Blogger API not as a new weblog product for Zope, but as a view/adapter component that publishes on the XML-RPC channel, and communicates with other Zope components, either built in ones or third party.In summary - my first tangible Zope 3 experience in quite some time has been hopeful and helpful.  There&apos;s still a long way to go, but the kernel is shaping up nicely.  The pattern driven / &quot;extreme programming&quot; sprint driven development has yielded a decent - but still shifting - code base that should be stronger and simpler than Zope 2.  Sometimes, there are enough levels of indirection in Zope 3 to make it look more complex, but so far most code has been easier to follow and trace than Zope 2 (although there are a number of empty folders/packages that probably need some brute force removing from CVS) - at least, it&apos;s usually easier to tell what&apos;s going on (and even this has an at least - at least, once you start learning the new paradigm).  Zope&apos;s ancester, Bobo (the kernel on which Zope is still based), was all about abstracting the means of publishing an object on the web away from the object itself.  Bobo, and then Principia / Zope 1.x, built upon this, but primarily in a single-UI / single protocol type way.  It&apos;s obvious today that there are many ways of looking at things on the web, including never actually using the web itself.  Zope 3 brings us back to the notion of an &lt;em&gt;object publisher&lt;/em&gt; being able to serve up objects on different protocols.  Zope 2 offers this today, but there is great difficulty in making WebDAV, normal HTTP, FTP, and XML-RPC all live harmoniously in the current design.And finally, Zope 3 should yield a usable scalable means of adapting the works of other developers into new solutions by providing better control of product/service/view configuration and overrides, such as adding a new XML-RPC API to someone elses bug tracking system without having to alter that bug tracking system, or use secret Python hacks to alter behaviour.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/09/02.html#a194</guid>			<pubDate>Mon, 02 Sep 2002 08:47:43 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=194&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F09%2F02.html%23a194</comments>			</item>		<item>			<title>Organization Objects</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/06/10.html#a127</link>			<description>Ken Manheimer has also posted a proposal (a little bit dated) about what he calls &lt;a href=&quot;http://cmf.zope.org/rqmts/proposals/OrganizationObjects&quot;&gt;Organization Objects&lt;/a&gt;, and a really good companion paper about the &lt;a href=&quot;http://cmf.zope.org/Members/klm/MotivatingOrganizationObjects&quot;&gt;motivations for organization objects&lt;/a&gt;.  The motivations paper discusses how the parent/child and table of contents relationship(s) were done for ZWiki, and how Organization Objects (which bear similarity to &lt;a href=&quot;http://www.w3.org/TR/xlink/&quot;&gt;XLink&lt;/a&gt;) would have benefited the application.A bullet point in the Organization Objects proposal that I really liked is:&lt;ul&gt;&lt;li&gt;Living with only links and searches is like living in an     imaginary world where every room is connected to every other by     transporters - it lacks a basis for regionality, neighborhood.     &lt;br&gt;&lt;br&gt;In other words, it lacks progressively grouped regions by which you     can realize &quot;where you are&quot;.&lt;/li&gt;&lt;/ul&gt;</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/06/10.html#a127</guid>			<pubDate>Mon, 10 Jun 2002 21:43:36 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=127&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F06%2F10.html%23a127</comments>			</item>		<item>			<title>ZWiki and logical structures.</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/06/10.html#a126</link>			<description>&lt;a href=&quot;http://zwiki.org/&quot;&gt;ZWiki&lt;/a&gt; is a sehr-cool beast, as far as Wikis go.  A very attractive feature, seen all over the &lt;a href=&quot;http://www.zope.org/&quot;&gt;Zope.org&lt;/a&gt; web site is &lt;a href=&quot;http://www.zope.org/Members/klm/&quot;&gt;Ken Manheimer&lt;/a&gt;&apos;s work on page/parenting relationships.  This makes it so that Wiki pages, although stored in a flat namespace (all in one folder) can appear to be hierarchical, depending on which page generated which page (parenting can be altered of course).  This in turn leads to cool things, like a structured table of contents (see the Zope 3 wiki&apos;s &lt;a href=&quot;http://dev.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/FrontPage/map&quot;&gt;TOC Here&lt;/a&gt;).It&apos;s especially cool in that it&apos;s fairly easy to change the hierarchical structure of the Wiki - by looking at a page&apos;s backlinks, one can reparent a page to one or more of its linkers.  Essentially, new logical structures can grow independent of the physical structure.I&apos;ve used a similar feature in a recent simple content system, wherein all documents were stored in a single folder, but the users entering content could classify documents in one or more categories.  The main pages on the site were basically database queries (actually, catalog queries) based on the classifications.  Thus, the site was built out of a simple logical structure rather than a physical one, which allowed documents to appear in more than one place if they needed to be.  It&apos;s no unique concept, &quot;Radio&quot; and some other blogging tools allow this, much to my delight.In the simple compound system I did for that customer, the flat namespace also allowed simple inter-document link management.  The author could say &quot;document A links to document B&quot;, and when document B was deleted, the link to it would also evaporate.  For some reason, doing deep inter-object linking in &quot;Zope&quot; is still tricky business, but there&apos;s hope on the &quot;Zope 3&quot; horizon (some of which looks like it may be backported to Zope 2).</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/06/10.html#a126</guid>			<pubDate>Mon, 10 Jun 2002 19:59:30 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=126&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F06%2F10.html%23a126</comments>			</item>		<item>			<title>Intent, and human editable XML.</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/06/05.html#a125</link>			<description>There&apos;s been an &lt;a href=&quot;http://lists.zope.org/pipermail/zope3-dev/2002-June/001953.html&quot;&gt;interesting debate&lt;/a&gt; on the &quot;Zope&quot; 3 development list about ZCML - the new Zope 3 configuration language.The debate ultimately seems to be over what I view as &quot;human readable&quot; XML versus &quot;machine friendly&quot; XML.  There is a lot of power and usefulness in XML, but the proliferation of namespaces and unknown attribute handling has taken the human out of it, I think.  Intent gets lost.Anyways, they&apos;re sticking with the current ZCML format, which can be seen in practice &lt;a href=&quot;http://cvs.zope.org/Docs/ZopeComponentArchitecture/PythonProgrammerTutorial/Chapter1/Step6/Contact.zcml?rev=1.2&amp;content-type=text/vnd.viewcvs-markup&quot;&gt;here&lt;/a&gt;.  It&apos;s not horrible, but it could be better.Personally, I found the Servlet Web-App Descriptor to be much easier to work with, as per the Jakarta/Tomcat &lt;a href=&quot;http://jakarta.apache.org/tomcat/tomcat-4.0-doc/appdev/web.xml.txt&quot;&gt;sample starter file&lt;/a&gt;.  It&apos;s more verbose, which requires more typing (it seems that programmers really hate to type), but the intent is much clearer.  Intent.  It&apos;s valuable.  But sadly, so easy to cast off.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/06/05.html#a125</guid>			<pubDate>Wed, 05 Jun 2002 18:49:53 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=125&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F06%2F05.html%23a125</comments>			</item>		<item>			<title>Marshalling - the good point of XML-RPC and SOAP.</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/07.html#a92</link>			<description>Looking back at &lt;a href=&quot;http://radio.weblogs.com/0101679/&quot;&gt;Sam Ruby&lt;/a&gt;&apos;s article, &lt;a href=&quot;http://www.oreillynet.com/cs/weblog/view/wlg/1351&quot;&gt;Google&apos;s Genius&lt;/a&gt;, he mentions my favorite point in favor of SOAP/RPC:&lt;blockquote cite=&quot;http://www.oreillynet.com/cs/weblog/view/wlg/1351&quot;&gt;Perhaps the most illumining part of Paul&apos;s essay is when he describes his optimized doSpellingSuggestion API.&amp;nbsp; In this case, he declares that XML is overkill for the job.&amp;nbsp; Unquestionably, omitting XML in some cases creates a tighter data stream.&amp;nbsp; It can also require custom marshallers and parsers to be written.&amp;nbsp; More tradeoffs to consider.&lt;/blockquote&gt;The second to last sentence is important.  In my view, XML &quot;scraping&quot; is not much better than HTML &quot;scraping&quot;.  The Google API&apos;s were immediately usable in everything from Ruby to Python to AppleScript to Frontier/Radio, and more, with only a SOAP library needed - nothing specific to Google.  The calls were Google specific, yes, but the client immediately understood the results of the call.Even though it&apos;s a silly application, I would never have even attempted to write something like &lt;strong&gt;HyprSwank&lt;/strong&gt;, as mentioned in &quot;AppleScript Studio, XML-RPC, and Zope&quot;, if I had to parse the results out of my data structure myself.  I&apos;m not sure what XML parsing libraries even exist for AppleScript, but I&apos;m sure if they do (or were to) exist, it couldn&apos;t be any easier to use than:&lt;tt&gt;tell application &quot;http://euc.cx/&quot; to set link_list to call xmlrpc {method name:&quot;hyprSWNK&quot;, parameters:{}}&lt;/tt&gt;Or in Python:&lt;pre&gt;import xmlprclib, pprintlink_list = xmlrpclib.ServerProxy(&apos;&lt;a href=&quot;http://euc.cx/&quot;&gt;http://euc.cx/&lt;/a&gt;&apos;).hyprSWNK()pprint.pprint(link_list)[{&apos;sitename&apos;: &apos;mobileffe&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://www.mobileffe.com/&quot;&gt;http://www.mobileffe.com/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;Prada&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://www.prada.com/&quot;&gt;http://www.prada.com/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;ACFny&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://www.acfny.org/&quot;&gt;http://www.acfny.org/&lt;/a&gt;&apos;}, {&apos;link&apos;: &apos;&lt;a href=&quot;http://www.peopleusedtodream&quot;&gt;http://www.peopleusedtodream&lt;/a&gt;&apos;,  &apos;sitename&apos;: &apos;People Used To Dream About The Future&apos;}, {&apos;sitename&apos;: &apos;David Lynch&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://www.davidlynch.com/&quot;&gt;http://www.davidlynch.com/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;.tiln&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://tiln.net/&quot;&gt;http://tiln.net/&lt;/a&gt;&apos;}, {&apos;link&apos;: &apos;&lt;a href=&quot;http://www.timecube.com/&quot;&gt;http://www.timecube.com/&lt;/a&gt;&apos;,  &apos;sitename&apos;: &apos;educated people are stupid cowards&apos;}, {&apos;link&apos;: &apos;&lt;a href=&quot;http://www.antigirl.com/&quot;&gt;http://www.antigirl.com/&lt;/a&gt;&apos;,  &apos;sitename&apos;: &apos;absolut antigirl !(absolut cybele)&apos;}, {&apos;sitename&apos;: &apos;no ~ type&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://www.notype.com/&quot;&gt;http://www.notype.com/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;meta.am +=&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://meta.am/&quot;&gt;http://meta.am/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;fals.ch&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://fals.ch/&quot;&gt;http://fals.ch/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;infotron&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://infotron.web.fm&quot;&gt;http://infotron.web.fm&lt;/a&gt;&apos;}, {&apos;link&apos;: &apos;&lt;a href=&quot;http://www.m9ndfukc.org/korporat/&quot;&gt;http://www.m9ndfukc.org/korporat/&lt;/a&gt;&apos;,  &apos;sitename&apos;: &apos;aaaaaaa n t i o r   p;uss&apos;}, {&apos;sitename&apos;: &apos;nato0+55+3d&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://www.eusocial.org/&quot;&gt;http://www.eusocial.org/&lt;/a&gt;&apos;}, {&apos;link&apos;: &apos;&lt;a href=&quot;http://www.angelfire.com/electronic/campmsp/&quot;&gt;http://www.angelfire.com/electronic/campmsp/&lt;/a&gt;&apos;,  &apos;sitename&apos;: &apos;themoonstealingproject&apos;}, {&apos;link&apos;: &apos;&lt;a href=&quot;http://artists.mp3s.com/artists/42/musiquemotpol.html&quot;&gt;http://artists.mp3s.com/artists/42/musiquemotpol.html&lt;/a&gt;&apos;,  &apos;sitename&apos;: &apos;musique:motpol @ mp3.com&apos;}, {&apos;link&apos;: &apos;&lt;a href=&quot;http://www.helmutlang.com/&quot;&gt;http://www.helmutlang.com/&lt;/a&gt;&apos;,  &apos;sitename&apos;: &apos;finest cotton armbags since 1997 (HL)&apos;}, {&apos;sitename&apos;: &apos;One Bit Louder&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://mi.cz/obl/&quot;&gt;http://mi.cz/obl/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;purple&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://purple.fr/&quot;&gt;http://purple.fr/&lt;/a&gt;&apos;}, {&apos;sitename&apos;: &apos;OFRPublications&apos;, &apos;link&apos;: &apos;&lt;a href=&quot;http://www.ofrpublications.com/&quot;&gt;http://www.ofrpublications.com/&lt;/a&gt;&apos;}]&lt;/pre&gt;While I could have written my own parser, written my own format, or spent time researching common XML formats and then scouring the web for an already written parser for my language or sitting down with a copy of &quot;XML and Python&quot;, I chose not to.For as much as I rag sometimes on some of XML-RPC&apos;s shortfalls, it&apos;s much better than doing all of that!  It gives one common format for a common internet use, and has spread around to many languages.  If I had to write my parser, or wait for someone to write one, or deal with DOM navigation, in order to deal with GoogleML, I&apos;d be much less curious about &quot;hmm, what can I write today to take advantage of that?&quot;.A nice thing that Bobo got right from day one was to implement and handle marshalling of incoming HTTP requests in such a way that my code never has to go through a &quot;is it a list?  is it a string?  is it a string I can convert to a list?&quot; somersault again.  Or at least, not often.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/07.html#a92</guid>			<pubDate>Tue, 07 May 2002 23:07:28 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=92&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F05%2F07.html%23a92</comments>			</item>		<item>			<title>WSDL generating</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/07.html#a90</link>			<description>Earlier, I started writing up some thoughts in response to &lt;a href=&quot;http://radio.weblogs.com/0100887/2002/05/06.html#a218&quot;&gt;Jon Udell&apos;s Web Services post&lt;/a&gt; today, particularly the part about &lt;em&gt;WSDL Autogeneration&lt;/em&gt;.  Jon says:&lt;blockquote&gt;The classes you&apos;ll want to annotate for such treatment should, in many cases, be abstractions of those that implement behavior.&amp;nbsp;Creating such abstractions is, of course, more work -- and the kind of work that doesn&apos;t easily yield to automation.&lt;/blockquote&gt;Sounds like Interfaces.  Which is where my post was going earlier, but I found flaws in my thinking.  While I think the following is possible, and may actually work, it will invariably get more complex than this:&lt;tt&gt;wsdl = WSDLWriter.generateForInstance(obj, onlyInterface=IBlogger)&lt;/tt&gt;&lt;em&gt;shrug&lt;/em&gt;.  I&apos;m too tired right now to explore this notion too much.  The issues I started running into is how much to tie web service or security related metadata attached to an Interface (ie, abstraction) to an implementation.  It&apos;s an issue they struggled with as Interfaces were starting to get heavily used for &quot;Zope&quot; (particularly in the growing Zope 3 architecture), and I believe such information has been moved to configuration files(?).  I could be wrong.Anyways, as long as we&apos;re going in the direction of generating WSDL out of code versus generating code out of &lt;s&gt;IDL&lt;/s&gt; WSDL, things aren&apos;t all that bad.Yet.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/07.html#a90</guid>			<pubDate>Tue, 07 May 2002 07:02:04 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=90&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F05%2F07.html%23a90</comments>			</item>		<item>			<title>Jaguar Notes</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/06.html#a88</link>			<description>&lt;a href=&quot;http://www.apple.com/macosx/newversion/&quot;&gt;Apple&apos;s Jaguar Page&lt;/a&gt; is up.  Something hypr-cool?  Sherlock 3 is actually Karelia&apos;s &lt;a href=&quot;http://www.karelia.com/watson/&quot;&gt;Watson&lt;/a&gt;, a really cool app showing how a desktop application can make use of web available data without succumbing to Microsoft&apos;s &quot;Everything IS a web page&quot; type interface.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/06.html#a88</guid>			<pubDate>Mon, 06 May 2002 21:33:33 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=88&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F05%2F06.html%23a88</comments>			</item>		<item>			<title>Verbosity and Web Services, again.  Does Dave Winer really get it?</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/04.html#a78</link>			<description>&lt;em&gt;Forward: a few hours ago, after getting home from dinner with friends, I was reading more on Web Services, and found this article on &lt;a href=&quot;http://www.onlamp.com/pub/a/python/2002/05/02/pythonnews.html&quot;&gt;Wrapping Web Service APIs&lt;/a&gt; on ORN by Stephan Figgins.  It somehow led me back to an old &lt;a href=&quot;http://www.scripting.com/&quot;&gt;Scripting News&lt;/a&gt; post that somewhat rankled me when I first read it.  I&apos;m finally posting my response.  At 2AM, saturday morning.&lt;/em&gt;Does Dave Winer get Web Services?  &lt;a href=&quot;http://scriptingnews.userland.com/backissues/2002/01/31#lcf476f93cdaa0beda2b0497b10177006&quot;&gt;This posting&lt;/a&gt; talks about the overhead involved in publishing a web service via .NET.  I admit, my experience with Radio and Frontier is still very small.  But, at least with &quot;Radio&quot;, you have to write your Web Services script in a special folder, &lt;em&gt;Web Services&lt;/em&gt;.  How is &lt;em&gt;that&lt;/em&gt; not overhead?  Now, you&apos;re writing a single script adapter to another part of the system in order to publish it on the web services channel.  This may make sense in an environment based on pure scripting, but what about real persistent objects that are already on the web - objects that are both Data and Behavior?  &quot;Zope&quot;, and Bobo before it, have been built on this concept from day one.Many a year ago, Amos Lattier wrote an article called &lt;a href=&quot;http://starship.python.net/crew/amos/bobo_way.html&quot;&gt;The Bobo Way&lt;/a&gt;.  I&apos;m going to quote his article here, because (as I&apos;ve said before), this sounds like familiar ground: &lt;blockquote&gt;For example if your app keeps track of company employees, you will probably want a separate Employee object for each employee. That way you can access these objects with URLs like:&lt;tt&gt;/Employees/amos/set_menu?lunch=spam&lt;/tt&gt;This URL assumes that Employees is a mapping object that contains Employee objects. Employees[&quot;amos&quot;] is an Employee object that represents the amos employee. The above URL calls amos&apos; set_menu method with lunch=spam for arguments:&lt;tt&gt;Employees[&quot;amos&quot;].set_menu(lunch=spam)&lt;/tt&gt;&lt;br&gt;&lt;em&gt;Ed: this could also be &lt;tt&gt;Employees.amos.set_menu(lunch=spam)&lt;/tt&gt;&lt;/em&gt;For contrast lets look at a non-bobo way of doing the same thing:&lt;tt&gt;/set_menu.py?empid=amos&amp;meal=lunch&amp;food=spam&lt;/tt&gt;&lt;/blockquote&gt;It seems to me like an awful lot of XML-RPC interfaces are not much better than this last example.  They&apos;re usually a single function that is handed some sort of key to operate on another object with, rather than going to that object directly.  It defeats polymorphism, it defeats generalization, and ultimately it can lead to a large and unwieldy adapter layer, tucked away in a Web Services directory somewhere.There are merits to this design.  You are basically writing an Adapter pattern of sorts, mapping a Web Service friendly interface into whatever the internal system really has.  And, if that&apos;s the only gateway into your system from the outside, you have some level of security by limiting the amount of access to a collection of XML-RPC dedicated functions instead of opening up access to every potential object.But there are merits to the other design too.  In theory, you can program Zope the same way on the inside as on the outside, so long as you have the credential to do so.  You have instances of classes out there, on the web, already.  .NET seems to be following this route somewhat.  Doing Web Services by this route is scarier.  Why?  Security for one reason.  And, you just don&apos;t want to turn every single method on the object to be callable over the web, or - at the very least - you want to attach conditions.  This is what Microsoft is doing.  Let&apos;s look at how a simple &apos;return hello&apos; class for Zope looks, disregarding any Zope OFS framework stuff (making the class addable through the web interface).  Putting an instance of this class in a Zope tree would yield the same results over XML-RPC as calls to &lt;a href=&quot;http://radio.weblogs.com/0001015/images/2002/01/31/dotnetexample.gif&quot;&gt;this .NET example&lt;/a&gt; would:&lt;pre&gt;from Security import ClassSecurityInfofrom Persistence import Persistentfrom Globals import InitializeClass class Hello(Persistent):    security = ClassSecurityInfo()      #Used to do declarative security     security.declareObjectPublic()      #Make these objects inherently public     security.declarePublic(&apos;sayHello&apos;)  #And make this method public    def sayHello(self, name):       &quot;&quot;&quot; Say hello to &apos;name&apos; &quot;&quot;&quot;       return &quot;Hello %s&quot; % nameInitializeClass(Hello)                  #This processes the security declarations&lt;/pre&gt;Now, it&apos;s about the same overhead as the Microsoft ASP.NET example.  &lt;em&gt;note: There&apos;s more overhead involved with Zope itself in order to fit the Hello class into the Zope framework, but this is purely an example.  This could have been easily written as a Python Script object, where the security settings could be set through a web UI.&lt;/em&gt;.  Why do all this?  Because web services as API&apos;s are ultimately programmatically exposed.  There are two ways this is done:&lt;ol&gt;&lt;li&gt;Declarations, either in code or configuration (ie, xml) files.&lt;/li&gt;&lt;li&gt;Writing separate handlers, and only exposing those to the web&lt;/li&gt;&lt;/ol&gt;The first is the &quot;Zope&quot; way, and apparently the .NET way.  At some point, you&apos;re taking code that exists already and saying &quot;yes, this is a web service&quot;.  The second seems to be the Radio way, where you write a script that calls into other existing code, and say &quot;this script is the web service&quot;.Sometimes, the amount of overhead is equal.  But I think relegating all Web Services to being scripts and functions in a special folder or singleton object weakens their potential.  Likewise, not all existing web-published code is ready to be made into a Web Service.  Both ways are valid.  But, there&apos;s got to be a better unification.  Dave needs to understand the declarative way.  It may look more verbose on a silly little Hello World example, but I have access to thousands of methods exposed via XML-RPC that are done so automatically via Zope&apos;s similar security declarations.  That&apos;s a lot more than I&apos;d have access to if I have to write those methods in a special place.So, here&apos;s another verbosity example.  Let&apos;s say there&apos;s the following bit of code in a Blog Entry class:&lt;pre&gt;class BlogEntry(...):   security.declareProtected(&apos;Edit Entries&apos;, &apos;editPost&apos;)   def editPost(self, content, publish=0):      &quot;&quot;&quot; Set the content of the post, and publishes it if publish is true &quot;&quot;&quot;      self._content = content      if publish:          self._publishedContent = content      return &quot;OK&quot;      #simple return value&lt;/pre&gt;And, for simplicities sake, lets say we had a flat structure for all entries to make URL&apos;s easier, and we have an entry identified as &apos;123&apos;.  So, to edit it via URL.  Hmm, this is almost REST-like:&lt;tt&gt;.../Posts/123/editPost?content=boy+howdy&amp;publish:int=1&lt;/tt&gt;And do to it via BCI (ZPublisher.Client):&lt;pre&gt;myPost = ZPublisher.Object(&apos;.../Posts/123&apos;, username=&apos;bob&apos;, password=&apos;bobby&apos;)myPost.editPost(content=&apos;Boy howdy!&apos;, publish=1)&lt;/pre&gt;And XML-RPC in Python.  Note that in order to do this, due to Zope&apos;s built in security, you either have to have a hacked XML-RPC library locally that generates authentication headers, of have &lt;a href=&quot;http://www.zope.org/Members/natesain/RPCAuth&quot;&gt;RPCAuth&lt;/a&gt; by Nathan Sain (which I haven&apos;t had time to test yet) installed on Zope:&lt;pre&gt;myPost = xmlrpclib.Server(&apos;.../Posts/123&apos;)myPost.editPost(&apos;Boy Howdy!&apos;, 1))&lt;/pre&gt;These are very similar, but ZPublisher.Client was doing this long before XML-RPC.  Why?  Because Zope was already doing distributed objects (of sorts) on the web, translating HTTP requests into object calls.  It only makes sense that there be some simple client lib.Now, to implement this as a proper Blogger API, and do it the way that Radio style web services are done, instead of necessarily having all of those security declarations on the BlogPost class itself, I would instead have to write this:&lt;pre&gt;def editPost(appkey, postid, username, password, content, publish):  &quot;&quot;&quot; Lookup the post by its ID, verify that the user can access it,      and set its content and published flag &quot;&quot;&quot;  thePost = Posts[postid]  ## security assertions based on username/password would go in here, somehow.  thePost.editPost(content=content, publish=publish)  return 1&lt;/pre&gt;Now, this isn&apos;t too bad.  But, it&apos;s a similar amount of overhead to turn an otherwise already existing published web method as a Web Service.  Huh.As people start exposing ever more valuable resources as Web Services, or even REST, it&apos;s no wonder complications arise.  As we move beyond the &apos;getStateName&apos; example and start getting into exchanging business data (Microsoft&apos;s heavily advertised 1 degree of separation), more care must be taken.  I don&apos;t want everything I write automatically turned into a Web Service.  I don&apos;t necessarily want to have to write extra adapters either.To sum up and say it all over again, the way that &quot;Radio&quot; seems to promote for Web Services is easy.  And simple.  But you&apos;re effectively writing scripted adapters and bridges into other code, something that could turn out to be a maintenance nightmare.  The way that &quot;Zope&quot; has promoted for years (even though it&apos;s not a terrific Web Services player, sadly) says that &quot;Objects and their methods are already published on the web.  No gateway scripts needed.&quot;, but with that comes the price of maintaining security declarations similar to C#.NET&apos;s ASPX&apos;s declarative Web Service calls.  Dave calls the latter too much overhead.  I say it&apos;s the other way around.  It should be easy to write Web Services, but you should have to think about what you publish.  Those declarations aren&apos;t much worse anyways than the long signatures verbose languages like Java can make you write (&lt;tt&gt;protected final synchronous int Bob()&lt;/tt&gt;).</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/04.html#a78</guid>			<pubDate>Sat, 04 May 2002 09:07:25 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=78&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F05%2F04.html%23a78</comments>			</item>		<item>			<title>Accessory Update</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/03.html#a77</link>			<description>Updated &quot;EUCCI accessories&quot; document, which covers the XML-RPC services I found already existed on my old Zope 2.2 server, as well as the new one I wrote today.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/03.html#a77</guid>			<pubDate>Sat, 04 May 2002 04:29:33 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=77&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F05%2F03.html%23a77</comments>			</item>		<item>			<title>AppleScript Studio, XML-RPC, and Zope</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/03.html#a76</link>			<description>I found this article while browsing around today about using &lt;a href=&quot;http://www.cocoadevcentral.com/tutorials/showpage.php?show=00000040.php&quot;&gt;AppleScript Studio and Filemaker&lt;/a&gt;, and I finally had the nerve to do what I&apos;ve been meaning to do for a long time - expose the &lt;strong&gt;hypr&lt;/strong&gt; list of urls for &lt;a href=&quot;http://euc.cx/&quot;&gt;euc.cx&lt;/a&gt; as a list of mappings, and start learning &lt;a href=&quot;http://www.apple.com/applescript/&quot;&gt;AppleScript&lt;/a&gt; / AppleScript Studio.I did it.  Pretty easily too.  I followed the first half of the article, but instead of using Filemaker to fill in the data source, I used a new DTML Method on my site called &lt;b&gt;hyprSWNK&lt;/b&gt;.  I got that app going in about sixteen lines of code - not bad considering the verbosity of AppleScript.  I spent the second half of the evening adding in support to open the URL of the selected row in the table.  I had some problems, because OmniWeb was not responding to the AppleScript statement I was using, but eventually when I tried Internet Explorer, it worked fine.  Pretty cool for a couple of hours work.&lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;http://radio.weblogs.com/0106123/images/2002/05/03/hyprswank.jpg&quot; width=&quot;511&quot; height=&quot;406&quot; border=&quot;0&quot; align=&quot;right&quot; hspace=&quot;5&quot; vspace=&quot;5&quot; alt=&quot;A picture named hyprswank.jpg&quot;&gt;&lt;/div&gt;</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/05/03.html#a76</guid>			<pubDate>Sat, 04 May 2002 01:51:40 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=76&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F05%2F03.html%23a76</comments>			</item>		<item>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/04/21.html#a27</link>			<description>&lt;a href=&quot;http://radio.weblogs.com/0106123/stories/2002/04/21/eucciAccessories.html&quot;&gt;EUCCI accessories&lt;/a&gt;, a new story covering the &lt;tt&gt;&quot;euc.cx&quot;&lt;/tt&gt; XML-RPC API.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/04/21.html#a27</guid>			<pubDate>Sun, 21 Apr 2002 17:28:24 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=27&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F04%2F21.html%23a27</comments>			</item>		<item>			<title>A simple tapping into a hitherto unknown euc.cx XML-RPC service</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/04/20.html#a22</link>			<description>I&apos;ve finally started playing around with the development aspects of &lt;a href=&quot;http://radio.userland.com/&quot;&gt;Radio&lt;/a&gt;, and plugged it into a simple XML-RPC service running on &lt;a href=&quot;http://euc.cx/&quot;&gt;euc.cx&lt;/a&gt;.  euc.cx is running on an old Zope server (Zope 2.2 or earlier, meaning pre-pythonscripts).  It&apos;s primarily a static site, with a few little dynamic pieces.  One is a DTML method called &lt;em&gt;rsong&lt;/em&gt;, which returns a random entry from a list of EUCCI song titles.  It&apos;s a public method (used on the main page, maybe a couple of others), so I wondered if XML-RPC would work out for me in this situation.It did.See, that bit&apos;s easy.  But I&apos;m still annoyed about the whole XML-RPC authentication situation.  As I wrote in a &lt;a href=&quot;http://radio.weblogs.com/0106123/stories/2002/04/18/zopeWebServicesAndWhyItSho.html&quot;&gt;recent story&lt;/a&gt;, Zope should play well with web services.  But the fact that Zope takes security quite seriously makes it very difficult to expose anything other than public methods, unless you hack your local XML-RPC client module/library/whatever to do HTTP Basic Auth.  *sigh;*</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/04/20.html#a22</guid>			<pubDate>Sat, 20 Apr 2002 21:36:47 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=22&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F04%2F20.html%23a22</comments>			</item>		<item>			<title>Zope, Web Services, why BCI was cool and why I sigh at noon.</title>			<link>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/04/18.html#a14</link>			<description>New story &lt;a href=&quot;stories/2002/04/18/zopeWebServicesAndWhyItSho.html&quot;&gt;here&lt;/a&gt; regarding Zope, XML-RPC, Web Services, and the cool stuff Zope/Bobo was doing oh so long ago, and my frustration that it&apos;s still not plugged into the Web Services world as it should be.  Part of this is the fault of protocols like XML-RPC, which doesn&apos;t take into account things like &lt;em&gt;Authentication&lt;/em&gt;, which is so critical and deep to how Zope works that it&apos;s harder to match the two up than it should be.  Part of it is due to the hodge-podge development that&apos;s gone on over the years (which is finally being addressed in Zope 3), especially in regards to the protocal-handling pieces.</description>			<guid>http://radio.weblogs.com/0106123/categories/objectsAndTheWeb/2002/04/18.html#a14</guid>			<pubDate>Fri, 19 Apr 2002 06:09:35 GMT</pubDate>			<comments>http://radiocomments.userland.com/comments?u=106123&amp;amp;p=14&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0106123%2F2002%2F04%2F18.html%23a14</comments>			</item>		</channel>	</rss>