<?xml version="1.0" encoding="UTF-8"?>

<rss version='2.0' 
     xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
     xmlns:doap="http://usefulinc.com/ns/doap#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

    <channel>
        <!-- This XML Feed shows details for the page by 
             and everything recently tagged by -->
        <creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.5/
          </creativeCommons:license>
        <title>by on SWiK</title>
		<link>http://swik.net/by</link>
        <doap:name>by</doap:name>
        <doap:description>
</doap:description>
        <description>
</description> 
	  <!-- see doap:description for full description -->
        <link>http://swik.net/by</link>
        
        <pubDate>Tue, 18 Dec 2007 01:13:14 -0800</pubDate>
        <lastBuildDate>Tue, 18 Dec 2007 01:13:14 -0800</lastBuildDate>
            
        <item>
            <title>[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-2381) Criteria</title>
            <link>http://swik.net/Hibernate/del.icio.us+tag%2Fhibernate/%5Bhibernate-issues%5D+%5BHibernate-JIRA%5D+Commented%3A+%28HHH-2381%29+Criteria/cha0g</link>
            <description></description>
            
            <pubDate>Fri, 10 Oct 2008 11:06:51 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example: Demosite</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example%3A+Demosite/cg70l</link>
            <description>
One possible setup is to create the demosite as a Grok app on its own. You just construct the basic app layout (or let 
    $ svn co svn://svn.zope.org/repos/main/grokapps/gbedemosite
    $ cd gbedemosite
    $ virtualenv --no-site-packages .
    $ source bin/activate&lt;p&gt;
    install_requires=[...
                      &#039;gbeguestbook&#039;,
                      &#039;gbe99bottles&#039;,
                      &#039;gbewiki&#039;,
                      &#039;gbepastebin&#039;,
                      ...
                     ],&lt;p&gt;
    svn co svn://svn.zope.org/repos/main/grokapps/gbeguestbook
    svn co svn://svn.zope.org/repos/main/grokapps/gbe99bottles
    svn co svn://svn.zope.org/repos/main/grokapps/gbewiki
    svn co svn://svn.zope.org/repos/main/grokapps/gbepastebin&lt;p&gt;
    [buildout]
    develop = . gbeguestbook gbe99bottles gbewiki gbepastebin&lt;p&gt;
    $ bin/python bootstrap.py
    $ bin/buildout&lt;p&gt;

You basically only need to change the &amp;#8216;app.py&amp;#8217; template file. Lets assume you created the app by running &amp;#8220;grokproject Demosite&amp;#8221;, you already have a &amp;#8216;Demosite&amp;#8217; application class, with an Index view and the associated &amp;#8216;app_templates/index.pt&amp;#8217; template file.&lt;p&gt;
    @grok.subscribe(Demosite, grok.IObjectAddedEvent)
    def handle(obj, event):
        applications=((&#039;gbeguestbook.app.Application&#039;,&#039;Guestbook&#039;),
                      (&#039;gbe99bottles.app.Song&#039;,&#039;Song&#039;),
                      (&#039;gbewiki.app.WikiPage&#039;,&#039;Wiki&#039;),
                      (&#039;gbepastebin.app.Application&#039;,&#039;Pastebin&#039;),
                      )
        for application, name in applications:
            app = zope.component.getUtility(grok.interfaces.IApplication,
                                            name=application)
            try:
                obj[name] = app()
            except DuplicationError:
                pass&lt;p&gt;

If you want to serve your apps to the public, your site also should provide a &amp;#8216;robots.txt&amp;#8217; file for the webcrawlers.&lt;p&gt;
    class Robots(grok.View):
        grok.name(&#039;robots.txt&#039;)&lt;p&gt;
&lt;p&gt;
    ServerName    your.server.name
    ...
    RewriteEngine On
    RewriteRule ^/(.*)  http://127.0.0.1:8080/&amp;lt;demosite&gt;/++vh++http:your.server.name:80/++/$1 [P,L]
    &amp;lt;/VirtualHost&gt;&lt;p&gt;
&lt;p&gt;
Finally you want to debug the running demosite. Some of the example apps have no means to delete existing objects - you can simply delete objects from the debugger too.&lt;p&gt;

    [buildout]
    ...
    parts = ... zodb server instance2&lt;p&gt;
    [zodb]
    recipe = zc.recipe.egg:script
    eggs = ZODB3&lt;p&gt;
    [server]
    recipe = zc.zodbrecipes:server
    zeo.conf =
       &amp;lt;zeo&gt;
          address 8100
       &amp;lt;/zeo&gt;
       &amp;lt;filestorage 1&gt;
          path ${buildout:parts-directory}/data/ZEOData.fs
       &amp;lt;/filestorage&gt;&lt;p&gt;
    [zopectl]
    recipe = zc.zope3recipes:instance
    application = app
    address = 8080
    zope.conf = devmode on
        &amp;lt;zodb&gt;
          &amp;lt;zeoclient&gt;
            server 8100
          &amp;lt;/zeoclient&gt;
        &amp;lt;/zodb&gt;
        site-definition ${buildout:parts-directory}/app/site.zcml&lt;p&gt;
        &amp;lt;accesslog&gt;
          &amp;lt;logfile&gt;
            path ${buildout:parts-directory}/zopectl/access.log
          &amp;lt;/logfile&gt;
        &amp;lt;/accesslog&gt;&lt;p&gt;
        &amp;lt;eventlog&gt;
          &amp;lt;logfile&gt;
            formatter zope.exceptions.log.Formatter
            path STDOUT
          &amp;lt;/logfile&gt;
        &amp;lt;/eventlog&gt;&lt;p&gt;
    [instance2]
    recipe = zc.zope3recipes:instance
    extends = zopectl
    address = 9080&lt;p&gt;
Run buildout again, run the tests, start the server, start the client:
    $ bin/buildout
    $ bin/test
    $ bin/server start
    $ bin/zopectl fg&lt;p&gt;
    $ sudo a2ensite your-vhost-id
    $ sudo /etc/init.d/apachectl restart&lt;p&gt;

Hope that gets you up and running in record time - creating the demosite application was done in an hour. As always writing the docs took a bit longer ;)
  </description>
            
            <pubDate>Thu, 09 Oct 2008 18:05:01 -0700</pubDate>
        </item>
            
        <item>
            <title>GBE demo site</title>
            <link>http://swik.net/Zope/Planet+Zope/GBE+demo+site/cg125</link>
            <description>
applications. I&amp;#8217;ll add the source for this multi-app site to the GBE apps at a later date.
  </description>
            
            <pubDate>Tue, 07 Oct 2008 10:51:51 -0700</pubDate>
        </item>
            
        <item>
            <title>Webservice development with the Eclipse Web Tool Platform (WTP) - Tutorial</title>
            <link>http://swik.net/Eclipse/del.icio.us%2Ftag%2Feclipse/Webservice+development+with+the+Eclipse+Web+Tool+Platform+%28WTP%29+-+Tutorial/cga1l</link>
            <description>eclipse step by step tutorials</description>
            
            <pubDate>Tue, 30 Sep 2008 04:17:00 -0700</pubDate>
        </item>
            
        <item>
            <title>Firefox 3: 8 Things You Didn&#039;t Know You Could Do - Solutions by PC Magazine</title>
            <link>http://swik.net/Firefox/del.icio.us%2Ftag%2Ffirefox/Firefox+3%3A+8+Things+You+Didn%27t+Know+You+Could+Do+-+Solutions+by+PC+Magazine/cf9ho</link>
            <description></description>
            
            <pubDate>Mon, 29 Sep 2008 18:15:05 -0700</pubDate>
        </item>
            
        <item>
            <title>RIA Frameworks | commadot.com</title>
            <link>http://swik.net/RIA/del.icio.us%2Ftag%2FRIA/RIA+Frameworks+%7C+commadot.com/cf8vw</link>
            <description></description>
            
            <pubDate>Mon, 29 Sep 2008 14:18:16 -0700</pubDate>
        </item>
            
        <item>
            <title>login by code - Spring Community Forums</title>
            <link>http://swik.net/Acegi/del.icio.us+tag%2Facegi/login+by+code+-+Spring+Community+Forums/cfu7b</link>
            <description></description>
            
            <pubDate>Thu, 25 Sep 2008 11:14:03 -0700</pubDate>
        </item>
            
        <item>
            <title>A generic acegi login interface | Wookets Wove</title>
            <link>http://swik.net/Acegi/del.icio.us+tag%2Facegi/A+generic+acegi+login+interface+%7C+Wookets+Wove/cfu7a</link>
            <description>request.getSession().setAttribute(

        HttpSessionCont</description>
            
            <pubDate>Thu, 25 Sep 2008 11:14:03 -0700</pubDate>
        </item>
            
        <item>
            <title>Issues with JSF and Acegi with JdbcDaoImpl controller - Spring Community Forums</title>
            <link>http://swik.net/Acegi/del.icio.us+tag%2Facegi/Issues+with+JSF+and+Acegi+with+JdbcDaoImpl+controller+-+Spring+Community+Forums/cfu69</link>
            <description></description>
            
            <pubDate>Thu, 25 Sep 2008 11:14:03 -0700</pubDate>
        </item>
            
        <item>
            <title>Pregnancy Week By Week</title>
            <link>http://swik.net/User:leonardo056/leonardo056/Pregnancy+Week+By+Week/cft06</link>
            <description>&lt;p&gt;Read this to know what&amp;#8217;s happening inside you during pregnancy week by week.&lt;/p&gt;
</description>
            
            <pubDate>Thu, 25 Sep 2008 05:22:59 -0700</pubDate>
        </item>
            
        <item>
            <title>Home</title>
            <link>http://swik.net/Eclipse/del.icio.us%2Ftag%2Feclipse/Home/cfks5</link>
            <description>Eclipse 40mm semi-auto revolver by Solar</description>
            
            <pubDate>Tue, 23 Sep 2008 00:10:13 -0700</pubDate>
        </item>
            
        <item>
            <title>How to install and setup Apache, MySQL and PHP in Windows - Simple Help</title>
            <link>http://swik.net/WAMP/del.icio.us%2Ftag%2Fwamp/How+to+install+and+setup+Apache%2C+MySQL+and+PHP+in+Windows+-+Simple+Help/ce2iu</link>
            <description></description>
            
            <pubDate>Wed, 17 Sep 2008 17:03:15 -0700</pubDate>
        </item>
            
        <item>
            <title>Manual:FAQ - MediaWiki</title>
            <link>http://swik.net/MediaWiki/del.icio.us%2Ftag%2Fmediawiki/Manual%3AFAQ+-+MediaWiki/cew36</link>
            <description></description>
            
            <pubDate>Tue, 16 Sep 2008 11:08:21 -0700</pubDate>
        </item>
            
        <item>
            <title>Wholesale Property – DiscountedProperties.com</title>
            <link>http://swik.net/User:nadiadaviar/Wholesale+Property+%E2%80%93+DiscountedProperties.com/Wholesale+Property+%E2%80%93+DiscountedProperties.com/ceuy5</link>
            <description>&lt;p&gt;Wholesale Property listing service.  DiscountedProperties.com offers fixer upper homes, pre foreclosure real estate, and investment property.&lt;/p&gt;
</description>
            
            <pubDate>Tue, 16 Sep 2008 00:38:08 -0700</pubDate>
        </item>
            
        <item>
            <title>Slide TOC</title>
            <link>http://swik.net/Joomla/Del.icio.us+bookmarks+tagged+Joomla/Slide+TOC/ceuk4</link>
            <description>Joomla installation web help and step by step guide</description>
            
            <pubDate>Mon, 15 Sep 2008 22:00:44 -0700</pubDate>
        </item>
            
        <item>
            <title>Lists</title>
            <link>http://swik.net/Eclipse/del.icio.us%2Ftag%2Feclipse/Lists/cejoa</link>
            <description></description>
            
            <pubDate>Fri, 12 Sep 2008 12:59:55 -0700</pubDate>
        </item>
            
        <item>
            <title>Check Writer Program| The Advantage is Yours!</title>
            <link>http://swik.net/User:ashleybeyle/Check+Writer+Program%7C+The+Advantage+is+Yours%21</link>
            <description>&lt;p&gt;Accepting check by Phone, E-Mail, Fax or Online is absolutely possible with Check Writer Program with its innovative and lucrative advantageous features.&lt;/p&gt;


	&lt;p&gt;for more info visit: http://www.checkwriterprogram.com&lt;/p&gt;
</description>
                        <category>fax</category>
            <category>checks,</category>
            <category>Phone,</category>
            <category>by</category>
            <category>electronic</category>
            <category>register</category>
            <category>check</category>
            <category>software,</category>
            <category>free</category>
            <category>Registers,</category>

            <pubDate>Fri, 12 Sep 2008 11:31:33 -0700</pubDate>
        </item>
            
        <item>
            <title>Flipping Houses – DiscountedProperties.com</title>
            <link>http://swik.net/User:daisyeloise/Flipping+Houses+%E2%80%93+DiscountedProperties.com/Flipping+Houses+%E2%80%93+DiscountedProperties.com/cegmw</link>
            <description>&lt;p&gt;Flipping Houses and Wholesale Property listings.  DiscountedProperties.com offers fixer upper homes, rehab homes, and homes for sale by owner for real estate investors.&lt;/p&gt;
</description>
            
            <pubDate>Thu, 11 Sep 2008 19:52:45 -0700</pubDate>
        </item>
            
        <item>
            <title>MyVocal</title>
            <link>http://swik.net/podcasting/del.icio.us+tag%2Fpodcasting/MyVocal/cedwk</link>
            <description></description>
            
            <pubDate>Thu, 11 Sep 2008 04:59:54 -0700</pubDate>
        </item>
            
        <item>
            <title>Investment Property - DiscountedProperties.com</title>
            <link>http://swik.net/User:aalext27/Investment+Property+-+DiscountedProperties.com</link>
            <description>&lt;p&gt;Investment Property and Fixer Upper Homes listings.  DiscountedProperties.com is a unique real estate investment property listing service offering Investment Property for sale.
http://www.discountedproperties.com&lt;/p&gt;
</description>
                        <category>for</category>
            <category>fsbo,</category>
            <category>owner,</category>
            <category>by</category>
            <category>Investment</category>
            <category>wholesale</category>
            <category>sale</category>
            <category>real</category>
            <category>estate</category>
            <category>upper,</category>

            <pubDate>Thu, 11 Sep 2008 01:06:37 -0700</pubDate>
        </item>
            
        <item>
            <title>Extensions for Joomla!</title>
            <link>http://swik.net/Joomla/Del.icio.us+bookmarks+tagged+Joomla/Extensions+for+Joomla%21/cec4q</link>
            <description>Joomlaspan - Home of free Joomla Extensions and other resources</description>
            
            <pubDate>Thu, 11 Sep 2008 00:59:27 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example: Wiki</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example%3A+Wiki/cc7l9</link>
            <description>
install_requires=[&#039;setuptools&#039;,
                  &#039;grok&#039;,
                  ...
                  &#039;megrok.tinymce&#039;,
                  ],&lt;p&gt;
&amp;lt;script type=&quot;text/javascript&quot;
  tal:attributes=&quot;src context/++resource++TinyMCE/tiny_mce.js&quot;&gt;&amp;lt;/script&gt;&lt;p&gt;
GAE uses the webapp.WSGIApplication and already configures the URL dispatching as a wildcard pattern:&lt;p&gt;
&lt;p&gt;
class WikiPage(grok.Application, grok.Container):
    ...
    def traverse(self, page_name=default_page_name):
        ...&lt;p&gt;

While GAE webapp.RequestHandler classes understand HTTP methods and dispatch accordingly, Grok uses grok.View classes that &amp;#8216;render&amp;#8217; the representation of the current context object.&lt;p&gt;
Here both frameworks use templating to render the context object and return the result.&lt;p&gt;
class BaseRequestHandler(webapp.RequestHandler):
    def generate(self, template_name, template_values={}):
        ...
        self.response.out.write(template.render(path, values, debug=_DEBUG))&lt;p&gt;

In this example GAE uses the low-level &amp;#8216;datastore&amp;#8217; API to store and retrieve Page objects to and from the appengine datastore:
def load(name):
    query = datastore.Query(&#039;Page&#039;)
    ...&lt;p&gt;
def save(self):
    datastore.Put(entity)&lt;p&gt;

def dc(self):
    return IZopeDublinCore(self.context)&lt;p&gt;
GAE uses the appengine &amp;#8216;users&amp;#8217; API to handle the posting of new or editing existing wiki pages. The user must be logged in with her google account:
def post(self, page_name):
    if not users.get_current_user():
        self.redirect(users.create_login_url(self.request.uri))
    ...&lt;p&gt;
class WikiPage(grok.Application, grok.Container):
    grok.local_utility(PluggableAuthentication, IAuthentication,
                       setup=setup_pau_principal)&lt;p&gt;
&lt;p&gt;
class PermissionEditPage(grok.Permission):
    grok.name(&#039;wiki.EditPage&#039;)&lt;p&gt;
class PermissionAddPage(grok.Permission):
    grok.name(&#039;wiki.AddPage&#039;)&lt;p&gt;
permission_mngr = IPrincipalPermissionManager(grok.getSite())
permission_mngr.grantPermissionToPrincipal(
   &#039;wiki.AddPage&#039;, principals.prefix + login)
permission_mngr.grantPermissionToPrincipal(
   &#039;wiki.EditPage&#039;, principals.prefix + login)&lt;p&gt;
class Login(Master):
    def update(self, login_submit=None):
        ...&lt;p&gt;
Before returning the rendered Page (@@index view) to the user, the page content gets wikified. In our example a list of transformations is applied to the &amp;#8216;content&amp;#8217; by adapting the view object itself:
class Index(Master):&lt;p&gt;
    def wikified_content(self):
        self.content = self.context.content
        ...&lt;p&gt;
        transforms = [
          &#039;wiki.AutoLink&#039;,
          &#039;wiki.ListOfPages&#039;,
          &#039;wiki.WikiWords&#039;,
        ]&lt;p&gt;
        for transform in transforms:
            self.content = getAdapter(self, ITransform, transform).run()
        return self.content&lt;p&gt;
class ITransform(Interface):
    pass&lt;p&gt;
class WikiWords(grok.Adapter):
    grok.implements(ITransform)
    grok.name(&#039;wiki.WikiWords&#039;)
    grok.context(grok.View)
    ...&lt;p&gt;
Several actions return a feedback message to the user which is displayed above the content on the next response page.&lt;p&gt;

Porting this application took quite some time (about 1 day), mostly because of implementing the user management (again) and getting megrok.tinymce working.
The wiki app is usable as is and also works fine when used inside an existing grok application. Transformation/Wikification of page contents through adapters could easily be made into a plugin-like configuration (using a distinct admin form). Also the renderer (TinyMCE and HTML) could be pluggable replaced by a RestructuredText based engine.
  </description>
            
            <pubDate>Sat, 30 Aug 2008 04:51:55 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example/cczdv</link>
            <description>
Motivation is that you can look at the original source and the grok code side-by-side and deduce from both. Source is available from
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:22 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example: Guestbook</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example%3A+Guestbook/cczds</link>
            <description>
Both frameworks use the &amp;#8216;Application&amp;#8217; concept. Grok subclasses from both grok.Application and grok.Container:
    class Application(grok.Application, grok.Container):
        pass&lt;p&gt;

    application = webapp.WSGIApplication([
                        (&#039;/&#039;, MainPage),
                        (&#039;/sign&#039;, Guestbook)
                        ], debug=True)&lt;p&gt;

The application accepts 2 possible requests: the default view and the action to post the form contents to.&lt;p&gt;
    class MainPage(grok.View):
        grok.context(Application)
        grok.name(&#039;index&#039;)
        ...&lt;p&gt;
    class MainPage(webapp.RequestHandler):
        def get(self):
            ...&lt;p&gt;
Grok has a &amp;#8216;grok.REST&amp;#8217; class that supports HTTP method dispatching, but it is not used in the example:
    class Guestbook(grok.View):
        ...
        def render(self):
            if self.request.method.upper() != &#039;POST&#039;:
                return self.redirect(self.application_url())
            ...&lt;p&gt;
    class Guestbook(webapp.RequestHandler):
        def post(self):
            ...&lt;p&gt;

Grok output is collected and returned from the view &amp;#8216;render&amp;#8217; method:
    def render(self):
        out=[&#039;&amp;lt;html&gt;&amp;lt;body&gt;&#039;]
        ...
        return &#039;&#039;.join(out)&lt;p&gt;
&lt;p&gt;
Grok content objects are subclassed from grok.Model. Properties are defined in an Interface class which the object implements:
    class IGreeting(Interface):
        author = schema.Field(title=u&#039;Author&#039;)
        ...&lt;p&gt;
    class Greeting(grok.Model):
        grok.implements(IGreeting)&lt;p&gt;
    class Greeting(db.Model):
      author = db.UserProperty()&lt;p&gt;
Grok content objects are instantiated, modified and finally inserted into a container (which here is the application object itself). A local-unique name must be provided on insertion. Existing objects must be deleted and reinserted. Properties are not validated by default:
    id=str(uuid.uuid4())
    self.context[id]=greeting&lt;p&gt;
&lt;p&gt;
Grok uses python to locate objects and create a result listing:
    greetings=[(x.date, x) for x in self.context.values()]
    greetings=list(reversed(sorted(greetings)))
    for date,greeting in greetings[:10]:
        ...&lt;p&gt;
    greetings = db.GqlQuery(&quot;SELECT * &quot;
                            &quot;FROM Greeting &quot;
                            &quot;ORDER BY date DESC LIMIT 10&quot;)
    for greeting in greetings:
        ...&lt;p&gt;
Grok has no fixed &amp;#8216;user&amp;#8217; API, user management depends on loaded authentication plugins:
    greeting.author = self.request.principal
    ...
    if IUnauthenticatedPrincipal.providedBy(greeting.author):
        ...	&lt;p&gt;
    if users.get_current_user():
        greeting.author = users.get_current_user()
    ...
    if greeting.author:
        ...&lt;p&gt;
Grok is a long-running process. Requests are processed, the object graph is traversed to a final context object and the result of calling the view on the context object is returned.&lt;p&gt;
    def main():
        wsgiref.handlers.CGIHandler().run(application)&lt;p&gt;
The number of lines of code is about the same. For this small example GAE is simpler with respect to the number of APIs and concepts used and richer with respect to debugging and datasecurity.
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:21 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example: 99 Bottles</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example%3A+99+Bottles/cczdj</link>
            <description>
When we create the &amp;#8216;Song&amp;#8217; Application object, we want to set it to an initial state, like creating a Wall, creating a number of Bottles and adding them to the Wall.&lt;p&gt;
    @grok.subscribe(Song, grok.IObjectAddedEvent)
    def handle(obj, event):
        obj[&#039;wall&#039;]=wall=Wall()
        wall.add_99_bottles()&lt;p&gt;

The application accepts only one distinct request: the default view.&lt;p&gt;
    class Index(grok.View):
        grok.context(Song)&lt;p&gt;
The view classes are created and called for each Request. The &amp;#8216;update&amp;#8217; and &amp;#8216;render&amp;#8217; methods are essential parts of rendering a Response from a view class.&lt;p&gt;
    def update(self):
        self.wall=self.context[&#039;wall&#039;]&lt;p&gt;

Grok content objects are subclassed from grok.Model or grok.Container. 
    class Bottle(grok.Model):
        pass&lt;p&gt;
    class Wall(grok.Container):
        ...&lt;p&gt;
    class Song(grok.Application,grok.Container):
        pass&lt;p&gt;
When a Response is created by the view class, Bottle objects are removed from and added to the Wall container by calling methods of the Wall instance object:
    def remove_a_bottle(self):
        bottles=list(self.keys())
        del self[bottles[-1]]&lt;p&gt;
    def add_99_bottles(self):
        for n in range(1,100):
            self[str(n)]=Bottle()&lt;p&gt;
The objects can simply be queried using python:
    def contents(self):
        return len(self.items())&lt;p&gt;
A functional doctest (&amp;#8217;app.txt&amp;#8217;) is added to ensure correct operations.&lt;p&gt;
It was fun and easy to implement the &amp;#8216;99 Bottles&amp;#8217; Song using persistent objects. Functional testing made development even simpler.
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:20 -0700</pubDate>
        </item>
            
        <item>
            <title>Mac OSX Software - MultiFirefox 2.0 | Code Contortionist</title>
            <link>http://swik.net/Firefox/del.icio.us%2Ftag%2Ffirefox/Mac+OSX+Software+-+MultiFirefox+2.0+%7C+Code+Contortionist/cbc7s</link>
            <description></description>
            
            <pubDate>Thu, 24 Jul 2008 01:51:41 -0700</pubDate>
        </item>
            
        <item>
            <title>Complete Hibernate Tutorial, HibernateStep by Step with Code Example ,Hibernate A to Z, download the code and test your self</title>
            <link>http://swik.net/Hibernate/del.icio.us+tag%2Fhibernate/Complete+Hibernate+Tutorial%2C+HibernateStep+by+Step+with+Code+Example+%2CHibernate+A+to+Z%2C+download+the+code+and+test+your+self/b9jtg</link>
            <description></description>
            
            <pubDate>Tue, 08 Jul 2008 02:48:05 -0700</pubDate>
        </item>
            
        <item>
            <title>Git merging by example</title>
            <link>http://swik.net/git/del.icio.us+tag%2Fgit/Git+merging+by+example/b7rdp</link>
            <description></description>
            
            <pubDate>Wed, 18 Jun 2008 06:17:58 -0700</pubDate>
        </item>
            
        <item>
            <title>Beryl Cook Prints</title>
            <link>http://swik.net/Beryl/del.icio.us+tag+beryl/Beryl+Cook+Prints/b6rkq</link>
            <description>Buy some of the most sought-after Beryl Cook prints available on the Web. We have fantastic Beryl Cook prints from throughout her career.</description>
            
            <pubDate>Fri, 06 Jun 2008 04:53:47 -0700</pubDate>
        </item>
            
        <item>
            <title>Beryl Cook Art</title>
            <link>http://swik.net/Beryl/del.icio.us+tag+beryl/Beryl+Cook+Art/b6mkc</link>
            <description>Buy Beryl Cook art from BerylCookUK.com. Our selection includes some of the most sought-after Beryl Cook works available on the Web.</description>
            
            <pubDate>Wed, 04 Jun 2008 13:50:38 -0700</pubDate>
        </item>
                </channel>
</rss>
