<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="http://blogs.nuxeo.com/rss.css" type="text/css"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">

  <channel rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/exportrss">
    <title>Ruslan Spivak</title>
    <description>RSS 1.0 export from the folder 'Ruslan Spivak'.</description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/exportrss</link>

    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2006_04_28_here-we-go-java-content-repository-ice-connector" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_11_20_nautilus-ps2pdf-script" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_06_adapterlookup-c" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_03_btrees-pop" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_01_btrees-setdefault" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_08_05_adapterlookup_c" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_03_03_tal_condition" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_24_nxml_mode_tabs" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_23_what_trackback" />
        <rdf:li rdf:resource="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_14_blog_for_zope3" />

      </rdf:Seq>
    </items>

  </channel>


  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2006_04_28_here-we-go-java-content-repository-ice-connector">
    <title>Here we go - Java Content Repository Ice Connector</title>
    <description>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;</description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2006_04_28_here-we-go-java-content-repository-ice-connector</link>
    <dc:date>2006-04-28</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak, root</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>cps</dc:subject>
    <dc:subject>ecm</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_11_20_nautilus-ps2pdf-script">
    <title>Nautilus + ps2pdf script</title>
    <description>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;</description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_11_20_nautilus-ps2pdf-script</link>
    <dc:date>2005-11-20</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>linux</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_06_adapterlookup-c">
    <title>AdapterLookup C optimizations: status</title>
    <description>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;</description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_06_adapterlookup-c</link>
    <dc:date>2005-09-06</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>python</dc:subject>
    <dc:subject>zope3</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_03_btrees-pop">
    <title>BTrees and pop()</title>
    <description>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;</description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_03_btrees-pop</link>
    <dc:date>2005-09-03</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>zope3</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_01_btrees-setdefault">
    <title>BTrees and setdefault</title>
    <description>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...</description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_09_01_btrees-setdefault</link>
    <dc:date>2005-09-02</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>zope3</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_08_05_adapterlookup_c">
    <title>AdapterLookup C optimizations</title>
    <description>
  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;
 </description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_08_05_adapterlookup_c</link>
    <dc:date>2005-08-05</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>zope3</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_03_03_tal_condition">
    <title>tal:condition</title>
    <description>
  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.
 </description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_03_03_tal_condition</link>
    <dc:date>2005-03-03</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak, Manager CPS manager</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>coding</dc:subject>
    <dc:subject>zope</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_24_nxml_mode_tabs">
    <title>nxml-mode + tabs</title>
    <description>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;</description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_24_nxml_mode_tabs</link>
    <dc:date>2005-02-24</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak, Manager CPS manager</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>coding</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_23_what_trackback">
    <title>What is Trackback</title>
    <description>
  &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;
 </description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_23_what_trackback</link>
    <dc:date>2005-02-23</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak, Manager CPS manager, sadmin</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>web</dc:subject>

  </item>
  <item rdf:about="http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_14_blog_for_zope3">
    <title>Blog for Zope3</title>
    <description>
  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;
 </description>
    <link>http://blogs.nuxeo.com/sections/blogs/ruslan_spivak/2005_02_14_blog_for_zope3</link>
    <dc:date>2005-02-14</dc:date>
    <dc:creator>rspivak</dc:creator>
    <dc:contributor>Ruslan Spivak, Manager CPS manager</dc:contributor>
    <dc:language>en</dc:language>
    <dc:subject>zope3</dc:subject>

  </item>


  <xhtml:script id="js" type="text/javascript" src="http://blogs.nuxeo.com/rss.js" />

</rdf:RDF>
