<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to OfflineModuleImpl</title><link>https://sourceforge.net/p/arcomem/wiki/OfflineModuleImpl/</link><description>Recent changes to OfflineModuleImpl</description><atom:link href="https://sourceforge.net/p/arcomem/wiki/OfflineModuleImpl/feed" rel="self"/><language>en</language><lastBuildDate>Wed, 19 Feb 2014 00:33:29 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/arcomem/wiki/OfflineModuleImpl/feed" rel="self" type="application/rss+xml"/><item><title>OfflineModuleImpl modified by John Arcoman</title><link>https://sourceforge.net/p/arcomem/wiki/OfflineModuleImpl/</link><description>&lt;div class="markdown_content"&gt;&lt;h1 id="implementing-offline-analysis-modules"&gt;Implementing Offline Analysis Modules&lt;/h1&gt;
&lt;p&gt;Implementing a new offline analysis module is simply a matter of creating a new subclass of a particular existing class. The existing class you need subclass depends on the type of module. Modules would normally be implemented in the &lt;code&gt;eu.arcomem.framework.offline.processes&lt;/code&gt; package of the &lt;em&gt;offline-analysis-modules&lt;/em&gt; project.&lt;/p&gt;
&lt;h2 id="standard-modules"&gt;Standard Modules&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Standard offline&lt;/em&gt; modules are subclasses of &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/OfflineProcess"&gt;&lt;code&gt;OfflineProcess&lt;/code&gt;&lt;/a&gt;. The &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/OfflineProcess"&gt;&lt;code&gt;OfflineProcess&lt;/code&gt;&lt;/a&gt; class is typed on the output key and value type of the &lt;code&gt;Map&lt;/code&gt; function (&lt;code&gt;MAP_KEY_OUT&lt;/code&gt; and &lt;code&gt;MAP_VALUE_OUT&lt;/code&gt;), the output key and value type of the reducer (&lt;code&gt;REDUCE_KEY_OUT&lt;/code&gt; and &lt;code&gt;REDUCE_VALUE_OUT&lt;/code&gt;) and the Hadoop &lt;code&gt;org.apache.hadoop.mapreduce.OutputFormat&lt;/code&gt; class (&lt;code&gt;OUTPUT_FORMAT&lt;/code&gt;). For modules that are &lt;em&gt;map-heavy&lt;/em&gt; and do not emit via the Hadoop framework from the mapper, a &lt;code&gt;org.apache.hadoop.mapreduce.lib.output.NullOutputFormat&lt;/code&gt; should be used, and the keys and values can be the &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/util/Null"&gt;&lt;code&gt;Null&lt;/code&gt;&lt;/a&gt; class.&lt;/p&gt;
&lt;p&gt;The following methods of &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/OfflineProcess"&gt;&lt;code&gt;OfflineProcess&lt;/code&gt;&lt;/a&gt; must be implemented:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="nx"&gt;getRequiredColumnFamilies&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;Class&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;OfflineProcessMapper&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MAP_KEY_OUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MAP_VALUE_OUT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;getMapperClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Reducer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MAP_KEY_OUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MAP_VALUE_OUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;REDUCE_KEY_OUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;REDUCE_VALUE_OUT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;getReducerClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;throws&lt;/span&gt; &lt;span class="nx"&gt;ClassNotFoundException&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;getRequiredColumnFamilies()&lt;/code&gt; method must return the HBase column families that the module needs access to. Currently there are two such families: the metadata family (&lt;code&gt;AMResource.METADATA_CF&lt;/code&gt;) and the content family (&lt;code&gt;AMResource.CONTENT_CF&lt;/code&gt;). The implementation of this method should return one or both of the families depending on what information is required. A typical implementation is as follows:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;getRequiredColumnFamilies&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;AMResource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;METADATA_CF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AMResource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONTENT_CF&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;getMapperClass()&lt;/code&gt; must return the class implementing the &lt;code&gt;Map&lt;/code&gt; function for the module. This must be a subclass of &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/OfflineProcessMapper"&gt;&lt;code&gt;OfflineProcessMapper&lt;/code&gt;&lt;/a&gt;. To implement a subclass of &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/OfflineProcessMapper"&gt;&lt;code&gt;OfflineProcessMapper&lt;/code&gt;&lt;/a&gt; you need only implement a single method representing a &lt;code&gt;Map&lt;/code&gt; function with a url (the &lt;code&gt;key&lt;/code&gt;) and the document (the &lt;code&gt;resource&lt;/code&gt;):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ResultResourceWrapper&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the module is &lt;em&gt;map-heavy&lt;/em&gt;, this method is where most of the work is done. The &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/processes/SampleImageProcess.SampleImageProcessingMapper"&gt;&lt;code&gt;SampleImageProcess.SampleImageProcessingMapper&lt;/code&gt;&lt;/a&gt; class is a good demonstration of a &lt;em&gt;map-heavy&lt;/em&gt; module. The &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/util/URLResourceMapper"&gt;&lt;code&gt;URLResourceMapper&lt;/code&gt;&lt;/a&gt; demonstrates how a &lt;code&gt;Map&lt;/code&gt; function for a &lt;em&gt;reduce-heavy&lt;/em&gt; task might be implemented.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;getReducerClass()&lt;/code&gt; method must return the class implementing the &lt;code&gt;Reduce&lt;/code&gt; function. The returned class must be a subclass of &lt;code&gt;org.apache.hadoop.mapreduce.Reducer&lt;/code&gt;. If the module doesn\'t require a reduce phase, then the &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/util/NullReducer"&gt;&lt;code&gt;NullReducer&lt;/code&gt;&lt;/a&gt; class should be returned rather than returning null (which will not work).&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="../apidocs/eu/arcomem/framework/offline/OfflineProcess"&gt;&lt;code&gt;OfflineProcess&lt;/code&gt;&lt;/a&gt; can also override the &lt;code&gt;setupJob(Job job)&lt;/code&gt; method in order to have the module configure additional parts of the Map-Reduce framework. For example, a module could configure a &lt;code&gt;Combine&lt;/code&gt; function, and set the number of reducers:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;setupJob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setupJob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setCombinerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MimeTypeStatsReducer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setNumReduceTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="a-note-on-efficiency-and-configuration"&gt;A note on efficiency and configuration&lt;/h3&gt;
&lt;p&gt;Both the mapper and reducer classes have &lt;code&gt;setup(Context context)&lt;/code&gt; and &lt;code&gt;cleanup(Context context)&lt;/code&gt; methods that can be overridden to make better use of resources across calls to the &lt;code&gt;Map&lt;/code&gt; or &lt;code&gt;Reduce&lt;/code&gt; functions. A common use-case is for setting up a persistent connection to the triple store that can be re-used throughout the lifetime of the mapper or reducer:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="n"&gt;TripleStoreConnector&lt;/span&gt; &lt;span class="n"&gt;tsc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
&lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterruptedException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tsc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TripleStoreConnector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newConnector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getConfiguration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Error configuring TripleStoreConnector.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Take a look at the module implementations in the &lt;code&gt;eu.arcomem.framework.offline.processes&lt;/code&gt; package of the &lt;em&gt;offline-analysis-modules&lt;/em&gt; project to see some more example uses of the &lt;code&gt;setup(Context context)&lt;/code&gt; and &lt;code&gt;cleanup(Context context)&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;Another use of the &lt;code&gt;setup(Context context)&lt;/code&gt; method is for configuring the mapper or reducer. Configuration information provided in the form of &lt;em&gt;key-value&lt;/em&gt; pairs to the &lt;code&gt;SingleOfflineProcessRunner&lt;/code&gt; and &lt;code&gt;OfflineProcessRunner&lt;/code&gt; tools is passed automatically into the configuration of the context object which can be accessed by calling &lt;code&gt;context.getConfiguration()&lt;/code&gt;. Calling one of the various &lt;code&gt;get&lt;/code&gt; methods on this configuration object with a key given to the tool will return the relevant value. For example, see this excerpt from the &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/processes/SampleImageProcess.SampleImageProcessingMapper"&gt;&lt;code&gt;SampleImageProcess.SampleImageProcessingMapper&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;CONF_MIN_FACE_DET_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;min.facedetect.size&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="n"&gt;FaceDetector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DetectedFace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FImage&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
&lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterruptedException&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;minSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getConfiguration&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CONF_MIN_FACE_DET_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HaarCascadeDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="local-modules"&gt;Local Modules&lt;/h2&gt;
&lt;p&gt;All &lt;em&gt;local modules&lt;/em&gt; are implemented as subclasses of the &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/LocalOfflineProcess"&gt;&lt;code&gt;LocalOfflineProcess&lt;/code&gt;&lt;/a&gt; class. The &lt;code&gt;run()&lt;/code&gt; method is the entry point for the actual work performed by the module.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;conf&lt;/code&gt; field from &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/LocalOfflineProcess"&gt;&lt;code&gt;LocalOfflineProcess&lt;/code&gt;&lt;/a&gt; provides a convenient way to access the configuration of the module as passed through from the &lt;code&gt;SingleOfflineProcessRunner&lt;/code&gt; or &lt;code&gt;OfflineProcessRunner&lt;/code&gt; tools. A pre-configured connection to the knowledge base in the form of a &lt;a class="" href="../apidocs/eu/arcomem/framework/rdf/TripleStoreConnector"&gt;&lt;code&gt;TripleStoreConnector&lt;/code&gt;&lt;/a&gt; can be accessed by called &lt;code&gt;getConnector()&lt;/code&gt;. All local module implementations must have a public one-argument constructor with a &lt;a class="" href="../apidocs/eu/arcomem/framework/offline/configuration/LocalProcessConf"&gt;&lt;code&gt;LocalProcessConf&lt;/code&gt;&lt;/a&gt; parameter so that the framework can configure instances through reflection as required.&lt;/p&gt;
&lt;h2 id="hbase-and-hdfs-modules"&gt;HBase and HDFS Modules&lt;/h2&gt;
&lt;p&gt;Generic HBase and HDFS modules should be implemented as subclasses of the &lt;code&gt;net.internetmemory.mapred.HBaseMapReduceGeneric&lt;/code&gt; and &lt;code&gt;net.internetmemory.mapred.MapReduceSpecGeneric&lt;/code&gt; classes respectively. Please see the Internet Memory documentation on these classes for more information.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">John Arcoman</dc:creator><pubDate>Wed, 19 Feb 2014 00:33:29 -0000</pubDate><guid>https://sourceforge.net2fa433ea5ce13db8a68137bbdf61c2fe72340eec</guid></item></channel></rss>