<?xml version="1.0" encoding="ISO-8859-15"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#"
      xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title mode="escaped" type="text/html">Ruslan Spivak</title>
  <tagline>ATOM Feed - Ruslan Spivak</tagline>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak" />
  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak</id>
  <generator url="http://cps-project.org" version="3">CPS</generator>
  <modified>2005-01-31 19:39:14</modified>

  <link rel="service.feed"
        href=" http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/atomFeed"
        title="Ruslan Spivak" type="application/atom+xml" />
  <link rel="service.post"
        href=" http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/postAtom"
        title="Ruslan Spivak" type="application/atom+xml" />
  <link rel="service.categories"
        href=" http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/atomCategories"
        title="Ruslan Spivak" type="application/atom+xml" />

  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Here we go - Java Content Repository Ice Connector</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2006_04_28_here-we-go-java-content-repository-ice-connector" />
  <issued>2006-06-20T11:10:43Z</issued>
  <modified>2006-06-20T11:10:43Z</modified>
  <created>2006-04-28T20:43:10Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>cps</dc:subject>
  
  
    <dc:subject>ecm</dc:subject>
  
  
  <summary type="text/html" mode="escaped">This is kind of announcement what i was working on recently :)
  
  And recently i began to work on Jackrabbit JCR connector that is Java
  implementation of a facade to JCR utilising Ice communications engine that
  provides bidirectional cross-language integration service, high-scalable
  communication platform and this
  way Ice Connector allows to interact transparently with JCR from ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">This is kind of announcement what i was working on recently :)&lt;br /&gt;
  &lt;br /&gt;
  And recently i began to work on Jackrabbit JCR connector that is Java
  implementation of a facade to JCR utilising Ice communications engine that
  provides bidirectional cross-language integration service, high-scalable
  communication platform and this&lt;br /&gt;
  way Ice Connector allows to interact transparently with JCR from Java, C#,
  VB, C++, Python, PHP.&lt;br /&gt;
  &lt;br /&gt;
  Ice, the Internet Communications Engine, is a free high-performance
  middleware which includes wealth of services and plug-ins:&lt;br /&gt;
  messaging service, grid compuring and much more.&lt;br /&gt;
  You can get additional information at &lt;a
  href="http://www.zeroc.com"&gt;http://www.zeroc.com&lt;/a&gt;&lt;br /&gt;
  &lt;br /&gt;
  Currently JCR Ice Connector provides small set of read methods, but more
  stuff is on the way.&amp;nbsp; And, yes simple Python client is included
  :)&lt;br /&gt;
  You can check the code at:&lt;br /&gt;
  &lt;a
  href="http://svn.nuxeo.org/trac/pub/browser/YellowCake/org.nuxeo.jackrabbit.ice/trunk"&gt;
  http://svn.nuxeo.org/trac/pub/browser/YellowCake/org.nuxeo.jackrabbit.ice/trunk&lt;/a&gt;&lt;br /&gt;

  More information is at:&lt;br /&gt;
  &lt;a
  href="http://svn.nuxeo.org/trac/pub/file/YellowCake/org.nuxeo.jackrabbit.ice/trunk/README.txt"&gt;
  http://svn.nuxeo.org/trac/pub/file/YellowCake/org.nuxeo.jackrabbit.ice/trunk/README.txt&lt;/a&gt;&lt;br /&gt;

  This will be part of our ongoing effort towards CPS4, so stay tuned :)&lt;br /&gt;
  &lt;br /&gt;</content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2006_04_28_here-we-go-java-content-repository-ice-connector</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2006_04_28_here-we-go-java-content-repository-ice-connector/atom?2006_04_28_here-we-go-java-content-repository-ice-connector"
        title="Edit Here - Here we go - Java Content Repository Ice Connector" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Nautilus + ps2pdf script</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_11_20_nautilus-ps2pdf-script" />
  <issued>2005-11-20T17:18:30Z</issued>
  <modified>2005-11-20T17:18:30Z</modified>
  <created>2005-11-20T17:17:08Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>linux</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Recently i was producing many funkload's bench results. Firefox lets
  you easily create files in PostScript format by printing page to file. I
  wanted easy way to convert produced ps files to pdf from Nautilus without
  going to terminal. Thanks to Nautilus, it supports custom scripts(more info
  here), that after
  putting to ~./gnome2/nautilus-scripts directory, appear in popup
  ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">Recently i was producing many &lt;a
  href="http://funkload.nuxeo.org/"&gt;funkload's&lt;/a&gt; bench results. Firefox lets
  you easily create files in PostScript format by printing page to file. I
  wanted easy way to convert produced ps files to pdf from Nautilus without
  going to terminal. Thanks to Nautilus, it supports custom scripts(more info
  &lt;a href="http://g-scripts.sourceforge.net/faq.php"&gt;here&lt;/a&gt;), that after
  putting to &lt;i&gt;~./gnome2/nautilus-scripts&lt;/i&gt; directory, appear in popup
  context menu.&lt;br /&gt;
  &lt;br /&gt;
&lt;pre&gt;
  #!/bin/bash&lt;br /&gt;
  cd $NAUTILUS_SCRIPT_CURRENT_URI
  for arg in $@
  do
  &amp;nbsp;&amp;nbsp;&amp;nbsp; ps2pdf $arg
  done
&lt;/pre&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  After saving that in ps2pdf.sh and making script executable you can convert
  one or multiple selected ps files to pdf by right clicking on selected file(s) -&amp;gt;
  Scripts -&amp;gt; ps2pdf&lt;br /&gt;
  Very nice :)&lt;br /&gt;
  &lt;br /&gt;</content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_11_20_nautilus-ps2pdf-script</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_11_20_nautilus-ps2pdf-script/atom?2005_11_20_nautilus-ps2pdf-script"
        title="Edit Here - Nautilus + ps2pdf script" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">AdapterLookup C optimizations: status</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_06_adapterlookup-c" />
  <issued>2005-09-07T18:57:45Z</issued>
  <modified>2005-09-07T18:57:45Z</modified>
  <created>2005-09-06T21:14:41Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>python</dc:subject>
  
  
    <dc:subject>zope3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">I was talking to Jim Fulton some time ago regarding C optimizations to
  adapter lookup. Jim currently makes experiments regarding new architecture
  for that stuff. If he decides to left  old architecture then my branch
  will be considered. There is a lot of stuff to clean and make better in my
  branch, but currently i'm waiting for Jim's decision.
   
   As a byproduct of my work ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">I was talking to Jim Fulton some time ago regarding C optimizations to
  adapter lookup. Jim currently makes experiments regarding new architecture
  for that stuff. If he decides to left&amp;nbsp; old architecture then my branch
  will be considered. There is a lot of stuff to clean and make better in my
  branch, but currently i'm waiting for Jim's decision.&lt;br /&gt;
   &lt;br /&gt;
   As a byproduct of my work on adapter lookup C optimization i wrote 2
  patches for Python, one was fixing possible memory leak(that possibility is
  though very rare) in builtin &lt;b&gt;&lt;i&gt;filter&lt;/i&gt;&lt;/b&gt;
  function(&lt;i&gt;Python/bltinmodule.c&lt;/i&gt;) and was accepted nearly at once(thanks
  to developers not beating me for sending it to dev list, one should post it
  into sf.net patches section for python :), second was just to remove
  trailing whitespaces in &lt;i&gt;builtin&lt;/i&gt; module, both were actually one patch,
  but i was told(and right) to divide cosmetics into separate patch and that
  was recently accepted, so both now are in Python2.5 trunk.&lt;br /&gt;
   Well, at least i'm glad i was able to make something useful(?:) for best programming language in the world! :)&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;</content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_09_06_adapterlookup-c</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_06_adapterlookup-c/atom?2005_09_06_adapterlookup-c"
        title="Edit Here - AdapterLookup C optimizations: status" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">BTrees and pop()</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_03_btrees-pop" />
  <issued>2005-09-03T13:58:44Z</issued>
  <modified>2005-09-03T13:58:44Z</modified>
  <created>2005-09-03T13:55:56Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>zope3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Yesterday Tim Peters merged my branch for pop() method in
  BTree and Bucket into main trunk, so ZODB3.6 now has this
  feature and is closer to what python's mapping protocol provides.
   
   Of course Tim made modifications to C code to make it more simple
  and added more tests :) Thanks Tim!
   
  Now we have both setdefault() and pop() methods,
  hope people will find it useful in ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">Yesterday Tim Peters merged my branch for &lt;i&gt;pop()&lt;/i&gt; method in
  &lt;i&gt;BTree&lt;/i&gt; and &lt;i&gt;Bucket&lt;/i&gt; into main trunk, so ZODB3.6 now has this
  feature and is closer to what python's mapping protocol provides.&lt;br /&gt;
   &lt;br /&gt;
   Of course Tim made modifications to &lt;b&gt;C&lt;/b&gt; code to make it more simple
  and added more tests :) Thanks Tim!&lt;br /&gt;
   &lt;br /&gt;
  Now we have both &lt;b&gt;&lt;i&gt;setdefault()&lt;/i&gt;&lt;/b&gt; and &lt;b&gt;&lt;i&gt;pop()&lt;/i&gt;&lt;/b&gt; methods,
  hope people will find it useful in their ZODB applications.&lt;br /&gt;</content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_09_03_btrees-pop</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_03_btrees-pop/atom?2005_09_03_btrees-pop"
        title="Edit Here - BTrees and pop()" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">BTrees and setdefault</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_01_btrees-setdefault" />
  <issued>2005-09-02T16:11:32Z</issued>
  <modified>2005-09-02T16:11:32Z</modified>
  <created>2005-09-01T21:54:38Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>zope3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Working on Z3ECM code base i met following code construction: 

try:
    return self.__applications[key]
except KeyError:
    self.__applications[key] = PersistentList()
    return self.__applications[key]
where __applications is OOBTree.

  My immediate reaction was to use standard python's mapping protocol method &amp;#8211;
  setdefault as «Readability counts» (C) and rewrite above ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">Working on Z3ECM code base i met following code construction: 
&lt;pre&gt;
try:
    return self.__applications[key]
except KeyError:
    self.__applications[key] = PersistentList()
    return self.__applications[key]&lt;br /&gt;
where __applications is OOBTree.
&lt;/pre&gt;
  My immediate reaction was to use standard python's mapping protocol method &amp;#8211;
  &lt;u&gt;&lt;i&gt;setdefault&lt;/i&gt;&lt;/u&gt; as «Readability counts» (C) and rewrite above long
  code to following: 
&lt;pre&gt;
return self.__applications.setdefault(key, PersistentList())
&lt;/pre&gt;
  nice, isn't it? and i was a bit surprised to get 
&lt;pre&gt;
AttributeError: 'BTrees._OOBTree.OOBTree' object has no attribute 'setdefault'&lt;br /&gt;
&lt;/pre&gt;
  Of course &lt;i&gt;setdefault&lt;/i&gt; can be easily emulated, but i want to have short
  code :) You need to be aware that default argument instance will be created
  each time you call &lt;i&gt;setdefault&lt;/i&gt;, even if it won't be used. &lt;br /&gt;
   &lt;br /&gt;
   So i raised question in zodb-dev mailing list about adding
  &lt;i&gt;setdefault&lt;/i&gt; method to ZODB and was kindly pointed by Dmitry Vasiliev
  that this question was raised nearly a year ago - &lt;a
  id="http://mail.zope.org/pipermail/zodb-dev/2004-October/008040.html"
  href="http://mail.zope.org/pipermail/zodb-dev/2004-October/008040.html"
  name="http://mail.zope.org/pipermail/zodb-dev/2004-October/008040.html"
  title="http://mail.zope.org/pipermail/zodb-dev/2004-October/008040.html"&gt;&lt;/a&gt;
  &lt;a
  href="http://mail.zope.org/pipermail/zodb-dev/2004-October/008040.html"&gt;http://mail.zope.org/pipermail/zodb-dev/2004-October/008040.html&lt;/a&gt;
  and as a result it was frozen and no implementation was provided. &lt;br /&gt;
   &lt;br /&gt;
   Currently some people came up that it's a good idea to have this method for
  btrees, some had objections. Tim Peters showed how &lt;i&gt;setdefault&lt;/i&gt; could
  be emulated:&lt;br /&gt;
   This one is obvious: 
&lt;pre&gt;
result = self.__applications.get(key, None)
if result is None:
    result = self.__applications[key] = PersistentList()
return result
&lt;/pre&gt;
  While this one uses special btree's method &lt;i&gt;insert&lt;/i&gt;: 
&lt;pre&gt;
self.__applications.insert(key, PersistentList())
return self.__applications[key]
&lt;/pre&gt;
  This time Jim Fulton gave +1 and as Tim noted: - «Jim's +1 wipes out any
  number of -0 votes :) .» &lt;br /&gt;
   So i made my hands dirty, created separate branch in ZODB and implemented
  &lt;i&gt;setdefault&lt;/i&gt; (of course in &lt;b&gt;C&lt;/b&gt; :) Bit lately when reviewing my
  branch Tim noted the behaviour(specific) of python's &lt;i&gt;setdefault&lt;/i&gt;
  doesn't fit well with BTree: 
&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; d = {}
&amp;gt;&amp;gt;&amp;gt; d.setdefault(666)
&amp;gt;&amp;gt;&amp;gt; d
{666: None}
&lt;/pre&gt;
  You see what's the point? &lt;br /&gt;
   It will work only with OOBTree and IO, but not with OI, II, IF. &lt;br /&gt;
   Tim proposed to have 2 required parameters to &lt;i&gt;setdefault&lt;/i&gt; and that's
  how it's now &amp;#8211; you should explicitely pass default to method and this was
  raised on python-dev too and seems like this behaviour will go into standard
  python, because usage of &lt;i&gt;setdefault&lt;/i&gt; without explicit default is
  confusing and useless. &lt;br /&gt;
   &lt;br /&gt;
   So, Tim mercilesly refactored my code, of course to make it better :),
  thanks Tim. &lt;br /&gt;
   As a result branch is now merged and we have &lt;i&gt;setdefault&lt;/i&gt; method in
  ZODB3.5 final, so you can use it with Zope3 now (currently with 3.1 branch
  and soon with trunk) and write short, readable code, though, of course,
  someone may argue :) &lt;br /&gt;
   &lt;br /&gt;
   More to come...</content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_09_01_btrees-setdefault</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_01_btrees-setdefault/atom?2005_09_01_btrees-setdefault"
        title="Edit Here - BTrees and setdefault" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">AdapterLookup C optimizations</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_08_05_adapterlookup_c" />
  <issued>2005-08-05T07:47:50Z</issued>
  <modified>2005-08-05T07:47:50Z</modified>
  <created>2005-08-05T07:23:54Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>zope3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">
  Recently i have created branch in Zope3 repository for checkin in
  AdapterLookup optimizations, ie rewriting it in C for speed up as many
  applications will be doing lots of lookup requests, so this part is quite
  crucial.
   You can take a look at it here:
   
  http://svn.zope.org/Zope3/branches/alienoid-adapter_lookup_coptimizations/

   
   For the moment all methods(namely ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">
  Recently i have created branch in Zope3 repository for checkin in
  AdapterLookup optimizations, ie rewriting it in C for speed up as many
  applications will be doing lots of lookup requests, so this part is quite
  crucial.&lt;br /&gt;
   You can take a look at it here:&lt;br /&gt;
   &lt;a
  href="http://svn.zope.org/Zope3/branches/alienoid-adapter_lookup_coptimizations/"&gt;
  http://svn.zope.org/Zope3/branches/alienoid-adapter_lookup_coptimizations/&lt;/a&gt;&lt;br /&gt;

   &lt;br /&gt;
   For the moment all methods(namely &lt;i&gt;lookup, lookup1,&lt;/i&gt;
  &lt;i&gt;adapter_hook,&lt;/i&gt; &lt;i&gt;queryAdapter, subscriptions, subscribers,
  queryMultiAdapter&lt;/i&gt;) are implemented and pass tests, of course code is far
  from ideal, but i'm trying and waiting for &lt;br /&gt;
  Jim Fulton to come back from holidays and take a look at my attempt to make
  world better or better to say faster :) &lt;br /&gt;
   &lt;br /&gt;
   Here are benchmarks with 'timeit' i have on my P4 2.4Gh 1Gb RAM, run 3
  times for Python and C versions. All developments and tests under linux of
  course :)&lt;br /&gt;
   &lt;br /&gt;
   &lt;b&gt;Python version:&lt;br /&gt;
   ==========&lt;br /&gt;
  &lt;/b&gt; 2.189&amp;nbsp;&amp;nbsp; registry.lookup([IR1], IP2, '')&lt;br /&gt;
   2.199&amp;nbsp;&amp;nbsp; registry.lookup([IR2], IP2, '')&lt;br /&gt;
   2.067&amp;nbsp;&amp;nbsp; registry.lookup([zope.interface.implementedBy(C2)], IP2,
  '')&lt;br /&gt;
   4.418&amp;nbsp;&amp;nbsp; registry.lookup([IR1, IQ], IP2, '')&lt;br /&gt;
   2.377&amp;nbsp;&amp;nbsp; registry.lookup1(IR2, IP1)&lt;br /&gt;
   3.528&amp;nbsp;&amp;nbsp; registry.queryAdapter(x, IP1)&lt;br /&gt;
   3.271&amp;nbsp;&amp;nbsp; registry.adapter_hook(IP1, x)&lt;br /&gt;
   6.128&amp;nbsp;&amp;nbsp; registry.queryMultiAdapter((x, q), IM)&lt;br /&gt;
   2.467&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1], IP2)&lt;br /&gt;
   2.472&amp;nbsp;&amp;nbsp; registry.subscriptions([IR2], IP1)&lt;br /&gt;
   3.445&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1, IQ], IP2)&lt;br /&gt;
   5.385&amp;nbsp;&amp;nbsp; registry.subscribers((x, q), IM)&lt;br /&gt;
   201.965163946 - total elapsed&lt;br /&gt;
   --------------------------------------------------&lt;br /&gt;
   2.194&amp;nbsp;&amp;nbsp; registry.lookup([IR1], IP2, '')&lt;br /&gt;
   2.197&amp;nbsp;&amp;nbsp; registry.lookup([IR2], IP2, '')&lt;br /&gt;
   2.071&amp;nbsp;&amp;nbsp; registry.lookup([zope.interface.implementedBy(C2)], IP2,
  '')&lt;br /&gt;
   4.389&amp;nbsp;&amp;nbsp; registry.lookup([IR1, IQ], IP2, '')&lt;br /&gt;
   2.414&amp;nbsp;&amp;nbsp; registry.lookup1(IR2, IP1)&lt;br /&gt;
   3.563&amp;nbsp;&amp;nbsp; registry.queryAdapter(x, IP1)&lt;br /&gt;
   3.295&amp;nbsp;&amp;nbsp; registry.adapter_hook(IP1, x)&lt;br /&gt;
   6.148&amp;nbsp;&amp;nbsp; registry.queryMultiAdapter((x, q), IM)&lt;br /&gt;
   2.475&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1], IP2)&lt;br /&gt;
   2.467&amp;nbsp;&amp;nbsp; registry.subscriptions([IR2], IP1)&lt;br /&gt;
   3.440&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1, IQ], IP2)&lt;br /&gt;
   5.375&amp;nbsp;&amp;nbsp; registry.subscribers((x, q), IM)&lt;br /&gt;
   201.607703924 - total elapsed&lt;br /&gt;
   ------------------------------------------------&lt;br /&gt;
   2.230&amp;nbsp;&amp;nbsp; registry.lookup([IR1], IP2, '')&lt;br /&gt;
   2.220&amp;nbsp;&amp;nbsp; registry.lookup([IR2], IP2, '')&lt;br /&gt;
   2.091&amp;nbsp;&amp;nbsp; registry.lookup([zope.interface.implementedBy(C2)], IP2,
  '')&lt;br /&gt;
   4.453&amp;nbsp;&amp;nbsp; registry.lookup([IR1, IQ], IP2, '')&lt;br /&gt;
   2.400&amp;nbsp;&amp;nbsp; registry.lookup1(IR2, IP1)&lt;br /&gt;
   3.517&amp;nbsp;&amp;nbsp; registry.queryAdapter(x, IP1)&lt;br /&gt;
   3.300&amp;nbsp;&amp;nbsp; registry.adapter_hook(IP1, x)&lt;br /&gt;
   6.198&amp;nbsp;&amp;nbsp; registry.queryMultiAdapter((x, q), IM)&lt;br /&gt;
   2.505&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1], IP2)&lt;br /&gt;
   2.490&amp;nbsp;&amp;nbsp; registry.subscriptions([IR2], IP1)&lt;br /&gt;
   3.464&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1, IQ], IP2)&lt;br /&gt;
   5.404&amp;nbsp;&amp;nbsp; registry.subscribers((x, q), IM)&lt;br /&gt;
   202.900254011 - total elapsed&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   &lt;b&gt;C Version&lt;br /&gt;
   ==========&lt;/b&gt;&lt;br /&gt;
   1.655&amp;nbsp;&amp;nbsp; registry.lookup([IR1], IP2, '')&lt;br /&gt;
   1.658&amp;nbsp;&amp;nbsp; registry.lookup([IR2], IP2, '')&lt;br /&gt;
   1.706&amp;nbsp;&amp;nbsp; registry.lookup([zope.interface.implementedBy(C2)], IP2,
  '')&lt;br /&gt;
   3.078&amp;nbsp;&amp;nbsp; registry.lookup([IR1, IQ], IP2, '')&lt;br /&gt;
   1.798&amp;nbsp;&amp;nbsp; registry.lookup1(IR2, IP1)&lt;br /&gt;
   2.646&amp;nbsp;&amp;nbsp; registry.queryAdapter(x, IP1)&lt;br /&gt;
   2.542&amp;nbsp;&amp;nbsp; registry.adapter_hook(IP1, x)&lt;br /&gt;
   4.676&amp;nbsp;&amp;nbsp; registry.queryMultiAdapter((x, q), IM)&lt;br /&gt;
   1.792&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1], IP2)&lt;br /&gt;
   1.785&amp;nbsp;&amp;nbsp; registry.subscriptions([IR2], IP1)&lt;br /&gt;
   2.777&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1, IQ], IP2)&lt;br /&gt;
   3.948&amp;nbsp;&amp;nbsp; registry.subscribers((x, q), IM)&lt;br /&gt;
   152.926780939 - total elapsed&lt;br /&gt;
   ----------------------------------------------&lt;b&gt;&lt;br /&gt;
  &lt;/b&gt; 1.673&amp;nbsp;&amp;nbsp; registry.lookup([IR1], IP2, '')&lt;br /&gt;
   1.674&amp;nbsp;&amp;nbsp; registry.lookup([IR2], IP2, '')&lt;br /&gt;
   1.683&amp;nbsp;&amp;nbsp; registry.lookup([zope.interface.implementedBy(C2)], IP2,
  '')&lt;br /&gt;
   3.101&amp;nbsp;&amp;nbsp; registry.lookup([IR1, IQ], IP2, '')&lt;br /&gt;
   1.778&amp;nbsp;&amp;nbsp; registry.lookup1(IR2, IP1)&lt;br /&gt;
   2.633&amp;nbsp;&amp;nbsp; registry.queryAdapter(x, IP1)&lt;br /&gt;
   2.522&amp;nbsp;&amp;nbsp; registry.adapter_hook(IP1, x)&lt;br /&gt;
   4.625&amp;nbsp;&amp;nbsp; registry.queryMultiAdapter((x, q), IM)&lt;br /&gt;
   1.808&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1], IP2)&lt;br /&gt;
   1.799&amp;nbsp;&amp;nbsp; registry.subscriptions([IR2], IP1)&lt;br /&gt;
   2.786&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1, IQ], IP2)&lt;br /&gt;
   3.861&amp;nbsp;&amp;nbsp; registry.subscribers((x, q), IM)&lt;br /&gt;
   151.658464193 - total elapsed&lt;br /&gt;
   ----------------------------------------------&lt;br /&gt;
   1.690&amp;nbsp;&amp;nbsp; registry.lookup([IR1], IP2, '')&lt;br /&gt;
   1.690&amp;nbsp;&amp;nbsp; registry.lookup([IR2], IP2, '')&lt;br /&gt;
   1.709&amp;nbsp;&amp;nbsp; registry.lookup([zope.interface.implementedBy(C2)], IP2,
  '')&lt;br /&gt;
   3.114&amp;nbsp;&amp;nbsp; registry.lookup([IR1, IQ], IP2, '')&lt;br /&gt;
   1.806&amp;nbsp;&amp;nbsp; registry.lookup1(IR2, IP1)&lt;br /&gt;
   2.641&amp;nbsp;&amp;nbsp; registry.queryAdapter(x, IP1)&lt;br /&gt;
   2.567&amp;nbsp;&amp;nbsp; registry.adapter_hook(IP1, x)&lt;br /&gt;
   4.700&amp;nbsp;&amp;nbsp; registry.queryMultiAdapter((x, q), IM)&lt;br /&gt;
   1.821&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1], IP2)&lt;br /&gt;
   1.821&amp;nbsp;&amp;nbsp; registry.subscriptions([IR2], IP1)&lt;br /&gt;
   2.812&amp;nbsp;&amp;nbsp; registry.subscriptions([IR1, IQ], IP2)&lt;br /&gt;
   3.953&amp;nbsp;&amp;nbsp; registry.subscribers((x, q), IM)&lt;br /&gt;
   153.785687923 - total elapsed&lt;br /&gt;
   &lt;br /&gt;
   So, speedup by my estimation is ~20-26% for different methods.&lt;br /&gt;
  It may vary in future but this is how it is currently at my side.&lt;br /&gt;
   &lt;br /&gt;
   Benchmark script is attached.&lt;br /&gt;
 </content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_08_05_adapterlookup_c</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_08_05_adapterlookup_c/atom?2005_08_05_adapterlookup_c"
        title="Edit Here - AdapterLookup C optimizations" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">tal:condition</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_03_03_tal_condition" />
  <issued>2005-03-08T01:20:31Z</issued>
  <modified>2005-03-08T01:20:31Z</modified>
  <created>2005-03-03T12:19:54Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>coding</dc:subject>
  
  
    <dc:subject>zope</dc:subject>
  
  
  <summary type="text/html" mode="escaped">
  This is mainly reminder for myself. 
   Couple of times i was beaten by something like following
  code:
   
   &amp;lt;h2 
       tal:define="my_var1
  here/title_or_id|nothing; my_var2 python: []"
       tal:condition="my_var2|my_var1"&amp;gt;
     Here goes text that won't be displayed because above
  condition is False,
     though one can assume that '|' is ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">
  This is mainly reminder for myself. &lt;br /&gt;
   Couple of times i was beaten by something like following
  code:&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;h2 &lt;br /&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; tal:define="my_var1
  here/title_or_id|nothing; my_var2 python: []"&lt;br /&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; tal:condition="my_var2|my_var1"&amp;gt;&lt;br /&gt;
   &amp;nbsp; Here goes text that won't be displayed because above
  condition is False,&lt;br /&gt;
   &amp;nbsp; though one can assume that '|' is equivalent to
  python's 'or' and my_var1&lt;br /&gt;
   &amp;nbsp; should be used(let's imagine my_var1 is true in this
  context) and it really would&lt;br /&gt;
   &amp;nbsp; be the case if my_var2 was path expression, and that
  path didn't exist or was&lt;br /&gt;
   &amp;nbsp; set to 'nothing'.&lt;br /&gt;
   &amp;lt;/h2&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   To make it work, above could be changed to:&lt;br /&gt;
   &amp;lt;h2 &lt;br /&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; tal:define="my_var1
  here/title_or_id|nothing; my_var2 python: []"&lt;br /&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; tal:condition="python:my_var2 or
  my_var1"&amp;gt;&lt;br /&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRUE&lt;br /&gt;
   &amp;lt;/h2&amp;gt;&lt;br /&gt;
   &amp;nbsp; &lt;br /&gt;
   &amp;nbsp; or using at first place before '|' path expression.
 </content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_03_03_tal_condition</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_03_03_tal_condition/atom?2005_03_03_tal_condition"
        title="Edit Here - tal:condition" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">nxml-mode + tabs</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_24_nxml_mode_tabs" />
  <issued>2005-03-08T01:20:39Z</issued>
  <modified>2005-03-08T01:20:39Z</modified>
  <created>2005-02-24T10:29:37Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>coding</dc:subject>
  
  
  <summary type="text/html" mode="escaped">Yesterday Anahide noted that my .pt files contain TABS, oh my.
  
   After careful consideration, yep, i saw that they really
  contain tabs. I was confused because i was naive to believe
  that '(indent-tabs-mode nil) in my dot emacs will be working
  by default with nxml-mode. Explicit is better then implicit,
  so i began to explore how to force nxml-mode to use
  expliciltly spaces ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">Yesterday Anahide noted that my .pt files contain TABS, oh my.
  &lt;br /&gt;
   After careful consideration, yep, i saw that they really
  contain tabs. I was confused because i was naive to believe
  that '(indent-tabs-mode nil) in my dot emacs will be working
  by default with nxml-mode. Explicit is better then implicit,
  so i began to explore how to force nxml-mode to use
  expliciltly spaces instead of tabs being in nxml mode. Thanks
  for Marc-Aurčle, he was kind to make suggestions about my case
  and i set&amp;nbsp; hook in .emacs similar to one for xml
  mode:&lt;br /&gt;
   &lt;br /&gt;
   (add-hook 'nxml-mode-hook (lambda()&lt;br /&gt;
   &amp;nbsp;&amp;nbsp; (setq indent-tabs-mode nil)&lt;br /&gt;
   &amp;nbsp;))&lt;br /&gt;
   &lt;br /&gt;
   This works just fine, but note that if you use desktop saving
  feature in emacs you need first to delete .emacs.desktop file
  otherwise above hook won't work with files that are saved by
  desktop, this how it worked for me.&lt;br /&gt;
   All is left just to run C-x h M-x untabify RET on my *.pt
  files to remove tabs.&lt;br /&gt;
   &lt;br /&gt;
   Well, lesson learned.&lt;br /&gt;
   &lt;br /&gt;</content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_02_24_nxml_mode_tabs</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_24_nxml_mode_tabs/atom?2005_02_24_nxml_mode_tabs"
        title="Edit Here - nxml-mode + tabs" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">What is Trackback</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_23_what_trackback" />
  <issued>2005-03-08T01:20:37Z</issued>
  <modified>2005-03-08T01:20:37Z</modified>
  <created>2005-02-23T11:39:53Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>web</dc:subject>
  
  
  <summary type="text/html" mode="escaped">
  As you probably noted there is such feature on this site as Trackbacks.
  Here is small excerpt about trackbacks, more information could be found at
  http://www.movabletype.org/trackback/beginners/

  

  In a nutshell, TrackBack was designed to provide a method of notification
  between websites: it is a method of person A saying to person B, "This is
  something you may be ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">
  &lt;p&gt;As you probably noted there is such feature on this site as Trackbacks.
  Here is small excerpt about trackbacks, more information could be found at
  &lt;a
  href="http://www.movabletype.org/trackback/beginners/"&gt;http://www.movabletype.org/trackback/beginners/&lt;/a&gt;&lt;br /&gt;

  &lt;/p&gt;

  &lt;p&gt;In a nutshell, TrackBack was designed to provide a method of notification
  between websites: it is a method of person A saying to person B, "This is
  something you may be interested in." To do that, person A sends a
  &lt;i&gt;TrackBack ping&lt;/i&gt; to person B.&lt;/p&gt;

  &lt;p class="note"&gt;&lt;b&gt;&lt;i&gt;TrackBack ping:&lt;/i&gt; a ping in this context means a
  small message sent from one webserver to another.&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;And why would person B be interested in what person A has to say?&lt;/p&gt;

  &lt;ul&gt;
   &lt;li&gt;Person A has written a post on his own weblog that comments on a post
   in Person B's weblog. This is a form of remote comments--rather than
   posting the comment directly on Person B's weblog, Person A posts it on his
   own weblog, then sends a TrackBack ping to notify Person B.&lt;/li&gt;

   &lt;li&gt;Person A has written a post on a topic that a group of people are
   interested in. This is a form of content aggregation--by sending a
   TrackBack ping to a central server, visitors can read all posts about that
   topic. For example, imagine a site which collects weblog posts about Justin
   Timberlake. Anyone interested in reading about JT could look at this site
   to keep updated on what other webloggers were saying about his new album, a
   photo shoot in a magazine, etc.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;br /&gt;
   One more thought about using trackbacks instead of comments on blog are
  taken from&amp;nbsp; &lt;a
  href="http://ln.hixie.ch/?start=1033171507&amp;amp;count=1"&gt;http://ln.hixie.ch/?start=1033171507&amp;amp;count=1&lt;/a&gt;&lt;br /&gt;

   &lt;br /&gt;
   "Personally I love finding that other people have commented about my post
  (every pingback, trackback and new referrer I receive automatically sends me
  an e-mail). I don't like having comments on my Web log because I believe if
  you want to comment then you should do so on your own Web log. If I'd wanted
  to host a discussion forum, I'd have installed discussion forum software,
  not Web logging software!"&lt;br /&gt;
 </content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_02_23_what_trackback</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_23_what_trackback/atom?2005_02_23_what_trackback"
        title="Edit Here - What is Trackback" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Blog for Zope3</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_14_blog_for_zope3" />
  <issued>2005-03-08T01:20:37Z</issued>
  <modified>2005-03-08T01:20:37Z</modified>
  <created>2005-02-14T21:50:26Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>zope3</dc:subject>
  
  
  <summary type="text/html" mode="escaped">
  I have begun to work in my "copious spare" time at Z3 version
  of blog. Hope CPSBlog and zblog will benefit from each
  other.
   For those who is interested initial code is located at:
   http://codespeak.net/svn/z3/zblog/
   
 </summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">
  I have begun to work in my "copious spare" time at Z3 version
  of blog. Hope CPSBlog and zblog will benefit from each
  other.&lt;br /&gt;
   For those who is interested initial code is located at:&lt;br /&gt;
   &lt;a
  href="http://codespeak.net/svn/z3/zblog/"&gt;http://codespeak.net/svn/z3/zblog/&lt;/a&gt;&lt;br /&gt;
   &lt;br /&gt;
 </content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_02_14_blog_for_zope3</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_14_blog_for_zope3/atom?2005_02_14_blog_for_zope3"
        title="Edit Here - Blog for Zope3" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">How to be a Programmer</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_07_how_to_be_programmer" />
  <issued>2005-03-08T01:20:33Z</issued>
  <modified>2005-03-08T01:20:33Z</modified>
  <created>2005-02-07T19:13:13Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>nuxeo</dc:subject>
  
  
  <summary type="text/html" mode="escaped">
  Interesting 
  reading - How to be
  a Programmer:
   
   "This long essay attempts to summarize the non-technical
  things that I wish someone had explained to me at the
  beginning of my career as a professional programmer. It is
  primarily concerned with social situations and team
  relationships that occur in typical software development. I
  try to cover what I consider the ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">
  &lt;a
  href="http://samizdat.mines.edu/howto/"&gt;&lt;/a&gt;Interesting&amp;nbsp;
  reading - &lt;a href="http://samizdat.mines.edu/howto/"&gt;How to be
  a Programmer:&lt;/a&gt;&lt;br /&gt;
   &lt;br /&gt;
   "This long essay attempts to summarize the non-technical
  things that I wish someone had explained to me at the
  beginning of my career as a professional programmer. It is
  primarily concerned with social situations and team
  relationships that occur in typical software development. I
  try to cover what I consider the essential, often
  non-techncial, skills of the beginning, intermediate and
  advanced programmer. The essay gives my opinions only; its
  value lies in that the material is so subjective that it is
  generally not taught in school directly or emphasized enough
  in publications. It begins with a table of contents that will
  allow the reader to judge their interest in the material. To
  the beginner, it may be a peek into the culture of the
  software engineer; to the advanced programmer, it is an
  opinionated review that I hope will provoke thought due to its
  comprehensiveness."
 </content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_02_07_how_to_be_programmer</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_07_how_to_be_programmer/atom?2005_02_07_how_to_be_programmer"
        title="Edit Here - How to be a Programmer" />
</entry>

  
  
      <entry xmlns="http://purl.org/atom/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/">
     
  <title mode="escaped" type="text/html">Closer look at why people blog</title>
  <link rel="alternate" type="text/html"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_07_closer_look_at_why" />
  <issued>2005-03-08T01:20:45Z</issued>
  <modified>2005-03-08T01:20:45Z</modified>
  <created>2005-02-07T14:41:37Z</created>
  <draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
  <author>
    <name>rspivak</name>
  </author>
  
  
    <dc:subject>nuxeo</dc:subject>
  
  
  <summary type="text/html" mode="escaped">
  
  Here is a paper (PDF) by Bonnie Nardi, Diane Schiano,
  Michelle Gumbrecht and Luke Swartz about motivations for
  weblogging, quite interesting to read:
   
   "We discovered five major motivations for blogging:
  documenting the author's life, providing commentary and
  opinions, expressing deeply felt emotions, working out ideas
  through writing, and forming and maintaining communities ...</summary>

  <content type="text/html" mode="escaped"
           xml:space="preserve">
  &lt;a
  href="http://www.ics.uci.edu/%7Ejpd/classes/ics234cw04/nardi.pdf"&gt;
  Here is a paper&lt;/a&gt; (PDF) by Bonnie Nardi, Diane Schiano,
  Michelle Gumbrecht and Luke Swartz about motivations for
  weblogging, quite interesting to read:&lt;br /&gt;
   &lt;br /&gt;
   "We discovered five major motivations for blogging:
  documenting the author's life, providing commentary and
  opinions, expressing deeply felt emotions, working out ideas
  through writing, and forming and maintaining communities or
  forums. These motivations are by no means mutually exclusive,
  and can come into play simultaneously."&lt;br /&gt;
   &lt;br /&gt;
 </content>

  <id>tag:blogs.nuxeo.com:sections:blogs:ruslan_spivak:2005_02_07_closer_look_at_why</id>
  <link rel="service.edit" type="application/atom+xml"
        href="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_07_closer_look_at_why/atom?2005_02_07_closer_look_at_why"
        title="Edit Here - Closer look at why people blog" />
</entry>

  

</feed>
