<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Helixsoft</title>
	<atom:link href="http://www.helixsoft.nl/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.helixsoft.nl/blog</link>
	<description>Martijn van Iersel&#039;s blog on bioinformatics and open source software development</description>
	<lastBuildDate>Sun, 02 Dec 2012 23:03:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>More about identifiers.org URI&#8217;s for BioPAX</title>
		<link>http://www.helixsoft.nl/blog/?p=560</link>
		<comments>http://www.helixsoft.nl/blog/?p=560#comments</comments>
		<pubDate>Sun, 02 Dec 2012 22:21:00 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[biopax]]></category>
		<category><![CDATA[identifiers]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=560</guid>
		<description><![CDATA[In a previous post, I explained that a BioPAX document is really an RDF graph. And with that in mind, you can do interesting things like inferring identifiers.org URI&#8217;s using a SPARQL CONSTRUCT query. What I didn&#8217;t explain is that, after adding those new inferences, the result is no longer valid BioPAX. RDF gives you [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://www.helixsoft.nl/blog/?p=516">previous post</a>, I explained that a BioPAX document is really an RDF graph. And with that in mind, you can do interesting things like inferring identifiers.org URI&#8217;s using a SPARQL CONSTRUCT query.</p>
<p>What I didn&#8217;t explain is that, after adding those new inferences, the result is no longer valid BioPAX. RDF gives you lots of freedom, as well as lots of rope to hang yourself with. BioPAX has some restrictions in place that are necessary for exchange of pathway data.</p>
<p>Let me explain in more detail. Take a look at the BioPAX snippet below. This snippet represents more or less the same information as the <a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/11/identifiers3.jpeg">first figure</a> from my previous post. It represents Protein186961, with a <i>bp:xref</i> property pointing to id4, which is a UnificationXref with <i>bp:db</i> property FlyBase and <i>bp:id</i> property FBgn0034356.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:ProteinReference</span> <span style="color: #000066;">rdf:about</span>=<span style="color: #ff0000;">&quot;Protein186961&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:xref</span> <span style="color: #000066;">rdf:resource</span>=<span style="color: #ff0000;">&quot;id4&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:ProteinReference<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:UnificationXref</span> <span style="color: #000066;">rdf:about</span>=<span style="color: #ff0000;">&quot;id4&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:id</span> <span style="color: #000066;">rdf:datatype</span>=<span style="color: #ff0000;">&quot;xsd:string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>FBgn0034356<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:db</span> <span style="color: #000066;">rdf:datatype</span>=<span style="color: #ff0000;">&quot;xsd:string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>FlyBase<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:db<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:UnificationXref<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>After the SPARQL CONSTRUCT query, the newly inferred URI&#8217;s are added back to the graph. The results looks more or less like this:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:ProteinReference</span> <span style="color: #000066;">rdf:about</span>=<span style="color: #ff0000;">&quot;Protein186961&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:xref</span> <span style="color: #000066;">rdf:resource</span>=<span style="color: #ff0000;">&quot;id4&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:xref</span> <span style="color: #000066;">rdf:resource</span>=<span style="color: #ff0000;">&quot;http://identifiers.org/flybase/FBgn0034356&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:ProteinReference<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>As you can see, Protein186961 now has <strong>two</strong> <i>bp:xref</i> properties. This kind of duplication may cause problems for software. Furthermore, the new <i>bp:xref</i> property doesn&#8217;t have the correct type (UnificationXref), and it doesn&#8217;t have values for <i>bp:db</i> and <i>bp:id</i>, because our CONSTRUCT query didn&#8217;t say anything about them. Yet well-behaving pathway software might quite reasonably be looking for that information. </p>
<p>Running inferences on an RDF store gives you lots of power, but it&#8217;s not necessarily good for standardization. If you are running a large pathway database, you might want to enforce some restrictions. The online <a href="http://www.biopax.org/biopax-validator/check.html">BioPAX validator</a> created by Igor Rodchenkov <i>et al.</i> is the gold standard for producing correct, manageable BioPAX. Running it on the second snippet leads to this error:</p>
<p><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/12/bpvalidator-error.png"><img class="aligncenter size-full wp-image-562" title="bpvalidator-error" src="http://www.helixsoft.nl/blog/wp-content/uploads/2012/12/bpvalidator-error.png" alt="" width="583" height="163" /></a></p>
<p>But what if you want to have Identifiers.org URI&#8217;s, but you also want to keep your BioPAX valid? It&#8217;s easy &#8211; the UnificationXref in the first snippet used <i>id4</i> as resource identifier. Id4 is just an arbitrary value &#8211; we can easily replace that with something better. But instead of running a construct query, it&#8217;s a matter of modifying your BioPAX generating code to write out identifiers.org URI&#8217;s where possible. The result could look like the snippet below. Admittedly, the result has a bit of redundancy, with the two references to FBgn0034356. But that is a small price to pay. The new version has identifiers.org goodness ready for SPARQL integration magic, yet it&#8217;s still standard compliant so that mundane software can cope with it too.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:ProteinReference</span> <span style="color: #000066;">rdf:about</span>=<span style="color: #ff0000;">&quot;Protein186961&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:xref</span> <span style="color: #000066;">rdf:resource</span>=<span style="color: #ff0000;">&quot;http://identifiers.org/flybase/FBgn0034356&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:ProteinReference<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:UnificationXref</span> <span style="color: #000066;">rdf:about</span>=<span style="color: #ff0000;">&quot;http://identifiers.org/flybase/FBgn0034356&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:id</span> <span style="color: #000066;">rdf:datatype</span>=<span style="color: #ff0000;">&quot;xsd:string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>FBgn0034356<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bp:db</span> <span style="color: #000066;">rdf:datatype</span>=<span style="color: #ff0000;">&quot;xsd:string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>FlyBase<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:db<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bp:UnificationXref<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=560</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inferring identifiers.org URIs for BioPAX</title>
		<link>http://www.helixsoft.nl/blog/?p=516</link>
		<comments>http://www.helixsoft.nl/blog/?p=516#comments</comments>
		<pubDate>Fri, 16 Nov 2012 15:58:12 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[biopax]]></category>
		<category><![CDATA[identifiers]]></category>
		<category><![CDATA[identifiers.org]]></category>
		<category><![CDATA[rdf]]></category>
		<category><![CDATA[semantic web]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[triples]]></category>
		<category><![CDATA[virtuoso]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=516</guid>
		<description><![CDATA[Here is a useful data-integration trick involving BioPAX and identifiers.org. BioPAX is a pathway exchange format &#8211; it is known for being somewhat complicated, but at the very basic level it&#8217;s simple: BioPAX is made up of subject-predicate-object triples. Together these triples form a graph. Thus, a BioPAX document is nothing more than a large [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a useful data-integration trick involving <a href="http://www.biopax.org">BioPAX</a> and <a href="http://identifiers.org">identifiers.org</a>.</p>
<p>BioPAX is a pathway exchange format &#8211; it is known for being somewhat complicated, but at the very basic level it&#8217;s simple: BioPAX is made up of subject-predicate-object triples. Together these triples form a graph. Thus, a BioPAX document is nothing more than a large graph. Here is a small fragment to illustrate:</p>
<p><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/11/identifiers3.jpeg"><img class="aligncenter size-large wp-image-527" title="identifiers3" src="http://www.helixsoft.nl/blog/wp-content/uploads/2012/11/identifiers3-1024x776.jpg" alt="" width="450" height="341" /></a></p>
<p>Here you see a particular BiochemicalReaction, which is catalysed by a particular Protein <small><a href="#footnote1">[1]</a></small>. Both the BiochemicalReaction and the Protein have a number acting as local identifiers &#8211; they are quite useless outside this BioPAX document. To identify this particular protein in the wild, we must look at its Xref, which refers to a database (FlyBase), and an identifier (FBgn0034356). <small><a href="#footnote2">[2]</a></small></p>
<p>You have to imagine that this graph is much larger than just the snippet shown above, and contains lots of interesting information. And we can make it even more interesting by fetching information from external databases about this protein, and integrate that into this graph.</p>
<p>The trouble is that the Xref is stored in two nodes: one for the identifier and one for the database. This makes data integration cumbersome, requiring comparison of two nodes at the same time. It would be more efficient to merge this data into a single node.</p>
<p>One possible solution is to simply concatenate the database and identifier and put that into a new node. For example, here is just one way we could do that:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">FlyBase~FBgn0034356</div></div>
<p>But we can do even better: if we combine the two nodes into a single URI (Uniform Resource Identifier) from identifiers.org, we gain the added advantage of having a resolvable URI. That means that the identifier is also a link which you can open in a browser, which is just incredibly neat.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http://identifiers.org/flybase/FBgn0034356</div></div>
<p>(Go ahead and open it: <a href="http://identifiers.org/flybase/FBgn0034356">http://identifiers.org/flybase/FBgn0034356</a>).</p>
<p>We can create these URIs directly in the triple store using a SPARQL CONSTRUCT query. SPARQL is a query language for graphs &#8211; it looks for patterns in the graph, and in the case of CONSTRUCT queries, new triples are generated which can be added back into the graph. The following query generates identifiers.org URIs for Uniprot Xrefs. Unfortunately this query only works on the virtuoso triple store, because of the whole &#8220;bif:sprintf&#8230;&#8221; incantation which is non-standard SPARQL. Presumably equivalent functions exist for other triple stores.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CONSTRUCT {<br />
&nbsp; &nbsp; ?x BP:xref `bif:sprintf_iri (<br />
&nbsp; &nbsp; &quot;http://identifiers.org/uniprot/%s&quot;, ?id)`<br />
}<br />
WHERE {<br />
&nbsp; &nbsp;?x BP:xref ?blank .<br />
&nbsp; &nbsp;?blank BP:id ?id .<br />
&nbsp; &nbsp;?blank BP:db &quot;UniProt&quot;^^xsd:string<br />
}<br />
LIMIT 10</div></div>
<p>If you try that, you will get a set of new triples, which looks like this when viewed in the browser:</p>
<blockquote><p>
xsdh	http://www.w3.org/2001/XMLSchema#<br />
n2	http://biocyc.org/biopax/biopax-level3#<br />
n4	http://identifiers.org/uniprot/<br />
n3	http://www.biopax.org/release/biopax-level3.owl#<br />
rdf	http://www.w3.org/1999/02/22-rdf-syntax-ns#</p>
<p>Subject Item<br />
    n2:Protein220382<br />
n3:xref<br />
    <a href="http://identifiers.org/uniprot/P23884">n4:P23884</a> </p>
<p>Subject Item<br />
    n2:Protein193864<br />
n3:xref<br />
    <a href="http://identifiers.org/uniprot/Q9W330">n4:Q9W330</a>
</p></blockquote>
<p>If you want you can try for yourself on our live triple store with preloaded BioPAX data. Here is our <a href="http://fly.cloud.generalbioinformatics.com/?page_id=25">live sparql endpoint</a>. If you scroll down on that page you see a few more SPARQL queries to try. To learn more, please see <a href="http://fly.cloud.generalbioinformatics.com/data/cloud2/GB_SPINNOSS_final.pdf">my presentation of the SPIN-OSS conference</a></p>
<p>
<small><br />
Footnotes:</p>
<ul>
<li id="footnote1">[1] In standard bioPAX, there is a Catalysis object between a Protein and a BiochemicalReaction. The controlledBy relation must be inferred.</li>
<li id="footnote2">[2] Ignore for the moment that we&#8217;re using a gene identifier for a protein</li>
</ul>
<p></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=516</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ports, tunnels, request types and virtual hosts</title>
		<link>http://www.helixsoft.nl/blog/?p=425</link>
		<comments>http://www.helixsoft.nl/blog/?p=425#comments</comments>
		<pubDate>Mon, 27 Aug 2012 22:31:03 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=425</guid>
		<description><![CDATA[The internet is surely the most incredible machine on earth. For one thing, I use it to share code with other developers, using a program called subversion. But the other day, subversion was being blocked by a firewall. Fixing that problem was a great opportunity to get my hands dirty with the nuts and bolts [...]]]></description>
			<content:encoded><![CDATA[<p>The internet is surely the most incredible machine on earth. For one thing, I use it to share code with other developers, using a program called <a href="http://subversion.tigris.org/">subversion</a>. But the other day, subversion was being blocked by a firewall. Fixing that problem was a great opportunity to get my hands dirty with the nuts and bolts of the internet, and I learned a lot too, which I&#8217;d like to share here.</p>
<p>First let me explain about <b>ports</b>, because it will be important later. An internet connection always involves two programs: one is the <b>client</b>, running on the local machine, and the other is the <b>server</b>, running on the remote machine. For example, the client could be Firefox on the wife&#8217;s laptop, and the server could be Apache serving <a href="http://www.cuteoverload.com">images of kittens</a>. </p>
<p>Now imagine that the remote machine had both a web server and an email server installed. To distinguish the traffic for each program they are assigned a port number. The web server is listening on port 80, which is the conventional port for web traffic. The email server is listening on port 25, and both happily co-operate on the same machine <a href="#footnote-1">[1]</a>. </p>
<p><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/blog1.png"><img src="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/blog1.png" alt="" title="Server programs listening on different ports" width="400" height="268" class="aligncenter size-full wp-image-440" /></a></p>
<p>The client and server must speak the same language, or <b>protocol</b>, to communicate. There is a whole alphabet soup of protocols such as HTTP, FTP, SMTP&#8230; Not surprisingly most of them end with the letter P. The most common one is HTTP, being the protocol used for web browsing. This protocol dictates that the browser should start by sending a <b>request</b>. This can be one of several <b>request types</b>, e.g. GET to request the latest kitty pictures, and POST to upload new ones.</p>
<p>Firewalls are designed to let through the ordinary, and block the unusual. Since HTTP is so common, firewalls normally let it go through unharmed. Subversion also uses HTTP, but still it was being blocked <a href="#footnote-3">[3]</a>. This is because subversion uses rather weird HTTP request types, such as PROPFIND <a href="#footnote-4">[4]</a>. This is legal according to the protocol, but it&#8217;s unusual. Firewalls find that suspicious. It&#8217;s not because subversion is trying to be funny. Honestly, I think that blocking PROPFIND is just the default setting on popular firewall software, and the sysadmins don&#8217;t bother to change the defaults. After all, Subversion is only used by developers, who make up just a fraction of the population, and they are geeks anyway, so nothing to worry about.</p>
<p><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/blog2.png"><img src="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/blog2.png" alt="" title="A subversion connection was blocked by a firewall" width="399" height="244" class="aligncenter size-full wp-image-441" /></a></p>
<p>So what to do? Well luckily, I had an account on this particular server for a program called SSH, and with that I set up a tunnel to bypass the firewall. Here is how I did that:</p>
<p>First, I instructed subversion to send its requests to <b>localhost</b>, instead of the subversion server, and to use port 7654 instead of 80 <a href="#footnote-2">[2]</a>. So instead of doing a subversion checkout from <font face="courier">http://svn.bigcat.unimaas.nl/bridgedb/trunk</font>, I was doing it from <font face="courier">http://localhost:7654/bridgedb/trunk</font>. </p>
<p>What is localhost? Localhost corresponds to IP address 127.0.0.1, which is a special address that sends messages right back to where they came from. Every computer, no matter how simple, can act as a server, as long as it has suitable software listening on a port. What would be the use of that? The messages are already at localhost, so there what is the point in sending them there? As mentioned above, internet communication is always between two programs. They communicate even if they are written in very different programming languages, as long as they follow the right protocol. Connecting over localhost is sometimes the easiest way to get two very different pieces of software to talk to each other. </p>
<p>So I instructed SSH to set up a <b>tunnel</b>. What this means is that SSH is listening to port 7654, where it was receiving all messages from subversion. SSH does not interpret these messages, it just encrypts them, and forwards them over the internet. The unusual PROPFIND requests are now obscured by encryption. The messages arrive at the remote server on port 22, where another copy of SSH decrypts the messages and passes them on again. They continue the journey to localhost (from the servers point of view), on port 80, where the subversion messages were expected to arrive in the first place. The beauty of this is that in spite of all the redirection, both the subversion client and server are oblivious to what is going on, they just send and receive messages as usual.</p>
<p><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/blog3.png"><img src="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/blog3.png" alt="" title="situation with SSH tunnel in place" width="400" height="251" class="aligncenter size-full wp-image-442" /></a></p>
<p>To make this trick work on windows, you can configure <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">Putty</a>, the windows variant of SSH:<br />
<a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/svn-tunnel.png"><img src="http://www.helixsoft.nl/blog/wp-content/uploads/2012/08/svn-tunnel.png" alt="" title="svn-tunnel" width="466" height="447" class="aligncenter size-full wp-image-433" /></a><br />
On linux, it&#8217;s a simple matter of typing</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ssh -L 7654:localhost:80 username@svn.example.com</div></div>
<p>Except that in my case&#8230; it still wasn&#8217;t working. </p>
<p>The problem is that this particular server is actually hosting two websites: <a href="http://bridgedb.org">http://bridgedb.org</a> and <a href="http://svn.bigcat.unimaas.nl">http://svn.bigcat.unimaas.nl</a>. This server was configured with a technique called <b>virtual hosting</b>, which is useful when you want to host several small websites. Putting each on a separate computer would be very inefficient. With virtual hosting, you can bundle multiple sites on a single server. </p>
<p>The web server listening on port 80 looks at the incoming requests to decide which of the virtual websites is going to handle the request. Normally, a subversion request for the page <font face="courier">/bridgedb/trunk</font> on the server <font face="courier">svn.bigcat.unimaas.nl</font> looks like this:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROPFIND http://svn.bigcat.unimaas.nl/bridgedb/trunk</div></div>
<p>But because of the way I set things up earlier, subversion <i>thinks</i> that it is talking to localhost. Even though the messages are forwarded to the server correctly due to SSH, when they arrive, the requests still look something like:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROPFIND http://localhost:7654/bridgedb/trunk</div></div>
<p>Which doesn&#8217;t help the web server to decide if this request should be served by <a href="http://bridgedb.org">bridgedb.org</a> or <a href="http://svn.bigcat.unimaas.nl">svn.bigcat.unimaas.nl</a></p>
<p>So what to do? Next, I tricked my local computer into thinking that svn.bigcat.unimaas.nl and localhost are the same, by adding the following line to the <a href="http://en.wikipedia.org/wiki/Hosts_%28file%29">hosts file</a>, which is in <font face="courier">C:\Windows\System32\drivers\etc</font> on windows, (you need to open notepad with sysadmin rights in order to be able to edit the file) or in <font face="courier">/etc/hosts</font> on linux.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">127.0.0.1 &nbsp; svn.bigcat.unimaas.nl</div></div>
<p>This tells the operating system, that when you make a request for svn.bigcat.unimaas.nl, it should really be sent to 127.0.0.1. Which coincidentally is the IP address for localhost. This means that I can configure subversion to send to svn.bigcat.unimaas.nl, even though svn.bigcat.unimaas.nl is really localhost due to the hosts file, except that localhost really is svn.bigcat.unimaas.nl due to the SSH tunnel.</p>
<p>And finally it works!</p>
<p><small></p>
<li id="footnote-1">[1] These port numbers are just conventions, and we could configure each piece of software to use a different port if we wanted. <a href="http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers">WikiPedia has a long list of conventional port numbers</a></li>
<li id="footnote-2">[2] Why port 7654? For no reason other than that it was free on my machine. (In fact I could have used port 80, which is normally free, unless you&#8217;re running a web server on your computer, which I do, but that is a different story)</li>
<li id="footnote-3">[3] The blocking could also be done by a proxy instead of a firewall, but that doesn&#8217;t matter for this discussion</li>
<li id="footnote-4">[4] I have had problems with PROPFIND before, see also my <a href="http://serverfault.com/questions/314414/is-our-company-firewall-blocking-http-propfind">question on stackoverflow</a> to diagnose the problem.</li>
<p></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=425</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>So I have an SBGN-ML file, what&#8217;s next?</title>
		<link>http://www.helixsoft.nl/blog/?p=417</link>
		<comments>http://www.helixsoft.nl/blog/?p=417#comments</comments>
		<pubDate>Thu, 22 Mar 2012 10:52:43 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[pathvisio]]></category>
		<category><![CDATA[sbgn]]></category>
		<category><![CDATA[sbgn-ed]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=417</guid>
		<description><![CDATA[The Systems Biology Graphical Notation (SBGN) is a system for drawing pathways in a very precise and standardized way. But the problem is that the software support is spotty at best. The LibSBGN project is here to help improve that situation (For a bit of history, see here and here). As part of this project, [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.sbgn.org">Systems Biology Graphical Notation (SBGN)</a> is a system for drawing pathways in a very precise and standardized way. But the problem is that the software support is spotty at best. The LibSBGN project is here to help improve that situation (For a bit of history, see <a href="http://www.helixsoft.nl/blog/?p=306">here</a> and <a href="http://www.helixsoft.nl/blog/?p=341">here</a>). As part of this project, we created a file format for SBGN files, named SBGN Markup Language or SBGN-ML.</p>
<p>Let me break that alphabet soup down for you:</p>
<ol>
<li>SBGN: the graphics</li>
<li>LibSBGN: the software</li>
<li>SBGN-ML: the file format</li>
</ol>
<p>Suppose you manage to procure a SBGN-ML file. You may then reasonably ask what you can do with it. Until fairly recently, the only answer that we could give to non-programmers was &#8220;not much&#8221;. That is quickly changing however. I&#8217;ll present three things you can do with an SBGN-ML file right now.</p>
<p><strong>1. Open it in PathVisio</strong></p>
<p>Using the following <a href="http://www.pathvisio.org/webstart/sbgn/SBGN.jnlp">webstart link</a>, you can open PathVisio with the SBGN-plug-in pre-installed. (More information about the state of this plug-in, see the <a href="http://www.pathvisio.org/wiki/SbgnPluginHelp">help page</a>). Then go to File->Import&#8230; and select SBGN-ML from the file type drop-down.</p>
<p><strong>2. Convert them into an image from the Command-Line</strong></p>
<p>If you want to convert a bunch of SBGN-ML files to images, it&#8217;s easier to do it from the command-line. For this purpose I created a little script. First download the <a href="http://www.bigcat.unimaas.nl/~martijn/sbgn-to-png.tar.gz">sbgn-to-png tarball</a>. Unzip it, and run it from the command line using &#8220;sh sbgn-to-png.sh <sbgn-ml input>
<png output>&#8220;.</p>
<p><strong>3. Open it in SBGN-ED</strong></p>
<p>The <a href="http://www.sbgn-ed.org">SBGN-ED</a> tool is an alternative to PathVisio for editting pathway diagrams. SBGN-ED has won the annual SBGN competition in the category &#8220;Best software support&#8221; twice in a row. </p>
<p>When comparing PathVisio and SBGN-ED, the latter is probably a bit better when it comes to editing Process Description diagrams, whereas PathVisio deals better with Entity Relationship diagrams. The only caveat is that at this time of writing, SBGN-ED only supports an older version of SBGN-ML. For this reason, files generated by SBGN-ED can be read by PathVisio, but not the other way around. An update should arrive very soon though.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=417</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes from Vizbi: automation in Cytoscape</title>
		<link>http://www.helixsoft.nl/blog/?p=400</link>
		<comments>http://www.helixsoft.nl/blog/?p=400#comments</comments>
		<pubDate>Mon, 05 Mar 2012 20:17:03 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cytoscape]]></category>
		<category><![CDATA[CytoscapeRPC]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[semantic web]]></category>
		<category><![CDATA[visualization]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=400</guid>
		<description><![CDATA[Cytoscape is a popular network visualisation and analysis tool. It&#8217;s great because it&#8217;s so easy to create plug-ins. Today I was fortunate enough to be attending the Cytoscape developer workshop at Vizbi 2012, where I learned a few new things. Firstly, one of my goals was to find out about the current state of Cytoscape [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cytoscape.org">Cytoscape</a> is a popular network visualisation and analysis tool. It&#8217;s great because it&#8217;s so easy to create plug-ins. Today I was fortunate enough to be attending the Cytoscape developer workshop at <a href="http://vizbi.org/2012/">Vizbi 2012</a>, where I learned a few new things.</p>
<p>Firstly, one of my goals was to find out about the current state of Cytoscape development. Cytoscape is a great tool as long as you don&#8217;t look too closely at what&#8217;s going on inside. The upcoming third version promises to fix all the minor and major problems that exist under the hood. But Cytoscape 3 has been in the making for a long time. As a plug-in developer, you have to choose between something that works right now, but will go away eventually, or something that is clearly the future, but might take a long time to materialise.</p>
<p>The feeling I got from the workshop is that there is light at the end of the Cytoscape 3 tunnel. For a plug-in developer with a deadline, it&#8217;s probably best to stick with the current version for now. But if you&#8217;re not under pressure to release, it&#8217;s definitely possible to write for Cytoscape 3 and make use of a nicer and more pleasant working environment.</p>
<p>Besides that news, I learned some cool new tricks. Using Cytoscape Commands you can write simple macros for repetitive tasks. For example, to generate the network below, first you have to import a SIF (Simple Interaction Format) file, then import a file with node attributes, then apply a layout, and then apply a visual style. If you have to do this a couple of times it gets quite tedious. But here is how all that can be automated:</p>
<p><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2012/03/network.png"><img src="http://www.helixsoft.nl/blog/wp-content/uploads/2012/03/network.png" alt="" title="a simple network viewed in Cytoscape" width="338" height="378" class="aligncenter size-full wp-image-405" /></a></p>
<p>Take the following SIF data, and save it using a text editor as network.sif</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Martijn is_involved_with&nbsp; &nbsp; LibSBGN<br />
Chaouiya&nbsp; &nbsp; is_involved_with&nbsp; &nbsp; SBML-qual<br />
Martijn is_involved_with&nbsp; &nbsp; SBML-qual<br />
Martijn is_involved_with&nbsp; &nbsp; BioPreDyn<br />
Emanuel is_involved_with&nbsp; &nbsp; LibSBGN<br />
Emanuel is_funded_by&nbsp; &nbsp; Erasmus<br />
Martijn is_funded_by&nbsp; &nbsp; FP7</div></div>
<p>Here are the Node attributes, saved it as node_types.txt</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">type<br />
LibSBGN=Project<br />
BioPreDyn=Project<br />
Chaouiya=Collaborator<br />
SBML-qual=Project<br />
Martijn=Member<br />
Emanuel=Member<br />
FP7=Funding<br />
Erasmus=Funding</div></div>
<p>For the visual style, I created one in Cytoscape and saved it as style.props, using Export->Vizmap property file. And here is the magic bit: If you save the above three files in your work directory, then you can generate that picture with the script below.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">network import file=network.sif<br />
layout force-directed<br />
node import attributes file=node_types.txt<br />
vizmap import file=style.props</div></div>
<p>Run it from within Cytoscape with Plugins->Command Tool->Run script&#8230;, or from the command line with</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">./cytoscape.sh -S scriptfile</div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=400</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Logic modeling with CellNOptR in Cytoscape</title>
		<link>http://www.helixsoft.nl/blog/?p=395</link>
		<comments>http://www.helixsoft.nl/blog/?p=395#comments</comments>
		<pubDate>Mon, 27 Feb 2012 16:06:19 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cytoscape]]></category>
		<category><![CDATA[systems biology]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=395</guid>
		<description><![CDATA[A few months ago, I started work as a post-doc at the Systems Biomedicine group of the EBI. Our group makes heavy use of logical modelling as a means to understand how pathways work. For me, the most interesting thing about logical modelling is that it shows a very dynamic picture of how a pathway [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago, I started work as a post-doc at the <a href="www.ebi.ac.uk/saezrodriguez/">Systems Biomedicine</a> group of the EBI. Our group makes heavy use of logical modelling as a means to understand how pathways work. For me, the most interesting thing about logical modelling is that it shows a very dynamic picture of how a pathway changes over time. By comparison, the pictures that you get from WikiPathways are very static.</p>
<p>We have our own logical modelling software called CellNetOptimizer (a.k.a <a href="ftp://ftp.questnet.net.au/pub/bioconductor/packages/2.9/bioc/html/CellNOptR.html">CellNOptR</a>). One of my current projects is to make the CellNOptR software more interoperable with popular tools such as Cytoscape. To this end, Emanuel Gonçalves, a master student in our group, has implemented a plug-in that makes CellNOptR available from Cytoscape. Work on the plug-in is progressing nicely. Below you see the video that he made, to show off some of the features of this new plug-in.</p>
<p>http://www.youtube.com/watch?v=L343vXClXb4</p>
<p>In the video, you see how you can:</p>
<ul>
<li>open a network</li>
<li>Start the CellNOptR wizard</li>
<li>Import and view experimental data</li>
<li>Train the network against the data</li>
<li>View the optimized network in Cytoscape</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=395</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pathway Visualization to the next level</title>
		<link>http://www.helixsoft.nl/blog/?p=350</link>
		<comments>http://www.helixsoft.nl/blog/?p=350#comments</comments>
		<pubDate>Thu, 24 Feb 2011 23:21:27 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[pathvisio]]></category>
		<category><![CDATA[tiled display]]></category>
		<category><![CDATA[visualization]]></category>
		<category><![CDATA[wikipathways]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=350</guid>
		<description><![CDATA[The laboratory of bioinformatics of Wageningen University has put together some really cool hardware. In the picture below you see their tiled display, consisting of 12 high-resolution monitors, powered by a single workstation. This setup gives you a lot of resolution to play with. We managed to display all major metabolic pathways from WikiPathways simultaneously, [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.bioinformatics.nl/">laboratory of bioinformatics</a> of Wageningen University has put together some really cool hardware. In the picture below you see their tiled display, consisting of 12 high-resolution monitors, powered by a single workstation.</p>
<div id="attachment_351" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2011/02/IMG_9583.jpg"><img class="size-large wp-image-351" title="pv_tiled_display" src="http://www.helixsoft.nl/blog/wp-content/uploads/2011/02/IMG_9583-1024x768.jpg" alt="PathVisio on tiled display" width="450" height="337" /></a><p class="wp-caption-text">PathVisio on a tiled display</p></div>
<p>This setup gives you a lot of resolution to play with. We managed to display all major metabolic pathways from <a href="http://www.wikipathways.org">WikiPathways</a> simultaneously, at full resolution, and map microarray data as well. When you&#8217;re standing right next to the screens, it feels like the data is all around you. That really encourages you to explore, and make connections across the pathways. That&#8217;s just much harder to do on a single screen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=350</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First release of LibSBGN</title>
		<link>http://www.helixsoft.nl/blog/?p=341</link>
		<comments>http://www.helixsoft.nl/blog/?p=341#comments</comments>
		<pubDate>Thu, 10 Feb 2011 08:25:33 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[libsbgn]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[sbgn]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=341</guid>
		<description><![CDATA[After months of work, last week we finally released the first version of LibSBGN. So what is LibSBGN? The Systems Biology Graphical Notation (SBGN), is a standard for drawing pathways. It prescribes exactly how to draw a biochemical reaction, how one can display the effect of heat on protein degradation, or how you should present [...]]]></description>
			<content:encoded><![CDATA[<p>After months of work, last week we finally released the first version of <a href="http://libsbgn.sourceforge.net/">LibSBGN</a>.</p>
<p style="text-align: center;"><a href="http://www.helixsoft.nl/blog/wp-content/uploads/2011/02/LibSBGNLogo-400.png"><img class="size-full wp-image-344 aligncenter" title="LibSBGNLogo-400" src="http://www.helixsoft.nl/blog/wp-content/uploads/2011/02/LibSBGNLogo-400.png" alt="LibSBGN logo" width="400" height="128" /></a></p>
<p>So what is LibSBGN? The Systems Biology Graphical Notation (<a href="http://sbgn.org/">SBGN</a>), is a standard for drawing pathways. It prescribes exactly how to draw a biochemical reaction, how one can display the effect of heat on protein degradation, or how you should present the formation of a protein complex. It&#8217;s unambiguous: no matter how complex the drawing gets, it can be interpreted in only one way. SBGN is the result of many discussions, arguments and debates, over the course of several years and it&#8217;s therefore really well thought out.</p>
<p>Good software support is essential to make SBGN succeed as a standard. LibSBGN was created in an attempt to encourage uptake. As the name implies, LibSBGN is a software library that should make it easy to incorporate SBGN in pathway tools.</p>
<p>LibSBGN is only a software component, it&#8217;s not a ready to use end-product by itself. So this announcement is probably only interesting to bioinformatics developers. Nevertheless, I hope that it will soon lead to an increased uptake of SBGN in pathway tools, which should benefit end-users of those tools as well.</p>
<p>LibSBGN is already supported by a few applications, including of course <a href="http://www.pathvisio.org">PathVisio</a>. To make sure that it works exactly the same in each tool, we&#8217;ve created a <a href="http://azraelbigcat.dyndns.org/reports/libsbgn/render_comparison/index.html">comparison gallery</a>, containing several test-cases rendered by each tool. All the diagrams should look exactly the same for each tool. This comparison page has proven tremendously useful to check for bugs and misunderstandings.</p>
<p>This is only the first release, there is still a lot to do. This first release only supports a part of SBGN called process description (PD). The coming months will see lots of work on the remaining parts of SBGN, entity relationships (ER), and activity flow (AF). And after that we&#8217;ve planned more features, such as validation rules and file format conversion.</p>
<p>This is the first tangible result from something that was set in motion at a meeting in <a href="http://www.helixsoft.nl/blog/?p=306">Wittenberg</a>. LibSBGN community: thanks for your hard work and congratulations on this first milestone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=341</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Spaghetti DNA</title>
		<link>http://www.helixsoft.nl/blog/?p=335</link>
		<comments>http://www.helixsoft.nl/blog/?p=335#comments</comments>
		<pubDate>Sun, 30 Jan 2011 12:38:51 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[DNA]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=335</guid>
		<description><![CDATA[This is in the category &#8220;parallels between life and computers&#8221;. DNA is said to contain the instructions to build an organism, just like software contains instructions for a computer. Poorly structured software is sometimes called &#8220;Spaghetti Code&#8221; because it&#8217;s such an intangible mess. What about the structure of DNA? Here is a nice quote from [...]]]></description>
			<content:encoded><![CDATA[<p>This is in the category &#8220;parallels between life and computers&#8221;.</p>
<p>DNA is said to contain the instructions to build an organism, just like software contains instructions for a computer. Poorly structured software is sometimes called &#8220;Spaghetti Code&#8221; because it&#8217;s such an intangible mess. What about the structure of DNA? <span>Here is a nice quote from the linux kernel mailing list (<a href="http://article.gmane.org/gmane.linux.kernel/1089022">link</a>):</span></p>
<blockquote>
<pre>&gt; Human communication methods are all buggy as hell <img src='http://www.helixsoft.nl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 

Not to mention that they are slow, inefficient and ambiguous.

But wht did you expect? The original authors of the code are long gone and
maintenance is done by newcomers who are patching the code bit by bit. What
you get from such a development model is pretty predictable: ~1 billion years
old spaghetti DNA that no-one truly understands.</pre>
</blockquote>
<p>Evolution may be a &#8220;poor development model&#8221;, but at least DNA has seen billions of years of debugging <img src='http://www.helixsoft.nl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=335</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle versus Google</title>
		<link>http://www.helixsoft.nl/blog/?p=329</link>
		<comments>http://www.helixsoft.nl/blog/?p=329#comments</comments>
		<pubDate>Fri, 20 Aug 2010 17:26:11 +0000</pubDate>
		<dc:creator>Martijn van Iersel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[patents]]></category>

		<guid isPermaLink="false">http://www.helixsoft.nl/blog/?p=329</guid>
		<description><![CDATA[A while back I wrote rather optimistically that I expected Oracle to play nice with the open source community &#8220;I don’t see why Oracle won’t be able to keep MySQL open and still have a nice profitable business model.&#8221; However, all that seems rather less likely, now that Oracle is suing Google over patent infringement [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.helixsoft.nl/blog/?p=208">A while back I wrote</a> rather optimistically that I expected Oracle to play nice with the open source community</p>
<p style="padding-left: 30px;">&#8220;I don’t see why Oracle won’t be able to keep MySQL open and still have a nice profitable business model.&#8221;</p>
<p>However, all that seems rather less likely, now that <a href="http://arstechnica.com/tech-policy/news/2010/08/oracle-sues-google-over-use-of-java-in-android-sdk.ars">Oracle is suing Google</a> over patent infringement in the open source Android platform.</p>
<p>Here is a great <a href="http://blog.headius.com/2010/08/my-thoughts-on-oracle-v-google.html">point of view from a Java developer</a> on this lawsuit. Not only it explains what the suit is all about, but also gives historical perspective, how Java got into this mess in the first place.</p>
<p>From that link:</p>
<p style="padding-left: 30px;">&#8220;Android actually *was* a great platform that supported existing Java  developers and libraries incredibly well (without actually being a Java  environment), and for the first time there was a serious contender to  &#8220;standard&#8221; Java that Sun had absolutely no control over.&#8221;</p>
<p>and:</p>
<p style="padding-left: 30px;">&#8220;If for nothing else, Jonathan Schwartz will be remembered as the man  who broke open the Sun piñata, simultaneously releasing more  open-source software than any company in history and killing Sun in the  process. Either Jonathan had no &#8220;step 2&#8243; or the inertia of a company  built on closed-source products was too great to overcome. In either  case, by spring of 2009 Sun was hemorrhaging&#8221;</p>
<p>It&#8217;s long but well worth a read if you are concerned about the future of Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helixsoft.nl/blog/?feed=rss2&amp;p=329</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
