<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://chem-bla-ics.linkedchemistry.info/feed/by_tag/xmpp.xml" rel="self" type="application/atom+xml" /><link href="https://chem-bla-ics.linkedchemistry.info/" rel="alternate" type="text/html" /><updated>2026-06-07T16:43:55+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/feed/by_tag/xmpp.xml</id><title type="html">chem-bla-ics</title><subtitle>Chemblaics (pronounced chem-bla-ics) is the science that uses open science and computers to solve problems in chemistry, biochemistry and related fields.</subtitle><author><name>Egon Willighagen</name></author><entry><title type="html">“LAST CALL: XEP-0244 (IO Data)”</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/08/13/last-call-xep-0244-io-data.html" rel="alternate" type="text/html" title="“LAST CALL: XEP-0244 (IO Data)”" /><published>2009-08-13T00:00:00+00:00</published><updated>2009-08-13T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/08/13/last-call-xep-0244-io-data</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/08/13/last-call-xep-0244-io-data.html"><![CDATA[<p>Today I received this email, which is a milestone for the <a href="http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol">XMPP</a>
(aka Jabber) work Johannes, Ola and I have been working on as SOAP alternative using the intrinsically asynchronous XMPP as transport
protocol instead of HTTP as SOAP commonly does (see
<a href="https://chem-bla-ics.linkedchemistry.info/2008/10/31/next-generation-asynchronous.html">Next generation asynchronous webservices <i class="fa-solid fa-recycle fa-xs"></i></a>):</p>

<blockquote>
  <p>This message constitutes notice of a Last Call for comments on XEP-0244 (IO Data).</p>

  <p>Abstract: This specification defines an XMPP protocol extension for handling the input to and output from a remote entity.</p>

  <p>URL: <a href="https://www.xmpp.org/extensions/xep-0244.html">http://www.xmpp.org/extensions/xep-0244.html</a></p>

  <p>This Last Call begins today and shall end at the close of business on 2009-09-01.</p>

  <p>Please consider the following questions during this Last Call and send your feedback to the standards @ xmpp.org discussion list:</p>

  <ol>
    <li>Is this specification needed to fill gaps in the XMPP protocol stack or to clarify an existing protocol?</li>
    <li>Does the specification solve the problem stated in the introduction and requirements?</li>
    <li>Do you plan to implement this specification in your code? If not, why not?</li>
    <li>Do you have any security concerns related to this specification?</li>
    <li>Is the specification accurate and clearly written?</li>
  </ol>

  <p>Your feedback is appreciated!</p>
</blockquote>

<p>There remains quite a lot to do, and you are more than welcome to join in the project. There is a Java library and we’ve
integrated the specs into <a href="http://www.bioclipse.net/">Bioclipse</a> and <a href="http://taverna.sf.net/">Taverna</a> (see
<a href="https://chem-bla-ics.linkedchemistry.info/2009/01/21/details-behind-calling-xmpp-cloud.html">Details behind the “Calling XMPP cloud services from Taverna2” <i class="fa-solid fa-recycle fa-xs"></i></a>),
but there is no support for BioCatalogue yet, and no libraries for other programming language yet.</p>]]></content><author><name>Egon Willighagen</name></author><category term="xmpp" /><category term="bioinfo" /><category term="cheminf" /><summary type="html"><![CDATA[Today I received this email, which is a milestone for the XMPP (aka Jabber) work Johannes, Ola and I have been working on as SOAP alternative using the intrinsically asynchronous XMPP as transport protocol instead of HTTP as SOAP commonly does (see Next generation asynchronous webservices ):]]></summary></entry><entry><title type="html">/me is having Bioclipse/XMPP/RDF fun</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/05/07/me-is-having-bioclipsexmpprdf-fun.html" rel="alternate" type="text/html" title="/me is having Bioclipse/XMPP/RDF fun" /><published>2009-05-07T00:00:00+00:00</published><updated>2009-05-07T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/05/07/me-is-having-bioclipsexmpprdf-fun</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/05/07/me-is-having-bioclipsexmpprdf-fun.html"><![CDATA[<p>Johannes asked me what the <a href="http://en.wikipedia.org/wiki/Lipinski%27s_Rule_of_Five">Lipinski Rule of Five</a> for
<a href="http://en.wikipedia.org/wiki/Farnesol">farnesol</a> is, in reply to the <a href="http://pele.farmbio.uu.se/xmpp-services/index.php/Services">matching XMPP cloud service</a>.
Thanx to <a href="http://dbpedia.org/">DBPedia</a> for providing a machine readable form of the wikipedia entry:</p>

<p>Here’s the solution (yes, suboptimal, but since we were hacking on XMPP support in
<a href="http://www.bioclipse.net/">Bioclipse</a>) which shows the structure in JChemPaint and <a href="http://www.jmol.org/">Jmol</a>
as bonus (gist:<a href="http://gist.github.com/107507">107507</a>):</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Today, Johannes challenged me to use Bioclipse and XMPP to calculate the Lipinski Rule of Five for</span>
<span class="c1">// http://en.wikipedia.org/wiki/Farnesol</span>
<span class="nx">query</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Farnesol</span><span class="dl">"</span>

<span class="c1">// Zero: clear the console</span>
<span class="nx">js</span><span class="p">.</span><span class="nf">clear</span><span class="p">();</span>
<span class="nx">js</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="dl">"</span><span class="s2">Query: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">query</span> <span class="o">+</span> <span class="dl">"</span><span class="se">\n</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// One: connect to the XMPP hive, and make contact with the CDK descriptor service here in Uppsala</span>
<span class="nx">xmpp</span><span class="p">.</span><span class="nf">connect</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">service</span> <span class="o">=</span> <span class="nx">xmpp</span><span class="p">.</span><span class="nf">getService</span><span class="p">(</span><span class="dl">"</span><span class="s2">descriptor.ws1.bmc.uu.se</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">service</span><span class="p">.</span><span class="nf">discoverSync</span><span class="p">(</span><span class="mi">5000</span><span class="p">);</span>
<span class="nx">service</span><span class="p">.</span><span class="nf">getFunctions</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="nx">service</span><span class="p">.</span><span class="nf">getFunction</span><span class="p">(</span><span class="dl">"</span><span class="s2">LipinskiRuleOfFive</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Two: take advantage of RDF, DBPedia</span>
<span class="nx">store</span> <span class="o">=</span> <span class="nx">rdf</span><span class="p">.</span><span class="nf">createStore</span><span class="p">()</span>
<span class="nx">rdf</span><span class="p">.</span><span class="nf">importURL</span><span class="p">(</span><span class="nx">store</span><span class="p">,</span> <span class="dl">"</span><span class="s2">http://dbpedia.org/data/</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">query</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">.rdf</span><span class="dl">"</span><span class="p">)</span>
<span class="nx">rdf</span><span class="p">.</span><span class="nf">importURL</span><span class="p">(</span><span class="nx">store</span><span class="p">,</span> <span class="dl">"</span><span class="s2">http://dbpedia.org/data/</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">query</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">/section1/Chembox_Identifiers.rdf</span><span class="dl">"</span><span class="p">)</span>

<span class="c1">// Three: run the SPARQL query and extract the SMILES from the List&lt;List&lt;String&gt;&gt;, and remove</span>
<span class="c1">// the '@en' suffix</span>
<span class="kd">var</span> <span class="nx">sparql</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">PREFIX dbprop: &lt;http://dbpedia.org/property/&gt; SELECT ?o WHERE { ?s dbprop:smiles ?o }</span><span class="dl">"</span>
<span class="nx">smiles</span> <span class="o">=</span> <span class="nx">rdf</span><span class="p">.</span><span class="nf">sparql</span><span class="p">(</span><span class="nx">store</span><span class="p">,</span> <span class="nx">sparql</span><span class="p">).</span><span class="nf">get</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">get</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="nx">smiles</span> <span class="o">=</span> <span class="nx">smiles</span><span class="p">.</span><span class="nf">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">smiles</span><span class="p">.</span><span class="nf">length</span><span class="p">()</span><span class="o">-</span><span class="mi">3</span><span class="p">)</span>

<span class="c1">// Four: create a CML document</span>
<span class="nx">propane</span> <span class="o">=</span> <span class="nx">cdk</span><span class="p">.</span><span class="nf">fromSMILES</span><span class="p">(</span><span class="nx">smiles</span><span class="p">);</span>
<span class="nx">js</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="dl">"</span><span class="s2">Molecule SMILES: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">smiles</span> <span class="o">+</span> <span class="dl">"</span><span class="se">\n</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Five: call the function</span>
<span class="nx">result</span> <span class="o">=</span> <span class="nx">func</span><span class="p">.</span><span class="nf">invokeSync</span><span class="p">(</span><span class="nx">propane</span><span class="p">.</span><span class="nf">getCML</span><span class="p">(),</span> <span class="mi">900000</span><span class="p">);</span>
<span class="nx">cmlReturned</span> <span class="o">=</span> <span class="nx">xmpp</span><span class="p">.</span><span class="nf">toString</span><span class="p">(</span><span class="nx">result</span><span class="p">);</span>

<span class="c1">// Six: tune the CML so that the Bioclipse CML reader is happy</span>
<span class="nx">cmlReturned</span> <span class="o">=</span> <span class="nx">cmlReturned</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="dl">"</span><span class="s2">xsd:int</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">xsd:integer</span><span class="dl">"</span><span class="p">)</span>

<span class="c1">// Seven: extract the Lipinski Rule of Five score</span>
<span class="nx">propertyList</span> <span class="o">=</span> <span class="nx">cml</span><span class="p">.</span><span class="nf">fromString</span><span class="p">(</span><span class="nx">cmlReturned</span><span class="p">);</span>
<span class="nx">value</span> <span class="o">=</span> <span class="nx">propertyList</span><span class="p">.</span><span class="nf">getPropertyElements</span><span class="p">().</span><span class="nf">get</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span>
  <span class="nf">getScalarElements</span><span class="p">().</span><span class="nf">get</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">getValue</span><span class="p">()</span>
<span class="nx">js</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="dl">"</span><span class="s2">Lipinski Rule of Five: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="dl">"</span><span class="se">\n</span><span class="dl">"</span><span class="p">)</span>

<span class="c1">// Eight: while at it, let's create a 2D and open in JChemPaint</span>
<span class="nx">service</span> <span class="o">=</span> <span class="nx">xmpp</span><span class="p">.</span><span class="nf">getService</span><span class="p">(</span><span class="dl">"</span><span class="s2">cdk.ws1.bmc.uu.se</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">service</span><span class="p">.</span><span class="nf">discoverSync</span><span class="p">(</span><span class="mi">5000</span><span class="p">);</span>
<span class="nx">service</span><span class="p">.</span><span class="nf">getFunctions</span><span class="p">();</span>
<span class="nx">func</span> <span class="o">=</span> <span class="nx">service</span><span class="p">.</span><span class="nf">getFunction</span><span class="p">(</span><span class="dl">"</span><span class="s2">generate2Dcoordinates</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">mol</span> <span class="o">=</span> <span class="nx">cdk</span><span class="p">.</span><span class="nf">fromSMILES</span><span class="p">(</span><span class="nx">smiles</span><span class="p">)</span>
<span class="nx">result</span> <span class="o">=</span> <span class="nx">func</span><span class="p">.</span><span class="nf">invokeSync</span><span class="p">(</span><span class="nx">mol</span><span class="p">.</span><span class="nf">getCML</span><span class="p">(),</span> <span class="mi">900000</span><span class="p">);</span>
<span class="nx">cmlReturned</span> <span class="o">=</span> <span class="nx">xmpp</span><span class="p">.</span><span class="nf">toString</span><span class="p">(</span><span class="nx">result</span><span class="p">);</span>
<span class="nx">mol2d</span> <span class="o">=</span> <span class="nx">cdk</span><span class="p">.</span><span class="nf">fromCml</span><span class="p">(</span><span class="nx">cmlReturned</span><span class="p">);</span>
<span class="nx">ui</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="nx">mol2d</span><span class="p">)</span>

<span class="c1">// Nine: oh, and a 3D model in Jmol</span>
<span class="nx">func</span> <span class="o">=</span> <span class="nx">service</span><span class="p">.</span><span class="nf">getFunction</span><span class="p">(</span><span class="dl">"</span><span class="s2">addExplicitHydrogens</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">result</span> <span class="o">=</span> <span class="nx">func</span><span class="p">.</span><span class="nf">invokeSync</span><span class="p">(</span><span class="nx">mol</span><span class="p">.</span><span class="nf">getCML</span><span class="p">(),</span> <span class="mi">900000</span><span class="p">);</span>
<span class="nx">mol</span> <span class="o">=</span> <span class="nx">cdk</span><span class="p">.</span><span class="nf">fromCml</span><span class="p">(</span><span class="nx">xmpp</span><span class="p">.</span><span class="nf">toString</span><span class="p">(</span><span class="nx">result</span><span class="p">));</span>
<span class="nx">func</span> <span class="o">=</span> <span class="nx">service</span><span class="p">.</span><span class="nf">getFunction</span><span class="p">(</span><span class="dl">"</span><span class="s2">generate3Dcoordinates</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">result</span> <span class="o">=</span> <span class="nx">func</span><span class="p">.</span><span class="nf">invokeSync</span><span class="p">(</span><span class="nx">mol</span><span class="p">.</span><span class="nf">getCML</span><span class="p">(),</span> <span class="mi">900000</span><span class="p">);</span>
<span class="nx">mol3d</span> <span class="o">=</span> <span class="nx">cdk</span><span class="p">.</span><span class="nf">fromCml</span><span class="p">(</span><span class="nx">xmpp</span><span class="p">.</span><span class="nf">toString</span><span class="p">(</span><span class="nx">result</span><span class="p">));</span>
<span class="nx">file</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">/Virtual/foo.cml</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">ui</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="nx">file</span><span class="p">)</span>
<span class="nx">cdk</span><span class="p">.</span><span class="nf">saveCML</span><span class="p">(</span><span class="nx">mol3d</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span>
<span class="nx">ui</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="nx">file</span><span class="p">)</span>
</code></pre></div></div>]]></content><author><name>Egon Willighagen</name></author><category term="bioclipse" /><category term="rdf" /><category term="xmpp" /><category term="inchikey:CRDAMVZIKSXKFV-YFVJMOTDSA-N" /><summary type="html"><![CDATA[Johannes asked me what the Lipinski Rule of Five for farnesol is, in reply to the matching XMPP cloud service. Thanx to DBPedia for providing a machine readable form of the wikipedia entry:]]></summary></entry><entry><title type="html">Bioclipse2 Scripting #3: XLogP calculatation using a XMPP CDK cloud service</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/04/15/bioclipse2-scripting-3-xlogp.html" rel="alternate" type="text/html" title="Bioclipse2 Scripting #3: XLogP calculatation using a XMPP CDK cloud service" /><published>2009-04-15T00:10:00+00:00</published><updated>2009-04-15T00:10:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/04/15/bioclipse2-scripting-3-xlogp</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/04/15/bioclipse2-scripting-3-xlogp.html"><![CDATA[<p>In preparation of the <a href="https://apps.sourceforge.net/mediawiki/cdk/index.php?title=CDK_Workshop_2009">CDK workshop</a> next week, here is a small
<a href="http://www.bioclipse.net/">Bioclipse2</a> script to calculate the XLogP value for a given <a href="http://www.opensmiles.org/">SMILES</a>,
using the a CDK-based <a href="http://chem-bla-ics.blogspot.com/search?q=xmpp">XMPP service</a>:</p>

<script src="https://gist.github.com/egonw/95987.js"></script>

<p>Earlier in this series:</p>

<ul>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2008/10/25/bioclipse2-scripting-1-from-smiles-to.html">Bioclipse2 Scripting #1: from SMILES to a UFF optimized structure in Jmol <i class="fa-solid fa-recycle fa-xs"></i></a></li>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2009/02/21/bioclipse2-scripting-2-searching.html">Bioclipse2 Scripting #2: searching PubChem <i class="fa-solid fa-recycle fa-xs"></i></a></li>
</ul>]]></content><author><name>Egon Willighagen</name></author><category term="xmpp" /><category term="cdk" /><category term="bioclipse" /><summary type="html"><![CDATA[In preparation of the CDK workshop next week, here is a small Bioclipse2 script to calculate the XLogP value for a given SMILES, using the a CDK-based XMPP service:]]></summary></entry><entry><title type="html">Autogenerating CML bindings for XMPP services with XMLBeans</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/03/14/autogenerating-cml-bindings-for-xmpp.html" rel="alternate" type="text/html" title="Autogenerating CML bindings for XMPP services with XMLBeans" /><published>2009-03-14T00:00:00+00:00</published><updated>2009-03-14T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/03/14/autogenerating-cml-bindings-for-xmpp</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/03/14/autogenerating-cml-bindings-for-xmpp.html"><![CDATA[<p>I blogged earlier about our efforts to create a better <a href="http://en.wikipedia.org/wiki/SOAP">SOAP</a>
service architecture, based on <a href="http://en.wikipedia.org/wiki/Jabber">XMPP</a>:</p>

<ul>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2009/01/21/details-behind-calling-xmpp-cloud.html">Details behind the “Calling XMPP cloud services from Taverna2” <i class="fa-solid fa-recycle fa-xs"></i></a></li>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2009/01/19/calling-xmpp-cloud-services-from.html">Calling XMPP cloud services from Taverna2 <i class="fa-solid fa-recycle fa-xs"></i></a></li>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2008/10/31/next-generation-asynchronous.html">Next generation asynchronous webservices <i class="fa-solid fa-recycle fa-xs"></i></a></li>
</ul>

<p>So, I set up XMPP services for QSAR descriptor calculation, 2D diagram and 3D geometry
calculations and a few more, using the <a href="http://cdk.sf.net/">CDK</a>.
<a href="http://en.wikipedia.org/wiki/Chemical_Markup_Language">Chemical Markup Language</a> has been my
primary choice for some 10 years now (see <a href="http://wwmm.ch.cam.ac.uk/blogs/murrayrust/?p=1241">Peter’s blog</a>)
as it allows me to do things I cannot do in other formats.</p>

<p>Now, our XMPP services publish themselves what data types the allow as input and what they output
in return. They do this by publishing XML Schema to describe the input and output types. My CDK
services use CML, so they return the CML schema. Johannes’ <a href="http://xws4j.sourceforge.net/">xws4j</a>
implementation of the <a href="http://xmpp.org/extensions/xep-0244.html">IO-DATA</a>
specification has an add on that can build bindings to the schema on the fly. Now, CML comes with
a good <a href="http://www.xom.nu/">XOM</a>-based binding (called <a href="http://wwmm.ch.cam.ac.uk/maven2/cml/cmlxom/">CMLXOM</a>)
so this is not strictly necessary, but for less common schemata it is worthwhile: you can always
create bindings for brand new schemata, for older versions, for whatever. Services can even
create their own local schemata, and people will still be able to easily use them. This is to me
a big plus for this architecture.</p>

<p>Anyway, while CMLXOM exists, we wanted to show that the on-the-fly creation of bindings works,
even for large schemata, such as CML. However, one of the older flavours had an small error in a
regular expression in a data type CML defines. Johannes therefore asked me to test building
bindings for the CML schema version used in my services. He adviced me to use scomp for this,
which is a command line utility around the <a href="http://xmlbeans.apache.org/">XMLBeans</a>
library used for the binding generation.</p>

<p>As I am running <a href="http://www.ubuntu.com/">Ubuntu</a>, I preferred installing
<a href="http://packages.ubuntu.com/jaunty/libxmlbeans-java">the packaged version</a> instead of installing
the binary provided by XMLBeans. Now, after I did this, I noticed that this .deb did not install
the scomp utility, so I filled a <a href="https://bugs.launchpad.net/ubuntu/+source/xmlbeans/+bug/342349">wishlist bug report</a>.
Earlier this week I already encountered another bug, but this package being Java, I had a good
idea on how to fix the bug.</p>

<p>And so I implemented my own wishlist. I’m sure there is room for improvement, as my .deb
packaging skills are a bit rusty (a very long time ago I have been in the Debian New Maintainers
queue, but by the time they solved the long queue delays, I was too occupied with other things.
Yes, this was a long time ago already :). Anyway, Ubuntu’s <a href="http://launchpad.net/">LaunchPad</a>
has a nice feature, called the <a href="http://launchpad.net/ubuntu/+ppas">Personal Package Archives</a>.
This service will, after I have finished hacking on the packaging specs in the famous <em>debian/</em>
folder and tested the <em>.debs</em> build from it, will rebuild it and put the resulting package up for
download.</p>

<p>Conclusion: a perfect opportunity to finally gives this a try. The learning curve was
surprisingly shallow, and the result can be seen in <a href="https://launchpad.net/~egonw/+archive/ppa">my personal package archive</a>:</p>

<p><img src="/assets/images/ppa.png" alt="" /></p>

<p>Now, you can easily imagine that I will soon work on packaging stuff I did in the past too, such
as update <a href="http://packages.ubuntu.com/jaunty/libcdk-java">libcdk-java</a> and now that OpenJDK in
main can run <a href="http://www.jmol.org/">Jmol</a> reasonably, finally package Jmol for main. I just hope
I remember my <a href="http://alioth.debian.org/">Alioth</a> account, so that I can properly contribute to
the <a href="http://alioth.debian.org/projects/debichem/">debichem</a> project.</p>

<p>Getting back to running <em>scomp</em> on the CML scheme, it works with one minor problem:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>scomp <span class="nt">-src</span> <span class="nb">.</span> <span class="nt">-d</span> <span class="nb">.</span>  cml.xsd
/home/egonw/tmp/cml/cml.xsd:10098:9: warning: p-props-correct.2.2: maxOccurs must be greater than or equal to 1.
Time to build schema <span class="nb">type </span>system: 1.792 seconds
Time to generate code: 3.297 seconds
Time to compile code: 9.658 seconds
</code></pre></div></div>

<p>The problem is reflected by line 10098 which goes like:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;xsd:sequence</span> <span class="na">minOccurs=</span><span class="s">"0"</span> <span class="na">maxOccurs=</span><span class="s">"0"</span><span class="nt">&gt;</span>
</code></pre></div></div>

<p>which can be traced down to line 23 in <a href="http://cml.svn.sf.net/viewvc/cml/schema2/trunk/elements/tableHeaderCell.xsd?revision=161&amp;view=markup">schema2/trunk/elements/tableHeaderCell.xsd</a>.
I filled a <a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2686810&amp;group_id=51361&amp;atid=463005">bug report about this</a>.</p>]]></content><author><name>Egon Willighagen</name></author><category term="cml" /><category term="java" /><category term="ubuntu" /><category term="xml" /><category term="xmpp" /><summary type="html"><![CDATA[I blogged earlier about our efforts to create a better SOAP service architecture, based on XMPP:]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chem-bla-ics.linkedchemistry.info/assets/images/ppa.png" /><media:content medium="image" url="https://chem-bla-ics.linkedchemistry.info/assets/images/ppa.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Details behind the “Calling XMPP cloud services from Taverna2”</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/01/21/details-behind-calling-xmpp-cloud.html" rel="alternate" type="text/html" title="Details behind the “Calling XMPP cloud services from Taverna2”" /><published>2009-01-21T00:00:00+00:00</published><updated>2009-01-21T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/01/21/details-behind-calling-xmpp-cloud</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/01/21/details-behind-calling-xmpp-cloud.html"><![CDATA[<p>On Monday I showed <a href="https://chem-bla-ics.linkedchemistry.info/2009/01/19/calling-xmpp-cloud-services-from.html">two screenshot <i class="fa-solid fa-recycle fa-xs"></i></a> showing our
<a href="https://chem-bla-ics.linkedchemistry.info/2009/01/19/calling-xmpp-cloud-services-from.html">new XMPP-based web/cloud services <i class="fa-solid fa-recycle fa-xs"></i></a> in action
inside <a href="http://taverna.sf.net/">Taverna</a>.</p>

<p>I promised details, but realize I have actually already posted a lot of them <a href="https://chem-bla-ics.linkedchemistry.info/2008/10/31/next-generation-asynchronous.html">in October <i class="fa-solid fa-recycle fa-xs"></i></a>:</p>

<blockquote>
  <p>Johannes ideas led to the <a href="http://xmpp.org/extensions/xep-0244.html">IO-DATA proposal</a> (XEP-0244), which is currently
marked experimental and being discussed on the ws-xmpp mailing list. He gathered a few people around him to get it going,
resulting in working stuff! Yeah!</p>
</blockquote>

<p><a href="http://miningdrugs.blogspot.com/">Joerg</a> <a href="http://friendfeed.com/e/a15e79ac-92ce-4b16-81d9-8f7b6ec1ea24/chem-bla-ics-Calling-XMPP-cloud-services-from/">asked</a>
<em>Could you post more results, what is it, why do we need it, e.g. why are you mentioning SOAP and cloud? Do not know enough to see the bonus right now.</em></p>

<p><strong>What is it?</strong> IO-DATA is a protocol on top of the XMPP protocol to allow machine-to-machine communication. Actually,
much like SOAP, RPC, and other platforms. How IO-DATA differs lies to some extend to the transport layer: instead of
using HTTP, it used the XMPP transport protocol, also used for Jabber chat clients. It basically allows clients like
Taverna to chat with services running elsewhere.</p>

<p><strong>Why do we need it?</strong> Most services run over HTTP, making them web services. This is convenient, because there is
much infrastructure around, like web browsers. REST services also take advantage of this. However, for heavy
computing this sometimes leads to problems. For example, routers are known to have time outs on HTTP connections.
To solve this, SOAP services often introduce a polling mechanism. IO-DATA takes a different approach. Instead of
having to ask all the time how a calculation is doing, you can just wait for the service to send you a message
when it is done. Instead of working around the lack of asynchronous aspects, IO-DATA introduces these in the protocol.</p>

<p>Other interesting features include that the IO-DATA integrates the interface formats for services into the service
itself, SOAP needs WSDL for this, and that it features service discovery via DISCO. The latter is done with SOAP
too, for example with UDDI and BioMoby. The latter also adds strong data typing for input and output of services.</p>

<p>IO-DATA addresses the data typing by allowing asking the service what XML Schema it uses for input and output.
While XML Schema has alternative, and which may be prefered in some situations, it does allow strong data typing
and supports <a href="http://friendfeed.com/e/2d322ac5-a5b9-4336-b421-fede0eb8e192/Hi-Guys-I-m-looking-for-an-exhaustive-resource-of/">a lot of formats in life sciences</a>
(which I’ll summarise soon).</p>

<p>Moreover, if there just happens not to be a suitable schemata around, you can just define one yourself, which can
be as simple as a single element wrapper around some custom text-based format. You worry about supporting many
formats? Well, no need. Johannes’ xws4j library, which I used for the Taverna plugin too, allows compiling a Java
binding code. Bioclipse’s script environment allows you do to this on the fly: you find a service, ask for the
schema, compile bindings for input and output, set up the input with the input binding, send it of to the service,
and use the output binding for convenient access to the computation results. Without having to reboot Bioclipse.
Isn’t that <strong>cool</strong>? Can your software do that? (See <a href="http://gist.github.com/22185">this example Gist</a>: the io
factory creates the binding).</p>

<p><strong>Why do I mention SOAP and the cloud?</strong> It should be clear from the above why I mention SOAP: it offer the same
functionality, but more conveniently, we think. I mention cloud here, to refer to cloud computing which is doing
computation on the cloud, which is a synonym for the internet (see
<a href="http://en.wikipedia.org/wiki/Cloud_computing">Cloud Computing @ Wikipedia</a>). Because it does
not use HTTP, we do not feel we can call it web service. Instead, cloud computing is a more general term, not
tied to any particular architecture. IO-DATA is just one possible architecture, one we think is promising for
life science applications.</p>]]></content><author><name>Egon Willighagen</name></author><category term="xmpp" /><category term="taverna" /><summary type="html"><![CDATA[On Monday I showed two screenshot showing our new XMPP-based web/cloud services in action inside Taverna.]]></summary></entry><entry><title type="html">Calling XMPP cloud services from Taverna2</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/01/19/calling-xmpp-cloud-services-from.html" rel="alternate" type="text/html" title="Calling XMPP cloud services from Taverna2" /><published>2009-01-19T00:10:00+00:00</published><updated>2009-01-19T00:10:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/01/19/calling-xmpp-cloud-services-from</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/01/19/calling-xmpp-cloud-services-from.html"><![CDATA[<p>SMILES (<em>CCC</em>) in, mass out. Yes, we can now call XMPP/IO-DATA cloud services with Taverna2 :)</p>

<p><img src="/assets/images/t1.png" alt="" /></p>

<p><img src="/assets/images/t2.png" alt="" /></p>

<p>Details will follow, but here’s the <a href="http://github.com/egonw/xws-taverna/tree/master">source code</a>.</p>]]></content><author><name>Egon Willighagen</name></author><category term="taverna" /><category term="xmpp" /><summary type="html"><![CDATA[SMILES (CCC) in, mass out. Yes, we can now call XMPP/IO-DATA cloud services with Taverna2 :)]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chem-bla-ics.linkedchemistry.info/assets/images/t1.png" /><media:content medium="image" url="https://chem-bla-ics.linkedchemistry.info/assets/images/t1.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Next generation asynchronous webservices #2</title><link href="https://chem-bla-ics.linkedchemistry.info/2008/11/04/next-generation-asynchronous.html" rel="alternate" type="text/html" title="Next generation asynchronous webservices #2" /><published>2008-11-04T00:00:00+00:00</published><updated>2008-11-04T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2008/11/04/next-generation-asynchronous</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2008/11/04/next-generation-asynchronous.html"><![CDATA[<p>Getting back to some webservice stuff (see <a href="https://chem-bla-ics.linkedchemistry.info/2008/10/31/next-generation-asynchronous.html">part #1 of this series <i class="fa-solid fa-recycle fa-xs"></i></a>)…
actually, I’ll use <em>cloud service</em> from now on, since <em>web service</em> is reserved for SOAP/WSDL (see
<a href="https://chem-bla-ics.linkedchemistry.info/2008/11/03/embrace-workshop-in-uppsala.html">my EMBRACE presentation <i class="fa-solid fa-recycle fa-xs"></i></a>).
Let me present this bit of JavaScript I just ran in Bioclipse2:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">xws</span><span class="p">.</span><span class="nf">connect</span><span class="p">();</span>
<span class="nx">service</span> <span class="o">=</span> <span class="nx">xws</span><span class="p">.</span><span class="nf">getService</span><span class="p">(</span><span class="dl">"</span><span class="s2">cdk.ws1.bmc.uu.se</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">service</span><span class="p">.</span><span class="nf">discoverSync</span><span class="p">(</span><span class="mi">9000</span><span class="p">);</span>
<span class="nx">service</span><span class="p">.</span><span class="nf">getFunctions</span><span class="p">();</span>
<span class="nx">f</span> <span class="o">=</span> <span class="nx">service</span><span class="p">.</span><span class="nf">getFunction</span><span class="p">(</span><span class="dl">"</span><span class="s2">calculateMass</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">ios</span> <span class="o">=</span> <span class="nx">f</span><span class="p">.</span><span class="nf">getIoSchemataSync</span><span class="p">(</span><span class="mi">9000</span><span class="p">);</span>
<span class="nx">iof</span> <span class="o">=</span> <span class="nx">xws</span><span class="p">.</span><span class="nf">getIoFactory</span><span class="p">(</span><span class="nx">ios</span><span class="p">);</span>
<span class="nx">smiDoc</span> <span class="o">=</span> <span class="nx">iof</span><span class="p">.</span><span class="nf">createSmilesDocument</span><span class="p">();</span>
<span class="nx">smiDoc</span><span class="p">.</span><span class="nf">setSmiles</span><span class="p">(</span><span class="dl">"</span><span class="s2">CCC</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">result</span> <span class="o">=</span> <span class="nx">f</span><span class="p">.</span><span class="nf">invokeSync</span><span class="p">(</span><span class="nx">smiDoc</span><span class="p">.</span><span class="nf">toString</span><span class="p">(),</span> <span class="mi">9000</span><span class="p">);</span>
<span class="nx">obj</span> <span class="o">=</span> <span class="nx">iof</span><span class="p">.</span><span class="nf">getOutputObject</span><span class="p">(</span><span class="nx">result</span><span class="p">);</span>
<span class="nf">print</span><span class="p">(</span><span class="dl">"</span><span class="s2">Mass: </span><span class="dl">"</span> <span class="o">+</span>  <span class="nx">obj</span><span class="p">.</span><span class="nf">getStringValue</span><span class="p">())</span>
</code></pre></div></div>

<p>At first, it might look a bit verbose to just calculate the mass of a molecule, and it is, and it is not even written in XML. Hahahaha</p>

<p>Anyway, the code rocks, thanx to Johannes’ great work on his <a href="https://sourceforge.net/projects/xws4j/">xws4j</a> library! I’ll explain
the script. The first line gets Bioclipse online using a <em>Jabber</em> account, which you set via Bioclipse’ preferences pages. The next few
lines allows you to connect to a cloud service, this one running on <code class="language-plaintext highlighter-rouge">ws1.bmc.uu.se</code> and called <code class="language-plaintext highlighter-rouge">cdk</code>. With the <code class="language-plaintext highlighter-rouge">getFunctions()</code> method
we query which functions are available, called ports in WDSL if not mistaken, from which we pick the <code class="language-plaintext highlighter-rouge">calculateMass</code> one.</p>

<p>And then the action joins in. One nice feature of the <a href="http://xmpp.org/extensions/xep-0244.html">IO-DATA proposal</a> is that the function
itself defines the XML Schema it uses for input and output, and does not rely on WDSL to do that (or maybe recent SOAP specs allows that
too). So, we query the function for its schemata, and the xws4j library then something funky happens: we order the library to create a
data model on the fly for this service! From this we get a Java data model for the service. This allows us to use <code class="language-plaintext highlighter-rouge">createSmilesDocument()</code>
and <code class="language-plaintext highlighter-rouge">setSmiles()</code>. That’s function-specific stuff!</p>

<p>Of course, we do not have to do that. For example, the second function I wrote (<code class="language-plaintext highlighter-rouge">generate3Dcoordinates</code>) eats and spits CML, and I’d
rather rely on CMLDOM or CDK as data model then. But more on that later…</p>

<p>The Bioclipse xws4j plugin actually puts the data model in my workspace, so that I can easily introspect the API:</p>

<p><img src="/assets/images/autogeneration.png" alt="" /></p>

<p>The last three lines invoke the function (synchronously, as it’s cheap), and get the mass from the function output. BTW, I should
stress that a function does not require any specific implementation regarding synchronous or asynchronous calls. You write <strong>one</strong>
function, and can call it in either way you like. The library hides all IO-DATA details around that.</p>]]></content><author><name>Egon Willighagen</name></author><category term="xmpp" /><category term="java" /><category term="bioclipse" /><category term="web" /><summary type="html"><![CDATA[Getting back to some webservice stuff (see part #1 of this series )… actually, I’ll use cloud service from now on, since web service is reserved for SOAP/WSDL (see my EMBRACE presentation ). Let me present this bit of JavaScript I just ran in Bioclipse2:]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chem-bla-ics.linkedchemistry.info/assets/images/autogeneration.png" /><media:content medium="image" url="https://chem-bla-ics.linkedchemistry.info/assets/images/autogeneration.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Next generation asynchronous webservices</title><link href="https://chem-bla-ics.linkedchemistry.info/2008/10/31/next-generation-asynchronous.html" rel="alternate" type="text/html" title="Next generation asynchronous webservices" /><published>2008-10-31T00:00:00+00:00</published><updated>2008-10-31T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2008/10/31/next-generation-asynchronous</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2008/10/31/next-generation-asynchronous.html"><![CDATA[<p>Johannes joined a <a href="http://wiki.bioclipse.net/index.php?title=Outcome_of_the_Bioclipse_autumn_workshop_2006">Bioclipse Workshop</a> a long time
ago, and introduced the participants to the idea of using <a href="http://xmpp.org/">XMPP</a> (aka Jabber) for asynchronous web services.
<a href="http://en.wikipedia.org/wiki/SOAP_(protocol)">SOAP</a> is commonly user to run webservices over <a href="http://en.wikipedia.org/wiki/HTTP">HTTP</a>,
but via (SMTP) email and XMPP is possible too (see <a href="http://xmpp.org/extensions/xep-0072.html">SOAP over XMPP</a>). Using HTTP as transport
layer has problems. The biggest problem, is possibly that HTTP connections are timed out, e.g. by intermediate router. This makes it
rather unsuited for long running jobs. Workarounds are easy to come up with, and <em>polling</em> is a common solution.</p>

<p>Johannes ideas solve this limitation by using the general XMPP protocol for chatting:</p>

<dl>
<dt><span style="color:red; font-weight: bold">client</span></dt>
  <dd>he, can you do something for me?</dd>
<dt><span style="color:darkgreen; font-weight: bold">service</span></dt>
  <dd>sure, I can do <b>generate3Dcoordinates</b> and <b>generateSMILES</b>.</dd>
<dt><span style="color:red; font-weight: bold">client</span></dt>
  <dd>ah, nice! what input does <b>generate<a href="http://www.opensmiles.org/">SMILES</a></b> take? and the output?</dd>
<dt><span style="color:darkgreen; font-weight: bold">service</span></dt>
  <dd>input: <a href="http://en.wikipedia.org/wiki/Chemical_Markup_Language">CML</a>, output a simple string.</dd>
<dt><span style="color:red; font-weight: bold">client</span></dt>
  <dd>ok, here's the CML</dd>
<dt><span style="color:darkgreen; font-weight: bold">service</span></dt>
  <dd>I'm done now. sorry that it took 10 minutes, but I'm running Vista...</dd>
<dt><span style="color:red; font-weight: bold">client</span></dt>
  <dd>excellent, please send me the results</dd>
<dt><span style="color:darkgreen; font-weight: bold">service</span></dt>
  <dd>ok, here is the SMILES for <a href="http://en.wikipedia.org/wiki/Lacosamide">lacosamide</a>: <span class="chem:smiles">CC(=O)N[C@H](COC)C(=O)NCC1=CC=CC=C1</span></dd>
</dl>

<p>Well, the important bit is in the last line. A job may take lone, even on clusters. The client might have to reboot meanwhile (possibly
because of critical security updates)… the <em>service</em> will just continue, and send you a message when done. If you just happen to be
offline, it will send a message when you are back online.</p>

<p>Johannes ideas led to the <a href="http://xmpp.org/extensions/xep-0244.html">IO-DATA proposal</a> (XEP-0244), which is currently marked experimental
and being discussed on the <a href="http://mail.jabber.org/mailman/listinfo/ws-xmpp">ws-xmpp</a> mailing list. He gathered a few people around
him to get it going, resulting in working stuff! Yeah!</p>

<h2 id="chemistry-development-kit-xws">Chemistry Development Kit XWS</h2>

<p>Besides contributing to the proposal, I am also involved in this project by writing XMPP-webservices, for the
<a href="https://cdk.github.io/">CDK</a>. This brings me to <a href="https://cdk.svn.sourceforge.net/svnroot/cdk/cdk-xws/trunk@12888">cdk-xws</a>, which is
the project to bring CDK functionality online as webservices using IO-DATA.</p>

<p><img src="/assets/images/cdkxwsPsi.png" alt="" /></p>

<p>This shows three nodes, the first being the CDK service, with two functions, of which I only implemented one yet.</p>

<p>For the curious, this is what the XMPP messages look like:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;iq</span> <span class="na">from=</span><span class="s">"egonw@ws1.bmc.uu.se/home"</span>
    <span class="na">id=</span><span class="s">"JSO-0.12.5-6"</span>
    <span class="na">to=</span><span class="s">"cdk.ws1.bmc.uu.se"</span>
    <span class="na">type=</span><span class="s">"set"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;command</span> <span class="na">xmlns=</span><span class="s">"http://jabber.org/protocol/commands"</span>
           <span class="na">action=</span><span class="s">"execute"</span>
           <span class="na">node=</span><span class="s">"calculateMass"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;iodata</span> <span class="na">xmlns=</span><span class="s">"urn:xmpp:tmp:io-data"</span>
            <span class="na">type=</span><span class="s">"input"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;in&gt;</span>
        <span class="nt">&lt;smiles</span> <span class="na">xmlns=</span><span class="s">"urn:xws:cdk:input"</span><span class="nt">&gt;</span>CCC<span class="nt">&lt;/smiles&gt;</span>
      <span class="nt">&lt;/in&gt;</span>
    <span class="nt">&lt;/iodata&gt;</span>
  <span class="nt">&lt;/command&gt;</span>
<span class="nt">&lt;/iq&gt;</span>
<span class="nt">&lt;iq</span> <span class="na">from=</span><span class="s">"cdk.ws1.bmc.uu.se"</span>
    <span class="na">id=</span><span class="s">"JSO-0.12.5-6"</span>
    <span class="na">to=</span><span class="s">"egonw@ws1.bmc.uu.se/home"</span>
    <span class="na">type=</span><span class="s">"result"</span>
    <span class="na">xml:lang=</span><span class="s">"en"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;command</span> <span class="na">xmlns=</span><span class="s">"http://jabber.org/protocol/commands"</span>
           <span class="na">node=</span><span class="s">"calculateMass"</span>
           <span class="na">sessionid=</span><span class="s">"XWS-1"</span>
           <span class="na">status=</span><span class="s">"completed"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;iodata</span> <span class="na">xmlns=</span><span class="s">"urn:xmpp:tmp:io-data"</span>
            <span class="na">type=</span><span class="s">"output"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;out&gt;</span>
        <span class="nt">&lt;mass&gt;</span>36.032207690364004<span class="nt">&lt;/mass&gt;</span>
      <span class="nt">&lt;/out&gt;</span>
    <span class="nt">&lt;/iodata&gt;</span>
    <span class="nt">&lt;note</span> <span class="na">type=</span><span class="s">"info"</span><span class="nt">&gt;</span>Done<span class="nt">&lt;/note&gt;</span>
  <span class="nt">&lt;/command&gt;</span>
<span class="nt">&lt;/iq&gt;</span>
</code></pre></div></div>]]></content><author><name>Egon Willighagen</name></author><category term="bioclipse" /><category term="xmpp" /><category term="soap" /><category term="http" /><category term="inchikey:VPPJLAIAVCUEMN-GFCCVEGCSA-N" /><summary type="html"><![CDATA[Johannes joined a Bioclipse Workshop a long time ago, and introduced the participants to the idea of using XMPP (aka Jabber) for asynchronous web services. SOAP is commonly user to run webservices over HTTP, but via (SMTP) email and XMPP is possible too (see SOAP over XMPP). Using HTTP as transport layer has problems. The biggest problem, is possibly that HTTP connections are timed out, e.g. by intermediate router. This makes it rather unsuited for long running jobs. Workarounds are easy to come up with, and polling is a common solution.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chem-bla-ics.linkedchemistry.info/assets/images/cdkxwsPsi.png" /><media:content medium="image" url="https://chem-bla-ics.linkedchemistry.info/assets/images/cdkxwsPsi.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>