<?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>Labix Blog &#187; Patch</title>
	<atom:link href="http://blog.labix.org/tag/patch/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.labix.org</link>
	<description>by Gustavo Niemeyer</description>
	<lastBuildDate>Mon, 16 Jan 2012 04:02:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Launchpad + Rietveld == HappyCodeReviews</title>
		<link>http://blog.labix.org/2011/11/17/launchpad-rietveld-happycodereviews</link>
		<comments>http://blog.labix.org/2011/11/17/launchpad-rietveld-happycodereviews#comments</comments>
		<pubDate>Fri, 18 Nov 2011 02:28:42 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Patch]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[RCS]]></category>

		<guid isPermaLink="false">http://blog.labix.org/?p=849</guid>
		<description><![CDATA[In the past week, I&#8217;ve finally stopped to fix something that I&#8217;ve been wishing for years: inline code reviews in Launchpad. Well, I haven&#8217;t exactly managed fix it in Launchpad, but the integration with Rietveld feels nice enough to be &#8230; <a href="http://blog.labix.org/2011/11/17/launchpad-rietveld-happycodereviews">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In the past week, I&#8217;ve finally stopped to fix something that I&#8217;ve been wishing for years: inline code reviews in Launchpad. Well, I haven&#8217;t exactly managed fix it <i>in</i> Launchpad, but the integration with Rietveld feels nice enough to be relatively painless.</p>
<p>The integration is done using the <a href="https://launchpad.net/lbox">lbox</a> tool, that was developed in <a href="http://golang.org">Go</a> using the <a href="http://goneat.org/lp/lpad">lpad package</a> for the communication with Launchpad, and a newly written <a href="http://goneat.org/lp/goetveld/rietveld">rietveld package</a> for communication with Rietveld.</p>
<p>If you want to join me in my happines, here are the few steps to get that working for you as well.</p>
<p><span id="more-849"></span>First, install lbox from the Launchpad PPA. Since it&#8217;s written in Go, it has no dependencies.</p>
<pre>
$ sudo add-apt-repository ppa:gophers/go
$ sudo apt-get update
$ sudo apt-get install lbox
</pre>
<p>Now, as an example of using it, let&#8217;s suppose we want to perform a change in the lbox code itself. First, we take the branch out of Launchpad.</p>
<pre>
$ mkdir hacking
$ cd hacking
$ bzr branch lp:lbox
Branched 9 revision(s).
</pre>
<p>Then, let&#8217;s create a feature branch based on the original trunk, and perform a change.</p>
<pre>
$ bzr branch lbox my-nice-feature
Branched 9 revision(s).

$ cd my-nice-feature
$ echo # Yo >> Makefile
$ bzr commit -m "Yo-ified makefile"
Committing to: /home/user/hacking/my-nice-feature/
modified Makefile
Committed revision 10.
</pre>
<p>Ok, we&#8217;re ready for the magic step, which is actually pushing that branch and proposing the merge on the original branch on both Launchpad and Rietveld. It&#8217;s harder to explain than to do it:</p>
<pre>
$ lbox propose -cr
2011/11/17 23:29:49 Looking up branch information for "."...
2011/11/17 23:29:49 Looking up branch information for "hacking/lbox"...
2011/11/17 23:29:49 Found landing target: bzr+ssh://bazaar.../lbox/
(...)
</pre>
<p>This command will ask you for a few details interactively, like your authentication details in Launchpad and in Rietveld (your Google Account, details sent over SSL to Google itself; you may have to visit Rietveld first for that to work), and also the change description.</p>
<p>In case something fails, feel free to simply execute the command again, as many times as you want. The command is smart enough to figure that an existing merge proposal and change in Rietveld exist and will update the existing ones with the new details you provide, rather than duplicating work.</p>
<p>Once the command finishes, you can visit the URL for the merge proposal in Launchpad that was printed, and you should see something like this:</p>
<p><a href="http://blog.labix.org/wp-content/uploads/2011/11/lbox-lp-mp.jpg"><img src="http://blog.labix.org/wp-content/uploads/2011/11/lbox-lp-mp-1024x580.jpg" alt="" title="lbox-lp-mp" width="640" height="362" class="alignnone size-large wp-image-861"/></a></p>
<p>Note that the change description already includes a link onto the Rietveld issue at codereview.appspot.com. The issue on Rietveld will look something like this:</p>
<p><a href="http://blog.labix.org/wp-content/uploads/2011/11/lbox-rietveld.jpg"><img src="http://blog.labix.org/wp-content/uploads/2011/11/lbox-rietveld.jpg" alt="" title="lbox-rietveld" width="979" height="333" class="alignnone size-full wp-image-865" /></a></p>
<p>Observe how the issue has the same description as the merge proposal, but it links back onto the merge proposal. At the left-hand side, there&#8217;s also an interesting detail: the original merge proposal email has been added as the reviewer of this change. This means that any changes performed in Rietveld will be mailed back onto the merge proposal for its record.</p>
<p>In the center you can find the meat of the whole work: the actual change set that is being reviewed. Rietveld works with patch sets, so that you can not only see a given change, but you can also review the history of proposals that the proponent has made, and any inline comments performed in them.</p>
<p>Click on the side-by-side link next to Makefile to get an overview of the actual change, and to make comments on it just click on the desired line:</p>
<p><a href="http://blog.labix.org/wp-content/uploads/2011/11/lbox-rietveld-diff.jpg"><img src="http://blog.labix.org/wp-content/uploads/2011/11/lbox-rietveld-diff.jpg" alt="" title="lbox-rietveld-diff" width="986" height="628" class="alignnone size-full wp-image-867" /></a></p>
<p>Your comments won&#8217;t be sent immediately. Once you&#8217;re done making comments and want to deliver the review, click on the &#8220;Publish+Mail Comments&#8221; link at the top-right, which will take you onto a page that enables complementing with any heading details if desired.</p>
<p>Since the merge proposal is registered as the reviewer of the issue in Rietveld, publishing the review will deliver a message back onto the merge proposal itself, including context links that enable anyone to be taken to the precise review point back in Rietveld:</p>
<p><a href="http://blog.labix.org/wp-content/uploads/2011/11/lbox-lp-comment.jpg"><img src="http://blog.labix.org/wp-content/uploads/2011/11/lbox-lp-comment.jpg" alt="" title="lbox-lp-comment" width="776" height="275" class="alignnone size-full wp-image-870" /></a></p>
<p>Then, once you do make the suggested changes and want to publish a new version of the branch, simply repeat the original command: &#8220;lbox propose -cr&#8221;. This will push the new diff onto Rietveld and create a new patch set. You&#8217;ll also be given the chance to edit the previous description, and any changes there will take place both in the merge proposal and in the Rietveld issue.</p>
<p>lbox also has other useful command line options, such as -bug, -new-bug, to associate Launchpad bugs with the merge proposal and put them in progress, or -bp to associate a blueprint with the branch and bug (if provided) being handled.</p>
<p>This should turn your code reviews in Launchpad into significantly more pleasant tasks, and maybe even save some of your precious life time for more interesting activities.</p>
<p>Happy reviewing!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2011/11/17/launchpad-rietveld-happycodereviews/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Support for Launchpad and Bazaar in goinstall</title>
		<link>http://blog.labix.org/2010/07/03/support-for-launchpad-and-bazaar-in-goinstall</link>
		<comments>http://blog.labix.org/2010/07/03/support-for-launchpad-and-bazaar-in-goinstall#comments</comments>
		<pubDate>Sat, 03 Jul 2010 19:17:57 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Patch]]></category>
		<category><![CDATA[RCS]]></category>

		<guid isPermaLink="false">http://blog.labix.org/?p=355</guid>
		<description><![CDATA[The patch submitted last weekend to support Launchpad and Bazaar in goinstall went in! This means that once the next release of Go is out (or you sync up with the tip code) you&#8217;ll be able to host modules for &#8230; <a href="http://blog.labix.org/2010/07/03/support-for-launchpad-and-bazaar-in-goinstall">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://codereview.appspot.com/1699050">patch submitted last weekend</a> to support <a href="https://launchpad.net">Launchpad</a> and <a href="http://bazaar.canonical.com/">Bazaar</a> in <a href="http://golang.org/cmd/goinstall/">goinstall</a> went in!</p>
<p>This means that once the next release of <a href="http://golang.org">Go</a> is out (or you sync up with the tip code) you&#8217;ll be able to host modules for Go in Launchpad and people will be able to install it by running something similar to:</p>
<p><span id="more-355"></span></p>
<blockquote><p>
goinstall launchpad.net/yourproject
</p></blockquote>
<p>Then, you can simply use that in your source code as:</p>
<blockquote><p>
import &#8220;launchpad.net/yourproject&#8221;
</p></blockquote>
<p>The following URLs are supported:</p>
<blockquote><p>
import &#8220;launchpad.net/project&#8221;<br />
import &#8220;launchpad.net/project/series&#8221;<br />
import &#8220;launchpad.net/project/series/sub/directory&#8221;</p>
<p>import &#8220;launchpad.net/~user/project/branch&#8221;<br />
import &#8220;launchpad.net/~user/project/branch/sub/directory&#8221;</p>
<p>import &#8220;launchpad.net/~user/+junk/branch&#8221;<br />
import &#8220;launchpad.net/~user/+junk/branch/sub/directory&#8221;
</p></blockquote>
<p>Where you see <i>sub/directory</i> above, it means the module to be compiled, installed, and used, may be inside a subdirectory in the Bazaar branch itself. This is a convention used in all supported backends of goinstall.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2010/07/03/support-for-launchpad-and-bazaar-in-goinstall/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Support for GPS TrackMaker file format on GPSBabel</title>
		<link>http://blog.labix.org/2006/02/04/support-for-gps-trackmaker-file-format-on-gpsbabel</link>
		<comments>http://blog.labix.org/2006/02/04/support-for-gps-trackmaker-file-format-on-gpsbabel#comments</comments>
		<pubDate>Sat, 04 Feb 2006 13:30:00 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[GPS]]></category>
		<category><![CDATA[Patch]]></category>
		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://blog.labix.org/2006/02/04/support-for-gps-trackmaker-file-format-on-gpsbabel/</guid>
		<description><![CDATA[Continuing my put-those-bits-out-of-your-hard-drive campaign, I&#8217;ve released a patched version of GPSBabel with support for input and output of waypoints, tracks and routes in the binary file format of GPS TrackMaker. The patch was written six months ago (sorry ). I &#8230; <a href="http://blog.labix.org/2006/02/04/support-for-gps-trackmaker-file-format-on-gpsbabel">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Continuing my <i>put-those-bits-out-of-your-hard-drive</i> campaign, I&#8217;ve <a href="http://labix.org/gpsbabel-gtm">released a patched version</a> of <a href="http://gpsbabel.sf.net">GPSBabel</a> with support for input and output of waypoints, tracks and routes in the binary file format of <a href="http://www.gpstm.com">GPS TrackMaker</a>.</p>
<p>The patch was written six months ago (sorry <img src='http://blog.labix.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ). I just had to port it over to a recent version of GPSBabel.</p>
<p>The original reason for the patch is that there is quite a good amount of information under that format for Brazil, and GPSBabel is able to deliver information directly to some brands of GPS devices. Hopefully this will get applied upstream soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2006/02/04/support-for-gps-trackmaker-file-format-on-gpsbabel/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Embedding Lua interpreter into RPM</title>
		<link>http://blog.labix.org/2004/03/23/embedding-lua-interpreter-into-rpm</link>
		<comments>http://blog.labix.org/2004/03/23/embedding-lua-interpreter-into-rpm#comments</comments>
		<pubDate>Tue, 23 Mar 2004 06:59:00 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[Patch]]></category>

		<guid isPermaLink="false">http://blog.labix.org/2004/03/23/embedding-lua-interpreter-into-rpm/</guid>
		<description><![CDATA[I&#8217;ve recently committed into the RPM CVS HEAD the internal support for Lua scripts. Please, notice that this is experimental stuff. Why embedding Lua in RPM? Many scripts execute simple operations which in an internal interpreter require no forking at &#8230; <a href="http://blog.labix.org/2004/03/23/embedding-lua-interpreter-into-rpm">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently committed into the <a href="http://www.rpm.org">RPM</a> CVS HEAD the internal support for <a href="http://www.lua.org">Lua</a> scripts.</p>
<p>Please, notice that this is experimental stuff.</p>
<p><b>Why embedding Lua in RPM?</b></p>
<ul>
<li>Many scripts execute simple operations which in an internal interpreter require no forking at all
<li>Internal scripts reduce or eliminate external dependencies related to script slots
<li>Internal scripts operate even under unfriendly situations like stripped chroots (anyone said installers?)
<li>Internal scripts in Lua are really fast
<li>Syntax errors in internal scripts are detected at package building time
</ul>
<p><b>How it works?</b></p>
<p>Just use <tt>-p &lt;lua&gt;</tt> in any script slot (%pre, %post, etc).</p>
<p>For example: </p>
<pre>
%pre -p &lt;lua&gt;
print("Wow! It really works!")
</pre>
<p><b>What is accessible from Lua?</b></p>
<p>The standard Lua library, the posix module (basic system access, by Luiz Henrique de Figueiredo and Claudio Terra), and the rex module (regular expressions, by Reuben Thomas).</p>
<p><b>Macro support</b></p>
<p>Support for Lua macros was also introduced. It means that one can create custom content using Lua macros anywhere.</p>
<p>For example: </p>
<pre>
%{lua: print("Requires: hello-world &gt; 1.0") }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2004/03/23/embedding-lua-interpreter-into-rpm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New RPM transaction locking</title>
		<link>http://blog.labix.org/2004/03/01/new-rpm-transaction-locking</link>
		<comments>http://blog.labix.org/2004/03/01/new-rpm-transaction-locking#comments</comments>
		<pubDate>Mon, 01 Mar 2004 06:40:00 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Patch]]></category>

		<guid isPermaLink="false">http://blog.labix.org/2004/03/01/new-rpm-transaction-locking/</guid>
		<description><![CDATA[Last week I&#8217;ve worked with Jeff Johnson to fix a small RPM issue which was bothering us for quite some time. Until this change, RPM was accepting two transactions to be run at the same time but, unfortunately, this might &#8230; <a href="http://blog.labix.org/2004/03/01/new-rpm-transaction-locking">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Last week I&#8217;ve worked with Jeff Johnson to fix a small RPM issue which was bothering us for quite some time. Until this change, RPM was accepting two transactions to be run at the same time but, unfortunately, this might put the database in an inconsistent state, and some headers might get lost while restoring it with &#8211;rebuilddb.</p>
<p>Our fix was rather simple, based on fcntl() locking while transactions are being committed to the system. This should be enough, protecting databases while the issue is not fixed The Right Way (the time consuming one <img src='http://blog.labix.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
<p>Developers of applications linked with RPM should not worry about additional errors, since the current behavior is to wait for the lock to be released while entering in the transaction committing function.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2004/03/01/new-rpm-transaction-locking/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compiler warnings in Python&#8217;s SRE</title>
		<link>http://blog.labix.org/2004/02/17/compiler-warnings-in-pythons-sre</link>
		<comments>http://blog.labix.org/2004/02/17/compiler-warnings-in-pythons-sre#comments</comments>
		<pubDate>Tue, 17 Feb 2004 06:36:00 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Patch]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.labix.org/2004/02/17/compiler-warnings-in-pythons-sre/</guid>
		<description><![CDATA[After a long time, and many people complaining about it, I finally took some time to fix some annoying compiler warnings in Python&#8217;s regular expression engine. Since it&#8217;s a rather uncommon case, I&#8217;ll explain it here with a quick example. &#8230; <a href="http://blog.labix.org/2004/02/17/compiler-warnings-in-pythons-sre">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After a long time, and many people complaining about it, I finally took some time to fix some annoying compiler warnings in Python&#8217;s regular expression engine. Since it&#8217;s a rather uncommon case, I&#8217;ll explain it here with a quick example.</p>
<p>Have a look at the following code: </p>
<pre>
#include &lt;stdio.h&gt;

int main(int argc, char *argv[])
{
   unsigned char c = 1;
   if (c < 256)
      printf("Hello world!\n");
   return 0;
}
</pre>
<p>If you try to compile that code, you'll probably get a warning like this: </p>
<pre>
test.c: In function `main':
test.c:7: warning: comparison is always true due to
limited range of data type
</pre>
<p>Yes, the compiler is right. Our char type will never reach the given limit. On the other hand, suppose that this code is preprocessed, and that the c variable has sometimes a multibyte character type, like wchar_t, for example. In this case our test is legitimate, and the dozens of warnings being caused by a common macro are really annoying.</p>
<p>There are many different ways to remove these warnings. Unfortunately, the most obvious one, which is casting the variable to a larger type, doesn't work as expected. </p>
<p>My adopted solution was to reimplement the same test in another way, surpassing the compiler warnings for this specific case. Instead of writing <tt>(c &lt; 255)</tt>, I've written <tt>(!(c &amp; ~255))</tt>. This is 100% safe for any unsigned type, which is my case. Ok, perhaps it's a little bit sick, but a large comment should leave everyone aware about the rationale, and away from the warnings.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2004/02/17/compiler-warnings-in-pythons-sre/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Removed SRE recursion in Python</title>
		<link>http://blog.labix.org/2003/10/19/removed-sre-recursion-in-python</link>
		<comments>http://blog.labix.org/2003/10/19/removed-sre-recursion-in-python#comments</comments>
		<pubDate>Sun, 19 Oct 2003 04:17:00 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Patch]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.labix.org/2003/10/19/removed-sre-recursion-in-python/</guid>
		<description><![CDATA[SRE is the current regular expression engine used in Python, and the scheme currently in use is highly recursive in some cases. For example, check the result of the following expression, with the current interpreters: &#62;&#62;&#62; import re &#62;&#62;&#62; re.match('(x)*','x'*10000) &#8230; <a href="http://blog.labix.org/2003/10/19/removed-sre-recursion-in-python">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>SRE is the current regular expression engine used in Python, and the scheme currently in use is highly recursive in some cases. For example, check the result of the following expression, with the current interpreters: </p>
<pre>
&gt;&gt;&gt; import re
&gt;&gt;&gt; re.match('(x)*','x'*10000)
Traceback (most recent call last):
  File "", line 1, in ?
  File "/usr/lib/python2.3/sre.py", line 132, in match
    return _compile(pattern, flags).match(string)
RuntimeError: maximum recursion limit exceeded
</pre>
<p>Now, my patch to remove the SRE recursion in Python was finally committed to the CVS. Here is the same example with the CVS HEAD, but using a string which is a hundred times larger: </p>
<pre>
&gt;&gt;&gt; import re
&gt;&gt;&gt; re.match('(x)*','x'*1000000)
&lt;_sre.SRE_Match object at 0x300bb970&gt;
&gt;&gt;&gt;
</pre>
<p>Unless some serious problem is found in the new algorithm, it will be available in Python 2.4. </p>
<p>This patch also includes the <tt>(?(id/name)yes-pattern|no-pattern)</tt> expression support I&#8217;ve written more than a year ago. This will try to match with <tt>yes-pattern</tt> if the group with given id or name exists, and with <tt>no-pattern</tt> if it doesn&#8217;t. <tt>|no-pattern</tt> is optional and can be omitted. For example, <tt>()</tt> is a poor email matching pattern, which will match with &#8221; as well as &#8216;user@host.com&#8217;, but not with &#8216;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2003/10/19/removed-sre-recursion-in-python/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java bits</title>
		<link>http://blog.labix.org/2003/10/18/java-bits</link>
		<comments>http://blog.labix.org/2003/10/18/java-bits#comments</comments>
		<pubDate>Sat, 18 Oct 2003 04:11:00 +0000</pubDate>
		<dc:creator>Gustavo Niemeyer</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Patch]]></category>

		<guid isPermaLink="false">http://blog.labix.org/2003/10/18/java-bits/</guid>
		<description><![CDATA[For the first time in my life, I&#8217;ve been paid to implement something in the Java language. Conectiva has been contracted to implement X500 address book support in a known Brazilian groupware tool, for the Brazilian government. This tool runs &#8230; <a href="http://blog.labix.org/2003/10/18/java-bits">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For the first time in my life, I&#8217;ve been paid to implement something in the Java language. Conectiva has been contracted to implement X500 address book support in a known Brazilian groupware tool, for the Brazilian government. This tool runs on top of the <a href="http://jakarta.apache.org/tomcat/">TomCat</a> server, and I must mention that I&#8217;ve used an interesting feature of the Java language to debug it remotely: the Java Platform Debugger Architecture (JPDA) (thanks <a href="http://jswat.sourceforge.net">JSwat</a> developers).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.labix.org/2003/10/18/java-bits/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

