<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:at="http://www.sixapart.com/ns/at"
    xmlns:icbm="http://postneo.com/icbm"
    xmlns:rvw="http://purl.org/NET/RVW/0.2/"
    xmlns:media="http://search.yahoo.com/mrss">
    <channel>
        <title>Blog de hvelarde</title>
        <link>http://hvelarde.vox.com/library/posts/page/1/</link>
        <description></description>
        <language>en</language>
        <generator>Vox</generator>
        <lastBuildDate>Fri, 11 Jan 2008 20:40:15 -0600</lastBuildDate>
        <copyright>Copyright 2008</copyright>
        <docs>http://blogs.law.harvard.edu/tech/rss</docs>  
 
        <item>
            <title>When adapting content types, schemaextender is the way to go (updated)</title>
            <link>http://hvelarde.vox.com/library/post/when-adapting-content-types-schemaextender-is-the-way-to-go.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(hvelarde)</author>
            <comments>http://hvelarde.vox.com/library/post/when-adapting-content-types-schemaextender-is-the-way-to-go.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://hvelarde.vox.com/library/post/when-adapting-content-types-schemaextender-is-the-way-to-go.html?_c=feed-rss-full</guid> 
            <pubDate>Fri, 11 Jan 2008 20:40:15 -0600</pubDate>         
            
            <description>    &lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Lightning_Talks&quot;&gt;Lightning Talks&lt;/a&gt; are among the best investments of time you can make on
any &lt;a href=&quot;http://plone.org/&quot;&gt;Plone&lt;/a&gt; Conference: there&amp;#39;s always a lot of smart people doing great
things.&lt;/p&gt;&lt;p&gt;During the &lt;a href=&quot;http://plone.org/events/conferences/2007-naples&quot;&gt;Plone Conference 2007&lt;/a&gt;, in Naples, Florian Schulze spoke about &lt;strong&gt;schemaxtender&lt;/strong&gt;, a package that allows you to inject new fields into an &lt;a href=&quot;http://plone.org/products/archetypes&quot;&gt;Archetypes&lt;/a&gt; schema using an &lt;a href=&quot;http://en.wikipedia.org/wiki/Adapter_pattern&quot;&gt;adapter&lt;/a&gt;. When I saw his talk, I knew I was going to use it for what I had in mind.&lt;/p&gt;&lt;p&gt;As I mentioned in a &lt;a href=&quot;http://hvelarde.vox.com/library/post/mapping-nitf-into-plones-metadata.html&quot;&gt;previous post&lt;/a&gt;, in &lt;a href=&quot;http://www.jornada.unam.mx/&quot;&gt;La Jornada&lt;/a&gt; we were looking for a way to adapt Plone&amp;#39;s standard News Item content type to:
&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;add new fields to it (&lt;strong&gt;property&lt;/strong&gt;, &lt;strong&gt;section&lt;/strong&gt;, &lt;strong&gt;urgency&lt;/strong&gt; and &lt;strong&gt;byline&lt;/strong&gt;) 
  &lt;/li&gt;&lt;li&gt;change fields&amp;#39; order among different schematas to make the edition of new content easier for the publishers&lt;br /&gt;
  &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;
Using &lt;strong&gt;schemaextender&lt;/strong&gt; to accomplish these tasks was so easy that I was really
excited when I finished. I spent about 40 hours (&lt;em&gt;in fact, a little bit more after the second release&lt;/em&gt;) to read
Part 1 of &lt;a href=&quot;http://worldcookery.com/&quot;&gt;Philip von Weitershausen&lt;/a&gt;&amp;#39;s excellent book on &lt;a href=&quot;http://zope.org/&quot;&gt;Zope&lt;/a&gt; 3, to
understand the way &lt;strong&gt;schemaextender&lt;/strong&gt; works, to find out how to make it work on Plone 2.5, to start using the adapted content with Smart Folders, and even to write some tests for it.&lt;/p&gt;&lt;p&gt;All this work is available in a product called &lt;a href=&quot;http://plone.org/products/nitf4plone&quot;&gt;nitf4plone&lt;/a&gt; in case you want to try it (be aware this is an &lt;a href=&quot;http://en.wikipedia.org/wiki/Beta_release&quot;&gt;beta release&lt;/a&gt;). The product works on both, Plone 2.5 and Plone 3.0.&lt;/p&gt;&lt;p&gt;Let&amp;#39;s analize the code... but first, a disclaimer: &lt;u&gt;don&amp;#39;t try this on Plone 2.5&lt;/u&gt;.&lt;/p&gt;&lt;p&gt;Why? &lt;strong&gt;schemaextender&lt;/strong&gt;
was written to work with Archetypes version 1.5 or later (that&amp;#39;s, Plone 3.0 and later). There&amp;#39;s &lt;a href=&quot;http://dev.plone.org/archetypes/browser/Archetypes/branches/1.4-schemaextender-support&quot;&gt;a branch to make it work with Plone 2.5&lt;/a&gt; patched by &lt;a href=&quot;http://weblion.psu.edu/blog/erik-rose&quot;&gt;Erik Rose&lt;/a&gt;  of the &lt;a href=&quot;http://weblion.psu.edu/&quot;&gt;WebLion Project Team at PSU&lt;/a&gt;, but it will never be merged into the maintenance one. If you use this branch you are on your own in the event of a bug. Also, have in mind that there&amp;#39;s no way back on doing this and after installing &lt;strong&gt;schemaextender&lt;/strong&gt;
in Plone 2.5, the adapter will be available for all sites in the instance.&lt;/p&gt;&lt;p&gt; So, yes, &lt;em&gt;do as I say, not as I did&lt;/em&gt;. Having warned you, let&amp;#39;s dive a little bit into the code.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;schemaextender&lt;/strong&gt; includes 3 types of adapters:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;ISchemaExtender&lt;/strong&gt; lets you can add new fields to a schema&lt;/li&gt;&lt;li&gt;&lt;strong&gt;IOrderableSchemaExtender&lt;/strong&gt; lets you add new fields and reorder them&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ISchemaModifier&lt;/strong&gt; is a low-level hook that allows direct manipulation of the schema&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;You can find information and examples on all of them on the &lt;a href=&quot;http://dev.plone.org/archetypes/browser/archetypes.schemaextender/trunk&quot;&gt;source code&lt;/a&gt;. As you might have expected, I decided to use &lt;strong&gt;IOrderableSchemaExtender&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;To write the adapter, we need to declare the new fields first; let&amp;#39;s take a look to the &lt;strong&gt;section&lt;/strong&gt; field as an example:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;class &lt;strong&gt;SectionField&lt;/strong&gt;(&lt;strong&gt;ExtensionField&lt;/strong&gt;, &lt;strong&gt;atapi.StringField&lt;/strong&gt;):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;quot;&amp;quot;Named section of a publication where a news object appear&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;quot;&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; def &lt;strong&gt;getDefault&lt;/strong&gt;(self, instance):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return nitf.default_section&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; def &lt;strong&gt;Vocabulary&lt;/strong&gt;(self, instance):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return atapi.DisplayList([(x, x) for x in nitf.sections])&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;As you can see, we need to subclass from &lt;strong&gt;ExtensionField&lt;/strong&gt; and &lt;strong&gt;StringField&lt;/strong&gt;; please note that it&amp;#39;s mandatory to keep this order. &lt;strong&gt;ExtensionField&lt;/strong&gt; will provide standard accessors and mutators which are not generated on the class. &lt;strong&gt;StringField&lt;/strong&gt; will provide standard attributes and the widget for the field. Also we override &lt;strong&gt;getDefault()&lt;/strong&gt; and &lt;strong&gt;Vocabulary()&lt;/strong&gt; methods to set the default value and vocabulary.&lt;/p&gt;&lt;p&gt;Let&amp;#39;s take a look to the adapter&amp;#39;s class now:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;class &lt;strong&gt;NITFExtender&lt;/strong&gt;(object):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;quot;&amp;quot;Adapter to add NITF fields to News Items&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; implements(&lt;strong&gt;IOrderableSchemaExtender&lt;/strong&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; adapts(&lt;strong&gt;IATNewsItem&lt;/strong&gt;)&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; fields = [&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;SectionField&lt;/strong&gt;(&amp;#39;section&amp;#39;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; languageIndependent=1,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; enforceVocabulary=1,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; required=1,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widget = atapi.SelectionWidget(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; label=&amp;#39;Section&amp;#39;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; label_msgid=&amp;#39;section&amp;#39;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; description=&amp;#39;Named section where the news object appear&amp;#39;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; description_msgid=&amp;#39;help_section&amp;#39;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; i18n_domain=&amp;#39;nitf4plone&amp;#39;)),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; def &lt;strong&gt;__init__&lt;/strong&gt;(self, context):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.context = context&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; def &lt;strong&gt;getFields&lt;/strong&gt;(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return self.fields&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; def &lt;strong&gt;getOrder&lt;/strong&gt;(self, original):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # we only need to change the order of the fields in Plone 2.5&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if &amp;#39;metadata&amp;#39; in original:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # first we remove the fields from whichever schemata they are&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for schemata in original.keys():&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if &amp;#39;relatedItems&amp;#39; in original[schemata]:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; original[schemata].remove(&amp;#39;relatedItems&amp;#39;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if &amp;#39;subject&amp;#39; in original[schemata]:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; original[schemata].remove(&amp;#39;subject&amp;#39;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # now we insert them where we want them to appear&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; idx = original[&amp;#39;default&amp;#39;].index(&amp;#39;property&amp;#39;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; original[&amp;#39;default&amp;#39;].insert(idx, &amp;#39;subject&amp;#39;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; original[&amp;#39;metadata&amp;#39;].insert(0, &amp;#39;relatedItems&amp;#39;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return original&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;As I mentioned, our adapter implements &lt;strong&gt;IOrderableSchemaExtender&lt;/strong&gt;. In Plone 3.0 adapters can be registered locally at &lt;a href=&quot;http://dev.plone.org/collective/browser/nitf4plone/tags/0.2/Extensions/Install.py&quot;&gt;installation&lt;/a&gt; time:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;sm = portal.getSiteManager()&lt;br /&gt;sm.registerAdapter(&lt;strong&gt;NITFExtender&lt;/strong&gt;, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;strong&gt;IATNewsItem&lt;/strong&gt;,),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;IOrderableSchemaExtender&lt;/strong&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; )&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In Plone 2.5 we can&amp;#39;t have &lt;span class=&quot;p_string&quot;&gt;local adapters and registrations aren&amp;#39;t persistent, so we have to handle this in &lt;/span&gt;&lt;a href=&quot;http://dev.plone.org/collective/browser/nitf4plone/tags/0.2/__init__.py&quot;&gt;a different way&lt;/a&gt;&lt;span class=&quot;p_string&quot;&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;p_string&quot;&gt;&lt;br /&gt;&lt;/span&gt;Here you can see the way news items look after applying the adapter:&lt;/p&gt;
    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398ba6cb3000200e398d178d00003&quot; at:format=&quot;large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398d178d00003.html&quot;&gt;&lt;img src=&quot;http://a0.vox.com/6a00e398ba6cb3000200e398d178d00003-320pi&quot; alt=&quot;schemaextender in action&quot; title=&quot;schemaextender in action&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398d178d00003.html&quot; title=&quot;schemaextender in action&quot;&gt;schemaextender in action&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;









&lt;p&gt;&lt;br /&gt;The &lt;a href=&quot;http://dev.plone.org/collective/browser/nitf4plone/tags/0.2/extender.py&quot;&gt;code of the adapter&lt;/a&gt; is pretty clean and easy to understand.&lt;/p&gt;&lt;p&gt;Having finished it, we followed &lt;a href=&quot;http://plone.org/documentation/how-to/adding-new-fields-to-smart-folders-search&quot;&gt;Mikko Ohtamaa&amp;#39;s procedure to adding new fields to Smart Folders search&lt;/a&gt; in order to display all news articles for a given section and it worked fine.&lt;/p&gt;&lt;p&gt;Right now we are working on the migration of the content of our site to use the new fields; we are also preparing some templates to display the new information and some &lt;a href=&quot;http://plone.org/products/compositepack&quot;&gt;CompositePack&lt;/a&gt;&amp;#39;s viewlets to use them to create the front pages in a better way.&lt;/p&gt;&lt;p&gt;Please let me know if you find this development interesting or if you want to participate in some way.&lt;/p&gt;&lt;p&gt;I want to thank all the members of the Plone community who helped me answering my questions at the &lt;a href=&quot;http://plone.org/support/chat&quot;&gt;#plone channel on IRC&lt;/a&gt; and the &lt;a href=&quot;http://www.nabble.com/Product-Developers-f20094.html&quot;&gt;Product Developers forum&lt;/a&gt;, specially &lt;a href=&quot;http://martinaspeli.net/&quot;&gt;Martin Aspeli&lt;/a&gt; and Florian Schulze (who helped me with the &lt;strong&gt;schemaxtender&lt;/strong&gt; internals and were really patient with me), &lt;a href=&quot;http://eibar.org/blogak/erral/es&quot;&gt;Mikel Larreategui&lt;/a&gt; and Erik Rose (who helped me with the installer), Wichert Akkerman and &lt;a href=&quot;http://blog.zopyx.com/&quot;&gt;Andreas Jung&lt;/a&gt; (who are always available answering all sort of questions on the forums).&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://hvelarde.vox.com/library/post/when-adapting-content-types-schemaextender-is-the-way-to-go.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398ba6cb3000200e398cc53a30003?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description> 
            <category domain="http://hvelarde.vox.com/tags/">plone</category> 
            <category domain="http://hvelarde.vox.com/tags/">nitf</category> 
            <category domain="http://hvelarde.vox.com/tags/">lajornada</category> 
            <category domain="http://hvelarde.vox.com/tags/">schemaextender</category> 
            <category domain="http://hvelarde.vox.com/tags/">problemsolving</category>    
        </item> 
 
        <item>
            <title>Relating content automatically in Plone</title>
            <link>http://hvelarde.vox.com/library/post/relating-content-automatically-in-plone.html?_c=feed-rss-full</link>   
            <rvw:rating>100</rvw:rating> 
            <author>nobody@vox.com(hvelarde)</author>
            <comments>http://hvelarde.vox.com/library/post/relating-content-automatically-in-plone.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://hvelarde.vox.com/library/post/relating-content-automatically-in-plone.html?_c=feed-rss-full</guid> 
            <pubDate>Wed, 02 Jan 2008 23:20:49 -0600</pubDate>         
            
            <description>    &lt;p&gt;A question arose today in the &lt;a href=&quot;http://plone.org/&quot;&gt;Plone&lt;/a&gt; &lt;a href=&quot;http://news.gmane.org/thread.php?group=gmane.comp.web.zope.plone.user&quot;&gt;general mailing list&lt;/a&gt; (a.k.a. Plone-users): &lt;em&gt;it is possible to create a list of related content automatically?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Well, the answer is yes and I&amp;#39;m going to tell you how.&lt;/p&gt;&lt;p&gt;Some time ago &lt;a href=&quot;http://bcsaller.blogspot.com/&quot;&gt;Benjamin Saller&lt;/a&gt; created a &lt;strong&gt;proof-of-concept&lt;/strong&gt; product called &lt;a href=&quot;http://svn.objectrealms.net/view/public/browser/archived/haystack/trunk/Haystack&quot;&gt;Haystack&lt;/a&gt; to do auto-classification of
content. &lt;strong&gt;Haystack&lt;/strong&gt; was built around &lt;a href=&quot;http://libots.sourceforge.net/&quot;&gt;Open Text Summarizer&lt;/a&gt; and the &lt;strong&gt;haystack_tool &lt;/strong&gt;included a couple of methods to summarize text and to get a list of &amp;quot;topics&amp;quot; extracted from the content. &lt;strong&gt;Haystack&lt;/strong&gt; also included some portlets to demonstrate its functionality.&lt;/p&gt;&lt;p&gt;We used &lt;strong&gt;Haystack&lt;/strong&gt; in &lt;a href=&quot;http://www.jornada.unam.mx/&quot;&gt;La Jornada&lt;/a&gt; for some time with mixed results: the summarizer worked well; we called it to create the description field of our content using &lt;a href=&quot;http://en.wikipedia.org/wiki/Ajax_%28programming%29&quot;&gt;AJAX&lt;/a&gt; in order to reduce the work of our publishers at edition time.&lt;/p&gt;&lt;p&gt;On the other hand, with the &amp;quot;topics&amp;quot; obtained we were creating a portlet that retrieved the related content. The main problems with this were the low quality of the &amp;quot;topics&amp;quot; and the implementation of the relation. Sometimes we had some embarrassing results relating content from &lt;em&gt;Iraq&lt;/em&gt; with some other of, let&amp;#39;s say, &lt;em&gt;Shakira&lt;/em&gt;, just because they shared some &amp;quot;topic&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Haystack&lt;/strong&gt; didn&amp;#39;t understood the meaning of words and, of course, Ben Saller was aware of that. Last time I saw him was during the &lt;a href=&quot;http://plone.org/events/conferences/seattle-2006&quot;&gt;Plone Conference 2006&lt;/a&gt; in Seattle. He gave a talk on &lt;strong&gt;Haystack&lt;/strong&gt; 2.0 and he was really excited about its new features: &lt;em&gt;linguistic mapping and automated conceptual mapping, providing high-quality relationships with little or no human effort&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;Unfortunately for us, Ben has been a little bit away from the Plone community for some time. So I don&amp;#39;t know what&amp;#39;s the status on his work.&lt;/p&gt;&lt;p&gt;Going back to the original question in the mailing list, &lt;a href=&quot;http://m.odul.us/&quot;&gt;Matt Bowen&lt;/a&gt; pointed out to me that &lt;a href=&quot;http://www.yahoo.com/&quot;&gt;Yahoo!&lt;/a&gt; has a &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_service&quot;&gt;web service&lt;/a&gt; called &lt;a href=&quot;http://developer.yahoo.com/search/content/V1/termExtraction.html&quot;&gt;Term Extraction&lt;/a&gt; that does almost the same thing and he even found a &lt;a href=&quot;http://effbot.org/zone/yahoo-term-extraction.htm&quot;&gt;python implementation&lt;/a&gt; for it.&lt;/p&gt;&lt;p&gt;I tested &lt;strong&gt;Term Extraction&lt;/strong&gt; with &lt;a href=&quot;http://www.jornada.unam.mx/ultimas/2008/01/02/sean-penn-sera-el-presidente-del-jurado-en-el-festival-de-cannes&quot;&gt;some text in Spanish&lt;/a&gt; and I was very pleased with the results:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;lt;ResultSet xsi:schemaLocation=&amp;quot;urn:yahoo:cate http://api.search.yahoo.com/ContentAnalysisService/V1/TermExtractionResponse.xsd&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;wong kar wai&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;stephen frears&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;festival de cannes&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;sean penn&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;25 de mayo&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;cines&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;organizadores&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;evidencia&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;el presidente&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;hace mucho tiempo&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;afp&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;Result&amp;gt;&lt;strong&gt;ya&lt;/strong&gt;&amp;lt;/Result&amp;gt;&lt;br /&gt;&amp;lt;/ResultSet&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;Implementing this in Plone seems not to be quite complicated: you can trigger a script in a workflow transition, or use &lt;a href=&quot;http://plone.org/documentation/tutorial/creating-content-rule-conditions-and-actions&quot;&gt;Content Rules&lt;/a&gt; in Plone 3.0, to fill the &lt;strong&gt;Subject&lt;/strong&gt; field or, better, add an additional field to store this information. Just remember the &lt;strong&gt;Term Extraction&lt;/strong&gt; web service is limited to 5,000 queries per IP address per day.&lt;/p&gt;&lt;p&gt;Yes, I know this solution suffers from the same problems that &lt;strong&gt;Haystack&lt;/strong&gt;, but the &amp;quot;topics&amp;quot; obtained here have better&amp;#160; quality and you can always find a better algorithm to do the relation, like testing for more than one &amp;quot;topic&amp;quot; or using only &amp;quot;topics&amp;quot; longer than one word.&lt;/p&gt;&lt;p&gt;Anyway I will put this in my list of pending stuff to test (with a little help of Matt Bowen, of course).&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://hvelarde.vox.com/library/post/relating-content-automatically-in-plone.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398ba6cb3000200e398ce4eed0003?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description> 
            <category domain="http://hvelarde.vox.com/tags/">plone</category> 
            <category domain="http://hvelarde.vox.com/tags/">haystack</category> 
            <category domain="http://hvelarde.vox.com/tags/">webservice</category> 
            <category domain="http://hvelarde.vox.com/tags/">problemsolving</category>   
        </item> 
 
        <item>
            <title>Mapping NITF into Plone&#39;s metadata</title>
            <link>http://hvelarde.vox.com/library/post/mapping-nitf-into-plones-metadata.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(hvelarde)</author>
            <comments>http://hvelarde.vox.com/library/post/mapping-nitf-into-plones-metadata.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://hvelarde.vox.com/library/post/mapping-nitf-into-plones-metadata.html?_c=feed-rss-full</guid> 
            <pubDate>Thu, 27 Dec 2007 21:01:34 -0600</pubDate>         
            
            <description>    &lt;p&gt;As I mentioned &lt;a href=&quot;http://hvelarde.vox.com/library/post/beyond-news-items-the-need-for-news-industry-standards-in-plone.html&quot;&gt;previously&lt;/a&gt;, &lt;a href=&quot;http://plone.org/&quot;&gt;Plone&lt;/a&gt; standard News Items have not enough metadata for using them seriously in a newspaper publication.&lt;/p&gt;&lt;p&gt;When we started using Plone for our breaking news site, we tried to fill the gap using some fancy &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_2.0&quot;&gt;Web 2.0&lt;/a&gt; features like &lt;a href=&quot;http://en.wikipedia.org/wiki/Tag_%28metadata%29&quot;&gt;tags&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Tag_cloud&quot;&gt;tag clouds&lt;/a&gt;. I was convinced (well, in fact I am still convinced) that online media should face the problem of organizing news in a different way. Unfortunately, the implementation of this solution was problematic from the beginning.&lt;/p&gt;&lt;p&gt;First, tag clouds are wild beasts and you have to learn a lot before trying to implement one (my early version of the &lt;a href=&quot;http://plone.org/products/tagcloud&quot;&gt;TagCloud&lt;/a&gt; product proved to has a lot of flaws). Second, &lt;a href=&quot;http://en.wikipedia.org/wiki/Social_bookmarking&quot;&gt;social bookmarking&lt;/a&gt; in our environment showed a lot of disadvantages like nonexistence of a &lt;a href=&quot;http://en.wikipedia.org/wiki/Controlled_vocabulary&quot;&gt;controlled vocabulary&lt;/a&gt;, use of &amp;quot;unclear&amp;quot; tags and spelling errors.&lt;/p&gt;&lt;p&gt;Worst of all, publishers never liked the concept.&lt;/p&gt;
    
    
    

    
    
    

    
    
    

    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398ba6cb3000200e398cc4c320005&quot; at:format=&quot;large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398cc4c320005.html&quot;&gt;&lt;img src=&quot;http://a2.vox.com/6a00e398ba6cb3000200e398cc4c320005-320pi&quot; alt=&quot;Using a tag cloud for navigation&quot; title=&quot;Using a tag cloud for navigation&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398cc4c320005.html&quot; title=&quot;Using a tag cloud for navigation&quot;&gt;Using a tag cloud for navigation&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;




&lt;p&gt;&lt;br /&gt;I also think many ordinary readers never understood the tag cloud neither because not many newspapers were using it at that time (even today, almost 2 years later, it&amp;#39;s difficult to find tag clouds in online versions of traditional media).&lt;/p&gt;&lt;p&gt;At the end we just had to abandon the idea and, obviously, it was quite evident that we needed to extend the functionalities of our site to include concepts like sections and a way to indicate if a new article was more important than another. &lt;/p&gt;&lt;p&gt;In &lt;a href=&quot;http://www.jornada.unam.mx/&quot;&gt;La Jornada&lt;/a&gt; we have been using &lt;a href=&quot;http://www.nitf.org/&quot;&gt;NITF&lt;/a&gt; to store news articles for the printed edition&amp;#39;s site since some time and it had simplified our work. We needed to bring that experience to the breaking news site. &lt;/p&gt;&lt;p&gt;As you can see in its &lt;a href=&quot;http://www.nitf.org/IPTC/NITF/3.4/documentation/nitf.html&quot;&gt;documentation&lt;/a&gt;, NITF defines a lot of metadata to be used on the different stages of a news article life. So, the first thing I did was a mapping between Plone&amp;#39;s metadata and NITF elements and attributes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Subject&lt;/strong&gt; (nitf/head/docdata/key-list): list of keywords; holds a list of keywords about the document&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Contributors&lt;/strong&gt; (nitf/body/body.end/tagline): a byline at the end of a story&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Creation Date&lt;/strong&gt; (nitf/head/docdata/date.issue): date/time document was issued&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Last Modified Date&lt;/strong&gt; (nitf/head/revision-history): information about the creative history of the document; also used as an audit trail (includes who made changes, when the changes were made, and why)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Effective Date&lt;/strong&gt; (nitf/head/docdata/date.release): date/time document is available to be released&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Expiration Date&lt;/strong&gt; (nitf/head/docdata/date.expire): date/time at which the document has no validity&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Language&lt;/strong&gt; (nitf/body/@xml:lang ): language value governed by RFC3066&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rights&lt;/strong&gt; (nitf/head/docdata/doc.copyright): copyright information for document header&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;Then, I identified what was the information we were missing:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Property&lt;/strong&gt; (nitf/head/tobject/tobject.property/@tobject.property.type): subject code property; includes such items as analysis, feature, and obituary. In our case we use it to differentiate news articles produced in-house from the ones written by our associates&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Section&lt;/strong&gt; (nitf/head/pubdata/@position.section): named section of a publication where a news object appear, such as Science, Sports, Weekend, etc.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Urgency&lt;/strong&gt; (nitf/head/docdata/urgency/@ed-urg): is used to define the importance of a news article (1=most, 5=normal, 8=least)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Byline&lt;/strong&gt; (nitf/body/body.head/byline): container for byline information; it can be unstructured text or structured text with direct specification of the responsible person/entity and their title&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;After having this in mind, I started looking how to accomplish the task the easier way.&lt;br /&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://hvelarde.vox.com/library/post/mapping-nitf-into-plones-metadata.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398ba6cb3000200e398cc37080001?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description> 
            <category domain="http://hvelarde.vox.com/tags/">tagcloud</category> 
            <category domain="http://hvelarde.vox.com/tags/">plone</category> 
            <category domain="http://hvelarde.vox.com/tags/">nitf</category>    
        </item> 
 
        <item>
            <title>Plone development in La Jornada. A little bit of history</title>
            <link>http://hvelarde.vox.com/library/post/plone-development-in-la-jornada-a-little-bit-of-history.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(hvelarde)</author>
            <comments>http://hvelarde.vox.com/library/post/plone-development-in-la-jornada-a-little-bit-of-history.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://hvelarde.vox.com/library/post/plone-development-in-la-jornada-a-little-bit-of-history.html?_c=feed-rss-full</guid> 
            <pubDate>Fri, 21 Dec 2007 18:26:12 -0600</pubDate>         
            
            <description>    &lt;p&gt;Back in 1995, &lt;a href=&quot;http://www.jornada.unam.mx/&quot;&gt;La Jornada&lt;/a&gt; was the first newspaper on Spanish language to have a web site. Over the years, the site evolved from static HTML files, written entirely by hand, to use some dynamic content creation in &lt;a href=&quot;http://www.php.net/&quot;&gt;PHP&lt;/a&gt;, but the work involved on maintaining the content and structure was huge. We needed a change, so in 2005 we started looking for a &lt;a href=&quot;http://en.wikipedia.org/wiki/Content_management_system&quot;&gt;CMS&lt;/a&gt;.&lt;/p&gt;
    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398ba6cb3000200e398ca88840005&quot; at:format=&quot;large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398ca88840005.html&quot;&gt;&lt;img src=&quot;http://a4.vox.com/6a00e398ba6cb3000200e398ca88840005-320pi&quot; alt=&quot;La Jornada in 1996&quot; title=&quot;La Jornada in 1996&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398ca88840005.html&quot; title=&quot;La Jornada in 1996&quot;&gt;La Jornada in 1996&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;






&lt;p&gt;&lt;br /&gt;I asked &lt;a href=&quot;http://caserola.homelinux.org/%7Emancha/&quot;&gt;La Mancha&lt;/a&gt;, a friend of mine who was one of the visionaries who brought the newspaper into the web, and he gave me 2 options: one was written in &lt;a href=&quot;http://www.perl.org/&quot;&gt;Perl&lt;/a&gt; and the other one, in &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;. The choice was obvious for me, and we started looking for more information on &lt;a href=&quot;http://plone.org/&quot;&gt;Plone&lt;/a&gt; soon.&lt;/p&gt;&lt;p&gt;I wrote to the &lt;a href=&quot;http://www.enfoldsystems.com/&quot;&gt;Enfold Systems&lt;/a&gt;&amp;#39; guys and they put me in touch with &lt;a href=&quot;http://blog.delaguardia.com.mx/&quot;&gt;Carlos de la Guardia&lt;/a&gt;. In three weeks, Carlos gave us an introduction to the Python/&lt;a href=&quot;http://www.zope.org/&quot;&gt;Zope&lt;/a&gt;/Plone world and he started acting as a consultant for the development.&lt;/p&gt;&lt;p&gt;Those were the early days of Plone 2.1 and &lt;a href=&quot;http://plone.org/products/archetypes&quot;&gt;Archetypes&lt;/a&gt; was the way to go. Our idea was to create content types for everything: editions, current news, analysis, features, opinions... you name it.&lt;/p&gt;&lt;p&gt;We spent several months working on that and, I have to admit, our first tests were not very successful. We had many things to learn and very few experience in many topics.&lt;/p&gt;&lt;p&gt;In the middle of 2006 we had to create a microsite to cover the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mexican_general_election%2C_2006&quot;&gt;&lt;span class=&quot;fn&quot;&gt;Mexican general election&lt;/span&gt;&lt;/a&gt;. We decided to use a plain-vanilla Plone instance with no funky stuff on it and just install a basic skin. The experience was so good that we started using the same system, with some minor changes, as the breaking news edition of the diary.&lt;/p&gt;&lt;p&gt;In late 2006, when we were about to restart the work, I traveled to Seattle for the &lt;a href=&quot;http://plone.org/events/conferences/seattle-2006&quot;&gt;Plone Conference 2006&lt;/a&gt; and after assisting to &lt;a href=&quot;http://plone.tv/media/257351444/view&quot;&gt;Martin Aspeli&amp;#39;s talk&lt;/a&gt;, I finally saw the light: the way we&amp;#39;d been working was fine... but there were better and easier ways to do it!&lt;/p&gt;&lt;p&gt;From content types to adapters was the new &lt;a href=&quot;http://en.wikipedia.org/wiki/Paradigm_shift&quot;&gt;paradigm shift&lt;/a&gt;, and we wanted to embrace it as soon as possible. Unfortunately, we couldn&amp;#39;t restart the work because we started experiencing performance issues as a result of the increasing traffic. We spent many months understanding and fixing the problems.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;
    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398ba6cb3000200e398ca91be0003&quot; at:format=&quot;large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398ca91be0003.html&quot;&gt;&lt;img src=&quot;http://a6.vox.com/6a00e398ba6cb3000200e398ca91be0003-320pi&quot; alt=&quot;Traffic growth in La Jornada&quot; title=&quot;Traffic growth in La Jornada&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398ca91be0003.html&quot; title=&quot;Traffic growth in La Jornada&quot;&gt;Traffic growth in La Jornada&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;





&lt;br /&gt;The main development has been in standby since then but we&amp;#39;ve been releasing some of our work slowly. We decided to move some of our products to the &lt;a href=&quot;http://dev.plone.org/collective&quot;&gt;Collective&lt;/a&gt; in order to enhance collaboration.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve been talking lately with Carlos about current trends on Plone and Zope deployment and we have now a better idea of what we want to implement in the near future.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://hvelarde.vox.com/library/post/plone-development-in-la-jornada-a-little-bit-of-history.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398ba6cb3000200e398ca84cf0004?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description> 
            <category domain="http://hvelarde.vox.com/tags/">plone</category> 
            <category domain="http://hvelarde.vox.com/tags/">lajornada</category>    
        </item> 
 
        <item>
            <title>Beyond News Items: the need for news industry standards in Plone</title>
            <link>http://hvelarde.vox.com/library/post/beyond-news-items-the-need-for-news-industry-standards-in-plone.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(hvelarde)</author>
            <comments>http://hvelarde.vox.com/library/post/beyond-news-items-the-need-for-news-industry-standards-in-plone.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://hvelarde.vox.com/library/post/beyond-news-items-the-need-for-news-industry-standards-in-plone.html?_c=feed-rss-full</guid> 
            <pubDate>Tue, 18 Dec 2007 19:37:53 -0600</pubDate>         
            
            <description>    &lt;p&gt;News articles in &lt;a href=&quot;http://plone.org/&quot;&gt;Plone&lt;/a&gt; are instances of the &lt;strong&gt;News Item&lt;/strong&gt; content type: they can contain a title, a description, a body text, an image and some basic metadata. If you publish a couple of items from time to time, this is fine.&lt;/p&gt;&lt;p&gt;But suppose you have to publish dozens of items everyday... How do you tell your readers who they are about? What do they cover? Where do they took place? And, more important, how do you classify them? How do you organize them? How do you tell your readers which ones are newsworthy?&lt;/p&gt;&lt;p&gt;To solve these, and other issues, the &lt;a href=&quot;http://www.iptc.org/&quot;&gt;IPTC&lt;/a&gt; developed XML standards to define the content and structure of news articles. &lt;a href=&quot;http://www.nitf.org/&quot;&gt;NITF&lt;/a&gt;, &lt;a href=&quot;http://www.newsml.org/&quot;&gt;NewsML&lt;/a&gt; and &lt;a href=&quot;http://www.iptc.org/NewsCodes/&quot;&gt;NewsCodes&lt;/a&gt; are among these standards and they support the classification, identification and description of a huge number of news articles characteristics.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NITF&lt;/strong&gt; and &lt;strong&gt;NewsML&lt;/strong&gt; have different uses: NITF is intended to structure independent news articles; NewsML is for the structuring
of multimedia news packages. Inside a NewsML object we can have things like alternative representations of the same article to be used on different media, or different translations. NewsML can also be used to encapsulate many NITF objects to form an edition.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NewsCodes&lt;/strong&gt; are about consistent coding of news metadata (taxonomies). &lt;span class=&quot;mzEmphText&quot;&gt;NewsCodes define&lt;/span&gt; &lt;span class=&quot;mzStdText&quot;&gt;sets
                                of topics to
                                be assigned
                                as
                                &lt;/span&gt;&lt;span class=&quot;mzStdTextIBlue&quot;&gt;metadata
                                values&lt;/span&gt;&lt;span class=&quot;mzStdText&quot;&gt; to
                                any object inside a news article (text, photos, graphs,
                                audios and videos).&lt;/span&gt;&lt;span class=&quot;mzStdText&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As you can imagine this is quite powerful. Typical uses of these standards are: in and between editorial systems, between news agencies and their
                            customers, between publishers and news aggregators, and between news service providers
                            and end users. Many content providers and system vendors currently support them worldwide.&lt;/p&gt;&lt;p&gt;If Plone could understand NITF and NewsML, it would be easy to interoperate with editorial systems and feed a whole edition of a newspaper or magazine into a website, even in different languages and formats, and including all sort of multimedia content. You could also use Plone to distribute your content to different aggregators or sell it to your customers.&lt;/p&gt;&lt;p&gt;If Plone could handle NewsCodes it would be easier to describe, manage, transmit and exchange news articles.&lt;/p&gt;&lt;p&gt;That&amp;#39;s a lot of work, and that&amp;#39;s what we had in mind when we started the &lt;a href=&quot;http://julius.jornada.com.mx/&quot;&gt;Julius project&lt;/a&gt; in early 2006.&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://hvelarde.vox.com/library/post/beyond-news-items-the-need-for-news-industry-standards-in-plone.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398ba6cb3000200e398c9a7830005?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description> 
            <category domain="http://hvelarde.vox.com/tags/">plone</category> 
            <category domain="http://hvelarde.vox.com/tags/">newsml</category> 
            <category domain="http://hvelarde.vox.com/tags/">nitf</category> 
            <category domain="http://hvelarde.vox.com/tags/">newscodes</category>   
        </item> 
 
        <item>
            <title>ZODB performance: a small change can make a big difference</title>
            <link>http://hvelarde.vox.com/library/post/zodb-performance-a-small-change-can-make-a-big-difference.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(hvelarde)</author>
            <comments>http://hvelarde.vox.com/library/post/zodb-performance-a-small-change-can-make-a-big-difference.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://hvelarde.vox.com/library/post/zodb-performance-a-small-change-can-make-a-big-difference.html?_c=feed-rss-full</guid> 
            <pubDate>Wed, 05 Dec 2007 20:24:38 -0600</pubDate>         
            
            <description>    &lt;p&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;Tunning&amp;#160;&lt;/span&gt;&lt;a href=&quot;http://www.zope.org/&quot;&gt;Zope&lt;/a&gt;&amp;#39;s&lt;span style=&quot;width: 500px;&quot;&gt;
ZODB performance can be a big challenge. Almost everything you can find
on the web about it can be resumed on the following: use the &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Edisonian_approach&quot;&gt;Edisonian approach&lt;/a&gt;: trial and error discovery.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;width: 500px;&quot;&gt;At &lt;/span&gt;&lt;a href=&quot;http://www.jornada.unam.mx/&quot;&gt;La Jornada&lt;/a&gt; w&lt;span style=&quot;width: 500px;&quot;&gt;e are using &lt;/span&gt;&lt;a href=&quot;http://wiki.zope.org/ZODB/howto.html&quot;&gt;ZEO&lt;/a&gt;&lt;span style=&quot;width: 500px;&quot;&gt; to serve about 500,000 pages to more than 60,000 visitors everyday. Some weeks ago I noticed we were facing &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;performance
issues with the servers holding most of the ZEO clients of our
installation: at peak times the load was so high that we were unable to
serve some pages.&lt;/p&gt;&lt;p&gt;In the beginning I thought I had made a mistake
with the amount of memory dedicated to the servers but&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;based on our previous experiences with the main
server, &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;I started investigating how
to decrease CPU usage looking for bottlenecks using the usual Linux tools like &lt;strong&gt;vmstat&lt;/strong&gt; and &lt;strong&gt;iostat&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;.&lt;/p&gt;&lt;p&gt;I didn&amp;#39;t found anything clear but, suddenly, I
&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;noticed &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;that the clients on the main server were also acting strangely:
one of them had a very high CPU usage while the other had almost none. I
started looking for a mistake on the load-balancing configuration, but
after some time I &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;discovered &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;that one of the ZEO clients had a value of
20,000 in the &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;strong&gt;cache-size&lt;/strong&gt; directive and the other, the one running smoothly, a value of &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;30,000&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;.&lt;/p&gt;&lt;p&gt;I made the following change on the &lt;strong&gt;zope.conf&lt;/strong&gt; file of all of my ZEO clients:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;/span&gt;&amp;lt;zodb_db main&amp;gt;&lt;br /&gt;&amp;#160; &lt;strong&gt;cache-size 30000&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;lt;zeoclient&amp;gt;&lt;br /&gt;&amp;#160; ...&lt;br /&gt;&amp;#160; &amp;lt;/zeoclient&amp;gt;&lt;br /&gt;&amp;#160; mount-point /&lt;br /&gt;&amp;lt;/zodb_db&amp;gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;br /&gt;After
restarting them I was shocked with the results: a minimum
increase on memory usage and an amazing decrease on CPU usage. &lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;width: 500px;&quot;&gt;You
can see below the behavior of one of the servers in the previous month
(the change in the configuration occurred at the middle of the graph):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/span&gt;
    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398ba6cb3000200e398c4df8c0003&quot; at:format=&quot;large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398c4df8c0003.html&quot;&gt;&lt;img src=&quot;http://a4.vox.com/6a00e398ba6cb3000200e398c4df8c0003-320pi&quot; alt=&quot;Processor load chart&quot; title=&quot;Processor load chart&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398c4df8c0003.html&quot; title=&quot;Processor load chart&quot;&gt;Processor load chart&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;
















&lt;/p&gt;&lt;p&gt;So, talking about &lt;span style=&quot;width: 500px;&quot;&gt;&lt;strong&gt;cache-size&lt;/strong&gt;&lt;/span&gt;, how big is big enough? According to &lt;a href=&quot;http://plone.org/events/regional/nola05/collateral/Chris%20McDonough-ZODB%20Tips%20and%20Tricks.pdf&quot;&gt;Chris McDonough&amp;#39;s excelent presentation&lt;/a&gt; at the Plone Symposium 2005 in New Orleans: &lt;em&gt;as big as you can make it without causing your machine to swap&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;And, how many objects can we store given a certain amount of memory? According to &lt;a href=&quot;http://wiki.zope.org/ZODB/MemorySizeLimitedCache&quot;&gt;Dieter Maurer&lt;/a&gt;, &lt;em&gt;as the size of objects can vary unboundedly,
 this gives very imprecise control over the main memory used for
 the cache&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;In
our case, with about 700,000 objects in the ZODB, memory consumption is
around 1GB on a cluster of 3 ZEO clients (with 4 threads and 30,000
objects in cache each one).&lt;/p&gt;&lt;p&gt;As we reserved 2GB for this server, we still have some space to grow up; we only need to find out some time to test it.&lt;/p&gt;     &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://hvelarde.vox.com/library/post/zodb-performance-a-small-change-can-make-a-big-difference.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398ba6cb3000200e398c59caa0005?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description> 
            <category domain="http://hvelarde.vox.com/tags/">performance</category> 
            <category domain="http://hvelarde.vox.com/tags/">zope</category> 
            <category domain="http://hvelarde.vox.com/tags/">lajornada</category>    
        </item> 
 
        <item>
            <title>Implementing a photo gallery viewlet for CompositePack using jQuery</title>
            <link>http://hvelarde.vox.com/library/post/implementing-a-photo-gallery-viewlet-for-compositepack-using-jquery.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(hvelarde)</author>
            <comments>http://hvelarde.vox.com/library/post/implementing-a-photo-gallery-viewlet-for-compositepack-using-jquery.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://hvelarde.vox.com/library/post/implementing-a-photo-gallery-viewlet-for-compositepack-using-jquery.html?_c=feed-rss-full</guid> 
            <pubDate>Mon, 03 Dec 2007 21:53:23 -0600</pubDate>         
            
            <description>    &lt;p&gt;&lt;a href=&quot;http://plone.org/products/compositepack&quot;&gt;CompositePack&lt;/a&gt; is a beautiful piece of code written by Godefroid Chapelle. We use CompositePack at &lt;a href=&quot;http://www.jornada.unam.mx/&quot;&gt;La Jornada&lt;/a&gt; to create the frontpage for the breaking news edition.&lt;/p&gt;&lt;p&gt;Some time ago I was asked to create a viewlet for a photo gallery and we started testing some gallery products to accomplish this task. We tried &lt;a href=&quot;http://plone.org/products/friendlyalbum&quot;&gt;FriendlyAlbum&lt;/a&gt;, &lt;a href=&quot;http://plone.org/products/plonesmoothgallery&quot;&gt;Plone SmoothGallery&lt;/a&gt;, &lt;a href=&quot;http://plone.org/products/plonegalleryview&quot;&gt;plonegalleryview&lt;/a&gt; and, the best and most promising by far, &lt;a href=&quot;http://plone.org/products/slideshowfolder&quot;&gt;Slideshow Folder&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;All products had limitations that keep me away from using them as a base for my solution. I didn&amp;#39;t wanted to create any new content type neither, so the approach I followed was this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;use a folder as a container for the gallery; the name and description of the folder was going to be the title and introduction text for the gallery&lt;/li&gt;&lt;li&gt;use Image as the content type for the photos; the name and description of every image was going to be the alternative text (the &lt;strong&gt;alt &lt;/strong&gt;attribute) and caption of the photo&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;Having this in mind, I started analyzing how to integrate one of the many JavaScript libraries available to create the gallery. I wanted to use &lt;a href=&quot;http://kssproject.org/&quot;&gt;KSS&lt;/a&gt;, as this framework is on the way to become the standard on the Plone world, but I abandoned the idea soon. KSS is still on development and most of the current work is being done on the Plone 3.0 branch. The only thing I found for Plone 2.5 was a product named &lt;a href=&quot;http://plone.org/products/PloneAzax&quot;&gt;PloneAzax&lt;/a&gt; with a 1.0 release in Alpha state. PloneAzax was more like a demo of how AJAX would be used in Plone 3.0, than an usable product. Worst: it had some conflicts with CompositePack and I didn&amp;#39;t wanted to mess with it.&lt;/p&gt;&lt;p&gt;After some research on the web I decided to use &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; JavaScript Library. jQuery is fast and concise, and it lets you traverse HTML documents and handle events. From here all my work was pretty straightforward... well I had to fight a little bit with jQuery and IE, but that&amp;#39;s another story.&lt;/p&gt;&lt;p&gt;I created the viewlet the usual way and I inserted the JavaScript code with the help of a Python script. To get the list of images in a given folder I used &lt;strong&gt;context.atctListAlbum(images=1)&lt;/strong&gt;. I took this idea from &lt;strong&gt;atct_album_view.pt&lt;/strong&gt;, the page template used to view the images in a folder as small thumbnails. I registered the viewlet for Folder content type using a modified version of &lt;strong&gt;compositepack-customisation-policy.py&lt;/strong&gt; and the JavaScript file using &lt;strong&gt;portal_javascripts&lt;/strong&gt;, the JavaScript Registry.&lt;strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The photo gallery is working fine on IE 6.0+, Firefox 1.5+, Safari 2.0+ and Opera 9.0+. Please note that only one gallery is allowed per page. It would be nice to add some effects, but that will have to wait.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398ba6cb3000200e398c4884b0003&quot; at:format=&quot;large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398c4884b0003.html&quot;&gt;&lt;img src=&quot;http://a3.vox.com/6a00e398ba6cb3000200e398c4884b0003-320pi&quot; alt=&quot;The photo gallery viewlet&quot; title=&quot;The photo gallery viewlet&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://hvelarde.vox.com/library/photo/6a00e398ba6cb3000200e398c4884b0003.html&quot; title=&quot;The photo gallery viewlet&quot;&gt;The photo gallery viewlet&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;











&lt;/p&gt;&lt;p&gt;You can see here the final versions of &lt;a href=&quot;http://julius.jornada.com.mx/browser/code/skins/LaJornadaLite/skins/lajornadalite_templates/image_gallery_viewlet.pt?rev=1382&quot;&gt;image_gallery_viewlet.pt&lt;/a&gt; and &lt;a href=&quot;http://julius.jornada.com.mx/browser/code/skins/LaJornadaLite/skins/lajornadalite_templates/getSlideshowScript.py?rev=1382&quot;&gt;getSlideshowScript.py&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;CompositePack rocks! I hope you enjoy it as much as I do.&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://hvelarde.vox.com/library/post/implementing-a-photo-gallery-viewlet-for-compositepack-using-jquery.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398ba6cb3000200e398c41af80004?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description> 
            <category domain="http://hvelarde.vox.com/tags/">plone</category> 
            <category domain="http://hvelarde.vox.com/tags/">jquery</category> 
            <category domain="http://hvelarde.vox.com/tags/">compositepack</category> 
            <category domain="http://hvelarde.vox.com/tags/">lajornada</category> 
            <category domain="http://hvelarde.vox.com/tags/">problemsolving</category>    
        </item> 
    </channel>
</rss>

