<?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>Netuality &#187; library</title>
	<atom:link href="http://www.netuality.ro/tag/library/feed" rel="self" type="application/rss+xml" />
	<link>http://www.netuality.ro</link>
	<description>Taming the big, bad, nasty websites</description>
	<lastBuildDate>Mon, 07 Nov 2011 16:36:46 +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>XML descriptors in PHP frameworks &#8211; considered harmful</title>
		<link>http://www.netuality.ro/xml-descriptors-in-php-frameworks-considered-harmful/tools/20041029</link>
		<comments>http://www.netuality.ro/xml-descriptors-in-php-frameworks-considered-harmful/tools/20041029#comments</comments>
		<pubDate>Fri, 29 Oct 2004 05:53:51 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/xml-descriptors-in-php-frameworks-considered-harmful/uncategorized/20041029</guid>
		<description><![CDATA[No, I am not a seasoned PHP programmer and I do not intend to become one. But we do live in a harsh economy where all IT projects are worth considering, thus my occasional incursions in the world of of PHP-driven websites. I am not new to PHP either, but &#8211; coming from a Java [...]]]></description>
			<content:encoded><![CDATA[<p>No, I am not a seasoned PHP programmer and I do not intend to become one. But we do live in a harsh economy where all IT projects are worth considering, thus my occasional incursions in the world of of PHP-driven websites.</p>
<p>I am not new to PHP either, but &#8211; coming from a Java world &#8211; immediately felt the need of a serious MVC framework.<br />
Nobody wants to reinvent the wheel each time a new website is built. Just launch the obvious &#8220;PHP MVC framework&#8221; on Google and the results pages will be dominated by four open-source projects :</p>
<ul>
<li><a href="http://amb.sourceforge.net/" target="_new">PHPMVC</a> is probably the oldest project and implements a model 2 front controller/li>
<li><a href="http://sourceforge.net/projects/phpmvc/" target="_new">Ambivalence</a> declares itself as a simple port of<br />
Java <a href="http://mav.sourceforge.net/" target="_new">Maverick</a> project</li>
<li><a href="http://www.eocene.net/" target="_new">Eocene</a> a &#8220;simple and easy to use OO web development framework for PHP and ASP.NET&#8221;,implementing MVC and front controller</li>
<li><a href="http://phrame.sourceforge.net" target="_new">Phrame</a> is a Texas Tech University project released as LGPL, heavily inspired by Struts.</li>
</ul>
<p>The choice is not easy. There are no examples of industrial-quality sites built with either of these frameworks.<br />
(some may say there are no examples of industrial quality sites built with PHP but let&apos;s ignore these nasty people for now).</p>
<p>There are no serious comparisons of the four frameworks, neither feature-wise nor performance-wise.<br />
In the tradition of open-source projects, the documentation is rather scarce and examples are &#8220;helloworld&#8221;-isms.<br />
Yes I am a bloody bastard for pointing out these aspects &#8211; since the authors are not paid to release these projects &#8211; and perhaps I could contribute myself with some documentation. However, when under an aggressive schedule I feel it&apos;s easier to write my own framework instead of understanding other people&apos;s code and document it thoroughly.<br />
However, I have a nice hint for you. The first three frameworks are using XML files for controller initialization (call it &#8220;sitemap&#8221;, &#8220;descriptor&#8221; or otherwise; but it&apos;s just a plain dumb XML file). So you should safely ignore them in a production environment.</p>
<p>Because, the &#8220;controller&#8221; is nothing more than a glorified state machine. The succession of states and transitions (or &#8220;actions&#8221; or whatever) should be persisted somewhere. XML is probably a nice choice for Java frameworks, where the files are parsed and the application server keeps <strong>in memory</strong> a pool of controller objects.</p>
<p>But: PHP sessions are <strong>stateless</strong>. The only way of keeping state is via filesystem or database, usually based on an ad-hoc generated unique key, which is kept in the session cookie. More: PHP allows native serialization only for primitive variables; a complex object such as the controller can not be persisted easily, so it has to be retrieved from XML and fully rebuilt. Unlike in Java appservers, objects cannot be shared between multiple session, thus pooling is not an option. Thus, in PHP, the XML approach is highly un-recommended, since this means that the XML files are parsed <strong>for each page that is viewed on the site</strong>. Although PHP&apos;s parser is James Clarks&apos;s Expat, one of the fastest parsers right now (written in C), note that the DOM object must be browsed in order to create the controller object (which is becoming more and more complex as the site grows). This is called <b>heavy overhead</b>, no matter how you look at it.</p>
<p>There are a few reasons about why you need XML in a web framework, however this does NOT apply to PHP apps. Myth quicklist:
<ul>
<li>it&apos;s &#8220;human-readable&#8221;. Come on, PHP is stored is ASCII readable files and even if you use Zend products to compile and encrypt your code, why on earth would you allow readability and modification of the controller state machine on the deployment site ?</li>
<li>easier to modify than in code. This is probably true for Java and complex frameworks, but in PHP is significantly simpler than Java.</li>
<li>automatically generated from code by tools such as Xdoclet or via an IDE. If you&apos;re writing it in Java, because PHP does not have such tools.</li>
</ul>
<p>This means that the only serious candidate (between these considered here) for a PHP MVC framework is Phrame, which stores the sitemap as a multi-dimensional hashmap. Thus, you should either consider Phrame or (for small < 50 screens) sites you&apos;ll be better off writing your own mini-framework, with a state machine implemented as a hashed array of arrays and some session persistence in the database. I chose to serialize and persist an array containing primitive variables, using PHPSESSID as the primary key in order to retrieve and unserialize the array, all coupled with a simple "aging" mechanism for these users with the nasty habit of leaving the site without performing logout first.</p>
<p>Finally a last world of advice : use PEAR ! This often overlooked library of PHP classes includes a few man-years of quality work. You&apos;ll get a generic database connection layer (PEAR-DB) along with automatic generation of model classes mapped on the database schema (DB_DataObjects), a plethora of HTML tools (tables, forms, menus) and some templating systems to choose from. All in a nice easy to install and upgrade package.</p>
<p>Don&apos;t put a heavy burden on your upgrade cycle using heterogenous packages downloaded from different sites on the web, just use PEAR.</p>
<p>Or simply ignore the PHP offer and wait patiently for your next Java project. Vacations are almost over.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/xml-descriptors-in-php-frameworks-considered-harmful/tools/20041029/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Getting rid of the dreaded o.e.c.i.r.AssertionFailedException</title>
		<link>http://www.netuality.ro/getting-rid-of-the-dreaded-oecirassertionfailedexception/andeverythingelse/20040325</link>
		<comments>http://www.netuality.ro/getting-rid-of-the-dreaded-oecirassertionfailedexception/andeverythingelse/20040325#comments</comments>
		<pubDate>Thu, 25 Mar 2004 17:23:30 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[AndEverythingElse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/getting-rid-of-the-dreaded-oecirassertionfailedexception/uncategorized/20040325</guid>
		<description><![CDATA[It you have ever written even the smallest standalone app using SWT and Jface library, then you must know (and hate!) org.eclipse.core.internal.runtime.AssertionFailedException. This exception has the very bad habit of substituting the initial one without keeping any trace of it. The official explanation is the following : &#8220;Jface is not guaranteed to work in standalone [...]]]></description>
			<content:encoded><![CDATA[<p>It you have ever written even the smallest standalone app using SWT and Jface library, then you must know (and hate!) org.eclipse.core.internal.runtime.AssertionFailedException. This exception has the very bad habit of substituting the initial one without keeping any trace of it. The official explanation is the following :<br/><br />
&#8220;Jface is not guaranteed to work in standalone mode. As a matter of fact, Jface tries to report different errors using the Eclipse plugin mechanism, thus provoking a fatal assertion failure which is the only exception being reported.&#8221;<br/><br />
<a HREF="http://www.ryanlowe.ca/blog/archives/001259.php" target="_new">Ryan Lowe</a> suggests <em>wrapping [the code] in a try/catch block temporarily</em>. Yeah sure this might just work if you know WHAT to wrap. What do you do when, after multiple commits and updates of the same source file modified by different people, you have the failed assertion ? Wrap in a try/catch every slice of code committed in the last few hours ? Hmmm &#8230; don&apos;t think so.<br/><br />
An interesting solution would be (as proposed by Ryan) to use aspects in order to wrap automatically each and every SWT call. But this might bring serious performance issues and I also have some doubts that it will catch everything.<br/><br />
But boy, aren&apos;t we lucky that Eclipse is opensourced ? Just by looking at the stack trace (which is the same over and over no matter where your real error is) you can spot the guilty : org.eclipse.core.internal.runtime.InternalPlatform (found in runtime.jar/runtimesrc.zip). The little bugger is Mr. <strong>private static boolean initialized</strong>. Putting it on true involves starting the platform, which is a quite complex process judging by the <em>loaderStartup(URL[] pluginPath, String locationString, Properties bootOptions, String[] args, Runnable handler) throws CoreException</em> method. Unfortunately, being a private variable means that reflection won&apos;t work and dynamic proxying won&apos;t work, either*. AKA Out Of Ideas (TM)<br/><br />
So, it&apos;s time to stop trying to be smart. I&apos;ll just be a rude dumb programmer and simply modify the source, recompile and replace the .class files in the runtime.jar. It&apos;s extremely simple yet sharply efficient:</p>
<ul>
<li>initialize &#8220;initialized&#8221; on true</li>
<li>in the method <em>private static void handleException(ISafeRunnable code, Throwable e)</em> replace all the content with the following line : <em>e.printStackTrace();code.handleException(e);</em>. A stack in the console is enough for me at this stage, but of course you may use your favorite logging infrastructure classes to report the exception. The <em>code.handleException</em> call has (at least in my app) the effect of displaying an innocuous dialog box telling the user that something went wrong. Just the right dose of details aka nothing at all (don&apos;t scare the poor user, please).</li>
</ul>
<p>Well, what&apos;s more to say ? This stupid trick simply works.<br/><br />
On second thought, I might use RCP. Maybe, in a future episode.<br/><br />
*AFAIK Please correct me if I&apos;m mistaking here.<br/><br />
PS That was quick &#8220;Setting the accessible flag in a reflected object of java.lang.reflect.AccessibleObject class allows reading/modifying a private variable that normally wouldn&apos;t have permission to. However, the access check can only be supressed if approved by installed SecurityManager.&#8221;. Humm, ok, so there IS a smarter solution after all. Left as an exercise for the reader <img src='http://www.netuality.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/getting-rid-of-the-dreaded-oecirassertionfailedexception/andeverythingelse/20040325/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scripting languages not just for toys (a Ruby web framework)</title>
		<link>http://www.netuality.ro/scripting-languages-not-just-for-toys-a-ruby-web-framework/tools/20040324</link>
		<comments>http://www.netuality.ro/scripting-languages-not-just-for-toys-a-ruby-web-framework/tools/20040324#comments</comments>
		<pubDate>Wed, 24 Mar 2004 11:07:49 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/scripting-languages-not-just-for-toys-a-ruby-web-framework/uncategorized/20040324</guid>
		<description><![CDATA[According to David Heinemeier Hansson, the RAILS 1KLOC (!) web framework written in Ruby was used to develop Basecamp, a mildly complex project management webapp. What&apos;s fascinating is the Ruby code used to develop Basecamp is only 4KLOC (according to the RAILS document) and was developed in less than 2man*month (including 212 test cases and [...]]]></description>
			<content:encoded><![CDATA[<p>According to <a HREF="http://www.loudthinking.com/" target="_new">David Heinemeier Hansson</a>, the <a HREF="http://rails.nextangle.com/" target="_new">RAILS</a> 1KLOC (!) web framework written in <a HREF="http://www.ruby-lang.org/en/" target="_new">Ruby</a> was used to develop <a HREF="http://www.basecamphq.com/" target="_new">Basecamp</a>, a mildly complex project management webapp. What&apos;s fascinating is the Ruby code used to develop Basecamp is only 4KLOC (according to the RAILS document) and was developed in less than 2man*month (including 212 test cases and all the bells and gingles). Although I strongly suspect that there was a lot of templating going on behind the hoods and I doubt that template development time was included, the efficiency is amazing, especially if you consider that they have started almost from scratch. Makes you wonder what would be possible to perform in Ruby with a comprehensive library such as PHP&apos;s PEAR (well, duh, ignoring the fact that it should be called REAR which is a very very very nasty name) ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/scripting-languages-not-just-for-toys-a-ruby-web-framework/tools/20040324/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book review &#8211; Tapestry In Action</title>
		<link>http://www.netuality.ro/book-review-tapestry-in-action/books/20040318</link>
		<comments>http://www.netuality.ro/book-review-tapestry-in-action/books/20040318#comments</comments>
		<pubDate>Thu, 18 Mar 2004 11:56:39 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/book-review-tapestry-in-action/uncategorized/20040318</guid>
		<description><![CDATA[My first contact with Tapestry was more than 18 months ago. Back then, I was interested to find a web framework for integration with our custom Avalon-based (using the now-obsoleted) Phoenix server*. The web interface was ment to be backoffice stuff, for simple administration tasks as well as statistics reports. Given that the data access [...]]]></description>
			<content:encoded><![CDATA[<p>My first contact with Tapestry was more than 18 months ago. Back then, I was interested to find a web framework for integration with our custom Avalon-based (using the now-obsoleted) Phoenix server*. The web interface was ment to be backoffice stuff, for simple administration tasks as well as statistics reports. Given that the data access and bussines logic were already developed, we were looking for something simple to plug into a no-frills servlet container such as Jetty. we managed very easily to integrate Jetty as a Phoenix service and pass data through the engine context. But when we finally integrated Tapestry [into Jetty [inside Phoenix]] and make it display some aggregated statistics, the project funding was cut and the startup went south. But, that&#8217;s another story and rather uninteresting one.</p>
<p>Meanwhile, things have changed a bit. Tapestry had become a firsthand <a href="http://jakarta.apache.org/tapestry/" target="_new">Apache Jakarta</a> project, the Tapestry <a href="http://news.gmane.org/gmane.comp.java.tapestry.user" target="_new">users list</a> is more and more crowded, and again I see it used in my day work (by Teodor Danciu, one of my coworkers and incidentally author of <a href="http://jasperreports.sourceforge.net/" target="_new">Jasper Reports</a>) and doing some moonlighting by myself for an older web project idea. And there is exceptional Eclipse support via <a href="http://sourceforge.net/projects/spindle" target="_new">Spindle</a> plugin. While the &#8216;buzzword impact&#8217; on Tapestry on a Java developer CV doesn&#8217;t yet measure up with Struts, this framework has obviously gained a lot of attention lately.</p>
<p>So, what&#8217;s so special about it ? If I&#8217;d have to choose only one small phrase I&#8217;d quote <a href="http://howardlewisship.com/blog/" target="_new">Howard Lewis Ship</a>, Tapestry lead developer, from the preface of his book &#8216;Tapestry in Action&#8217;:</p>
<p><strong>The central goal of Tapestry is to make the <em>easiest</em> choice the <em>correct</em> choice.</strong></p>
<p>In my opinion this is the weight conceptual center of the framework. Everything, from the template system which has <strong>only</strong> the bare minimum scripting power, passing through the componentized model, up to the precise detailed error-reporting (quite unique feature in the opensource frameworks world) gently pushes you (the developer) to Do The Right Thing. To: put logic where it belongs (classes not templates), organize repetitive code in components, ignore the HTTP plumbing and use a real, consistent, MVC model in your apps (forms are readable and <strong>writable</strong> components of your pages). You don&#8217;t need to be Harry Tuttle to make a good Tapestry webapp, just a decent Java developer is enough. That&#8217;s more than I can tell about Struts &#8230;</p>
<p>Coming from a classic JSP-based webapp world, Tapestry is really a culture shock. The most appropriate way to visualise the difference is to imagine a pure C programmer abruptly passing to C++, into the objects world**. For a while, he will try to emulate the &#8216;old&#8217; way of work, but soon enough he&#8217;ll give up and start coding his own classes. However, this C programmer will have to make some serious efforts, not necessarily because OOP is hard to leard, but in order to break his/her old habits.</p>
<p>&#8220;Tapestry in Action&#8221; is your exit route from the ugly world of HTTP stateless pages and spaghetti HTML intertwingled with Java code and various macros. It&#8217; one of the best JSP detoxification pills available on the market right now.</p>
<p>The first part of the book (&#8216;Using basic Tapestry components&#8217;) is nothing to brag about. It&#8217;s basically an updated and nicely organized version of the various tutorials already available via the Tapestry site, excepting probably some sections in chapter 5 (&#8216;Form input validation&#8217;). By the way, the chapter 5 is freely <a href="http://www.manning.com/catalog/view.php?book=lewisship&amp;item=chapters" target="_new">downloadable</a> on the Manning site and is a perfect read if you want a glimpse of the fundamental differences between Tapestry and a classic web framework (form validation being an essential part of any dynamic site). However, if you want to go over the &#8216;Hangman&#8217;*** phase you really need to dig into the next two book sections.</p>
<p>The second section &#8216;Creating Tapestry components&#8217; is less covered by the documentation and tutorials. I&#8217;m specifically pointing here to the subsections &#8216;Tapestry under the hood&#8217; (juicy details about pages and components lifecycle) and &#8216;Advanced techniques&#8217; (there&#8217;s even an &#8216;Integrating with JSP&#8217; chapter !). While it is true that any point from this chapter will generally be revealed by a search on Tapestry user list or (if you&#8217;re patient) by a kind soul answering your question on this same list, it&#8217;s nethertheless a good thing to have all the answers nicely organized on the corner of your desk.</p>
<p>The third and last chapter (&#8216;Building complete Tapestry application&#8217;) is a complete novelty for Tapestry fans. It&#8217;s basically a thorough description of how to build a web application (a &#8216;virtual library&#8217;) from scratch using Tapestry. While the Jboss-EJB combination chosen by the author is not exactly my cup of tea (I&#8217;m rather into the Jetty+Picocontainer+Hibernate stuff) I can understand the strong appeal that it is suppposed to have among the J2EE jocks. Anyway, given the componentized nature of Tapestry, I should be able to migrate it relatively easily if I feel the need for it. The example app is contained in a hefty 1Meg downloadable archive of sources, build and deployment scripts included.</p>
<p>To conclude, &#8216;Tapestry in Action&#8217; is a great book about how to change the way you are developing web applications. The steep learning courve is a little price to pay for a two or three-fold improvement in overall productivity. And this book should get you started really quick.</p>
<p>*Which AFAIK is still used at our former customer.<br />
**There were some posts on Tapestry user list on about a certain conceptual ressemblance with Apple&#8217;s WebObjects. I can&#8217;t really pronounce upon this because I do not know WebObjects, but the name in itself is an interesting clue.<br />
***&#8217;Hangman&#8217; is the Tapestry &#8216;Petshop&#8217; (although there is also a &#8216;real&#8217; Tapestry Petshop referenced in the Wiki).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/book-review-tapestry-in-action/books/20040318/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ant goodies : extracting info from Eclipse .classpath</title>
		<link>http://www.netuality.ro/ant-goodies-extracting-info-from-eclipse-classpath/tools/20040301</link>
		<comments>http://www.netuality.ro/ant-goodies-extracting-info-from-eclipse-classpath/tools/20040301#comments</comments>
		<pubDate>Mon, 01 Mar 2004 14:17:04 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/ant-goodies-extracting-info-from-eclipse-classpath/uncategorized/20040301</guid>
		<description><![CDATA[IMPORTANT UPDATE: Please note that &apos;antclipse&apos; is now part of the ant-contrib at Sourceforge, under Apache licence. Original blogpost: I hate duplicating information manually &#8211; besides, it&apos;s a known fact that duplication is classic code smell that tells you to refactor. This time it&apos;s not Java code, but something somewhat different : Ant used in [...]]]></description>
			<content:encoded><![CDATA[<p><strong>IMPORTANT UPDATE</strong>: Please note that &apos;antclipse&apos; is now part of the <a href="http://ant-contrib.sourceforge.net/" target="_new">ant-contrib</a> at Sourceforge, under Apache licence.<br/><br />
Original blogpost:<br/><br />
I hate duplicating information manually &#8211; besides, it&apos;s a known fact that duplication is classic code smell that tells you to refactor. This time it&apos;s not Java code, but something somewhat different : Ant used in Eclipse context. The issue here is that .classpath files generated by Eclipse have important information which is usually duplicated by hand in the build.xml script. SO many times I&apos;ve changed libraries in my project in Eclipse just to discover that Ant task was broken&#8230;<br/><br />
There surely are some workarounds like the task written by <a HREF="http://members.optushome.com.au/tomdavies/eclipse.html" target="_new">Tom Davies</a> but unfortunately:</p>
<ul>
<li>It&apos;s an Eclipse plugin. I want to be able to build my project standalone, we don&apos;t need no stinkin&apos; plugin.</li>
<li>I&apos;s rather old and with a Nazi style checking of tags so it pukes on my 3.0M3 complaining about a certain attribute of type &#8220;con&#8221; in the .classpath file (lesson learned: don&apos;t be picky about tags and attributes names, if you want the plugin to work with future versions of the software which produced the XML document, <b>especially</b> when you do not have a schema or DTD to rely on)</li>
<li>It&apos;s Friday evening, dark weather outside, I&apos;m alone in the house and the TV is broken (and even if it worked, there&apos;s nothing to see on TV anyway). Boys and girls, let&apos;s write an Ant task !</li>
</ul>
<p>From the documentation, it appears that writing an Ant task should be an easy task <img src='http://www.netuality.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . And yes, it is, once you go past all the little idiosyncracies. Like mandatory &#8220;to&#8221; string in a RegexpPatternMapper, although all you want to do is matching, not replacing. Like having completely different mechanisms for Path and FileSet (I&apos;ve always thought a Path is a &#8220;dumbed down&#8221; FileSet, but I was completely wrong, a fileset is somewhat &#8220;smarter&#8221; but it only has a single directory).<br/><br />
The result is <a HREF="http://www.jroller.com/resources/aspinei/antclipse.jar" target="_new">here</a>, and everything you have to do is to download and put the antclipse.jar (7kB) in your ant/lib library and you&apos;re set (just remember to refresh Ant classpath if you&apos;re launching Ant from Eclipse).<br/><br />
What does it do ? Well, it creates classpaths or filesets based on your current .classpath file generated by Eclipse, according to the following parameters :<br/></p>
<table width="100%" border="0" cellpadding="2" cellspacing="2" bgcolor="#DDDDEE">
<tr>
<td bgcolor="#DDE4DD">Attribute</td>
<td bgcolor="#DDE4DD">Description</td>
<td bgcolor="#DDE4DD">Required</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>produce</em></td>
<td bgcolor="#DDE4DD">This parameter tells the task wether to produce a &#8220;classpath&#8221; or a &#8220;fileset&#8221; (multiple filesets, as a matter of fact).</td>
<td bgcolor="#DDE4DD">Yes</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>idcontainer</em></td>
<td bgcolor="#DDE4DD">The refid which will serve to identify the deliverables. When multiple filesets are produces, their refid is a concatenation between this value and something else (usually obtained from a path). Default &#8220;antclipse&#8221;</td>
<td bgcolor="#DDE4DD">No</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>includelibs</em></td>
<td bgcolor="#DDE4DD">Boolean, whether to include or not the project libraries. Default is true.</td>
<td bgcolor="#DDE4DD">No</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>includesource</em></td>
<td bgcolor="#DDE4DD">Boolean, whether to include or not the project source directories. Default is false.</td>
<td bgcolor="#DDE4DD">No</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>includeoutput</em></td>
<td bgcolor="#DDE4DD">Boolean, whether to include or not the project output directories. Default is false.</td>
<td bgcolor="#DDE4DD">No</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>verbose</em></td>
<td bgcolor="#DDE4DD">Boolean, telling the app to throw some info during each step. Default is false.</td>
<td bgcolor="#DDE4DD">No</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>includes</em></td>
<td bgcolor="#DDE4DD">A regexp for files to include. It is taken into account only when producing a classpath, doesn&apos;t work on source or output files. It is a real regexp, not a &#8220;*&#8221; expression.</td>
<td bgcolor="#DDE4DD">No</td>
</tr>
<tr>
<td bgcolor="#DDE4DD"><em>excludes</em></td>
<td bgcolor="#DDE4DD">A regexp for files to exclude. It is taken into account only when producing a classpath, doesn&apos;t work on source or output files. It is a real regexp, not a &#8220;*&#8221; expression.</td>
<td bgcolor="#DDE4DD">No</td>
</tr>
</table>
<p>Classpath creation is simple, it just produces a classpath that you can subsequently retrieve by its refid. The filesets are a little trickier, because the task is producing a fileset per directory in the case of sources and another separate fileset for the output file. Which is not necessarily bad, since the content of each directory usually serves a different purpose. Now, in order to avoit conflicting refids each fileset has a name composed by the idcontainer, followed by a dash and postfixed by the path. Supposing that your output path is <b>bin/classes</b> and the idcontainer is default, the task will create a fileset with refid <b>antclipse-bin/classes</b>. The fileset will include all the files contained in your output directory, but <b>without</b> the trailing path bin/classes (as you usually strip it when creating the distribution jar). If you have two source directories, called <b>src</b> and <b>test</b>, you&apos;ll be provided with two filesets, with refids like <b>antclipse-src</b> and <b>antclipse-test</b>.<br/><br />
However, you don&apos;t have to code manually the path since some properties are created as a &#8220;byproduct&#8221; each time you execute the task. Their name is idref postfixed by &#8220;outpath&#8221; and &#8220;srcpath&#8221; (in the case of the source, you&apos;ll find the location of the first source directory).<br/><br />
A pretty self-explanatory Ant script follows (&#8220;xml&#8221; is a forbidden file type on jroller, so just copy paste it into your favourite text editor). Note that nothing is hardcoded, it&apos;s an adaptable Ant script which should work in any Eclipse project.<br/></p>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#DDDDEE">
<tr>
<td width="100%">
<pre>
Created with Colorer-take5 Library. Type &apos;ant&apos;
<span style=&apos;color:#7f0055; &apos;>&lt;?</span><span style=&apos;color:#7f0055; &apos;>xml</span> <span style=&apos;color:#7f0055; &apos;>version</span>="1.0"<span style=&apos;color:#7f0055; &apos;>?></span><br/>
<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>project</span> default=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>compile</span><span style=&apos;color:#2a00ff; &apos;>"</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>test</span><span style=&apos;color:#2a00ff; &apos;>"</span> basedir=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>.</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span>
<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>taskdef</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>antclipse</span><span style=&apos;color:#2a00ff; &apos;>"</span> classname=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>fr.infologic.antclipse.ClassPathTask</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><br/>

<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>make.fs.output</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
	<span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> creates a fileset including all the files from the output directory, called ecl1-bin if your binary directory is bin/ </span><span style=&apos;color:#3f7f59; &apos;>--></span><br/>
	<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; &apos;>antclipse</span> produce=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>fileset</span><span style=&apos;color:#2a00ff; &apos;>"</span> idcontainer=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>ecl1</span><span style=&apos;color:#2a00ff; &apos;>"</span> includeoutput=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>true</span><span style=&apos;color:#2a00ff; &apos;>"</span> includesource=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>false</span><span style=&apos;color:#2a00ff; &apos;>"</span><br/>
	includelibs=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>false</span><span style=&apos;color:#2a00ff; &apos;>"</span> verbose=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>true</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span>
<span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
<br/>
<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>make.fs.sources</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
	<span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> creates a fileset for each source directory, called ecl2-*source-dir-name*/ </span><span style=&apos;color:#3f7f59; &apos;>--></span><br/>
	<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; &apos;>antclipse</span> produce=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>fileset</span><span style=&apos;color:#2a00ff; &apos;>"</span> idcontainer=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>ecl2</span><span style=&apos;color:#2a00ff; &apos;>"</span> includeoutput=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>false</span><span style=&apos;color:#2a00ff; &apos;>"</span> includesource=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>true</span><span style=&apos;color:#2a00ff; &apos;>"</span>
	includelibs=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>false</span><span style=&apos;color:#2a00ff; &apos;>"</span> verbose=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>true</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><br/>
<span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
<br/>
<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>make.fs.libs</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
	<span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> creates a fileset sontaining all your project libs called ecl3/ </span><span style=&apos;color:#3f7f59; &apos;>--></span><br/>
	<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; &apos;>antclipse</span> produce=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>fileset</span><span style=&apos;color:#2a00ff; &apos;>"</span> idcontainer=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>ecl3</span><span style=&apos;color:#2a00ff; &apos;>"</span> verbose=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>true</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><br/>
<span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
<br/>
<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>make.cp</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
	<span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> creates a fileset sontaining all your project libs called ecl3/ </span><span style=&apos;color:#3f7f59; &apos;>--></span><br/>
	<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; &apos;>antclipse</span> produce=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>classpath</span><span style=&apos;color:#2a00ff; &apos;>"</span> idcontainer=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>eclp</span><span style=&apos;color:#2a00ff; &apos;>"</span> verbose=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>true</span><span style=&apos;color:#2a00ff; &apos;>"</span> includeoutput=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>true</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><br/>
<span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
<br/>
<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>compile</span><span style=&apos;color:#2a00ff; &apos;>"</span> depends=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>make.fs.libs, make.fs.output, make.fs.sources, make.cp</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
    <span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>echo</span> message=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>The output path is $</span><span style=&apos;color:#2a00ff; &apos;>{ecl1outpath}</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><br/>
    <span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>echo</span> message=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>The source path is $</span><span style=&apos;color:#2a00ff; &apos;>{ecl2srcpath}</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><br/>
    <span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> makes a jar file with the content of the output directory </span><span style=&apos;color:#3f7f59; &apos;>--></span><br/>
	<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>zip</span> destfile=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>out.jar</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>fileset</span> refid=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>ecl1-${</span><span style=&apos;color:#2a00ff; &apos;>ecl1outpath}</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>zip</span><span style=&apos;color:#7f0055; &apos;>></span>
	<span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> makes a zip file with all your sources (supposing you have only source directory) </span><span style=&apos;color:#3f7f59; &apos;>--></span><br/>
	 <span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>zip</span> destfile=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>src.zip</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>fileset</span> refid=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>ecl2-${</span><span style=&apos;color:#2a00ff; &apos;>ecl2srcpath}</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>zip</span><span style=&apos;color:#7f0055; &apos;>></span>
	<span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> makes a big zip file with all your project libraries </span><span style=&apos;color:#3f7f59; &apos;>--></span><br/>
	 <span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>zip</span> destfile=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>libs.zip</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>></span><span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>fileset</span> refid=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>ecl3</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>zip</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
	 <span style=&apos;color:#3f7f59; &apos;>&lt;!--</span><span style=&apos;color:#3f7f59; &apos;> imports the classpath into a property then echoes the property </span><span style=&apos;color:#3f7f59; &apos;>--></span>
	 <span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>property</span> name=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>cpcontent</span><span style=&apos;color:#2a00ff; &apos;>"</span> refid=<span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#2a00ff; &apos;>eclp</span><span style=&apos;color:#2a00ff; &apos;>"</span><span style=&apos;color:#7f0055; &apos;>/></span><br/>
	<span style=&apos;color:#7f0055; &apos;>&lt;</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>echo</span><span style=&apos;color:#7f0055; &apos;>></span>The newly created classpath is ${cpcontent}<span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>echo</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
<span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>target</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
<span style=&apos;color:#7f0055; &apos;>&lt;/</span><span style=&apos;color:#7f0055; font-weight:bold; &apos;>project</span><span style=&apos;color:#7f0055; &apos;>></span><br/>
</pre>
</td>
</tr>
</table>
<p>TODOS : make &#8220;includes&#8221; and &#8220;excludes&#8221; to work on the source and output filesets, find an elegant solution to this multiple fileset/directories issues, and most important make it work with files referenced in other projects.<br/><br />
I am aware that the task is very far from being perfect, so just download it if you&apos;re interested, try to use it, try to break it, and tell me what you think and how it can be improved. Also, if you&apos;re interested in the source, just send me an <a HREF="mailto:aspinei@myrealbox.com">email</a>, but be aware that it&apos;s Friday evening beer-induced source code, nothing to be proud of&#8230; It was only tested it with Ant 1.5.x so YMMV. I assume no responsibility if you use it a production environment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/ant-goodies-extracting-info-from-eclipse-classpath/tools/20040301/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8230; want to know what trouble means for a distributed project ?</title>
		<link>http://www.netuality.ro/want-to-know-what-trouble-means-for-a-distributed-project/articles/20040131</link>
		<comments>http://www.netuality.ro/want-to-know-what-trouble-means-for-a-distributed-project/articles/20040131#comments</comments>
		<pubDate>Sat, 31 Jan 2004 07:36:26 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[IEEE]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/want-to-know-what-trouble-means-for-a-distributed-project/uncategorized/20040131</guid>
		<description><![CDATA[&#8220;The project was complex-the USS Monitor had 47 different patentable inventions on board at launch. (Think you have integration problems?) When the pieces arrived at the shipyard from the foundries, they fit together poorly and much retrofitting had to be done. This affected the schedule and standards of quality. Thus, there was a rushed final [...]]]></description>
			<content:encoded><![CDATA[<p><em>&#8220;The project was complex-the USS Monitor had 47 different patentable inventions on board at launch. (Think you have integration problems?) When the pieces arrived at the shipyard from the foundries, they fit together poorly and much retrofitting had to be done. This affected the schedule and standards of quality. Thus, there was a rushed final integration effort and a couple of trial run retrofits. Although the ship&apos;s first battle in 1862 against the larger but less maneuverable ironclad CSS Virginia was successful (both sides declared victory-and wooden warships became a thing of the past), the USS Monitor sank a few months later on New Year&apos;s Eve while under tow in rough seas.&#8221;</em><br/><br />
Quote from a must-read <a href="http://www.acmqueue.com/modules.php?name=Content&#038;pa=showpage&#038;pid=101" target="_new">article</a> : Distributed Development Lessons Learned, ACM Queue vol. 1, no. 9 &#8211; December/January 2003-2004 by Michael Turnlund, Cisco Systems.<br/><br />
I have only recently descovered ACM Queue (via <a href="http://mparaz.com/wordpress/index.php?p=66" target="_new">Miguel</a>) and think that&apos;s a great resource. I have also found out that a new free, limited account is available on <a href="http://portal.acm.org/dl.cfm" target="_new">ACM Digital Library</a> ? It&apos;s nicely complementing my IEEE Computer subscription (altough I never have to the time to read everything I want to, it&apos;s a warm, nice, fuzzy feeling to know that more and more articles are available <img src='http://www.netuality.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/want-to-know-what-trouble-means-for-a-distributed-project/articles/20040131/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven-less Codehaus</title>
		<link>http://www.netuality.ro/maven-less-codehaus/tools/20031206</link>
		<comments>http://www.netuality.ro/maven-less-codehaus/tools/20031206#comments</comments>
		<pubDate>Sat, 06 Dec 2003 13:31:57 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/maven-less-codehaus/uncategorized/20031206</guid>
		<description><![CDATA[While I think that Codehaus is an exceptional provider of open-source software (some of the projects hosted there are really shining), I&apos;m a little horrified by all their Maven-generated sites. It&apos;s not because I&apos;m ignorant to Maven usefulness, but BECAUSE I&apos;ve worked extensively with Maven since the beta7 days (August 2002, if i remember well [...]]]></description>
			<content:encoded><![CDATA[<p>While I think that <a HREF="http://www.codehaus.org" target="_new">Codehaus</a> is an exceptional provider of open-source software (some of the projects hosted there are really shining), I&apos;m a little horrified by all their Maven-generated sites. It&apos;s not because I&apos;m ignorant to Maven usefulness, but BECAUSE I&apos;ve worked extensively with Maven since the beta7 days (August 2002, if i remember well ?) and gave up in April this year, replacing everything with Ant tasks and customized Python scripts. Painful memories of strange bugs (compatibility issues from a version to another, proxy problems, not being able to create a simple and primitive CVS log, or test suites for one of our projects not executing under Maven due to some obscure, unsolved class loader problems) are haunting me. But, the most frustrating issue on Codehaus is the &apos;Mavenized&apos; sites &#8211;  superfluous clicks and a number of pages you have to see again and again just to download the latest version of a certain project &#8230; a not so strange resemblance with the <a HREF="http://www.jroller.com/page/fate/20031201#awkward_download_links" target="_new">horrendous</a> structure of the Jakarta site.<br/><br />
The simplest solution is just ignore the project sites on Codehaus and go directly to the <a HREF="http://dist.codehaus.org/" target="_new">root</a> of the download repository. Only by looking at directories dates, you can guess if a new version was released. And as a small bonus, you&apos;ll find there some (still incubating ?) projects that aren&apos;t even referenced on the Codehaus main page. There is <a HREF="http://jmock.codehaus.org/getting-started.html" target="_new">JMock</a>, which looks like a easier-to-use <a HREF="http://www.easymock.org/index.html" target="_new">EasyMock</a>-like library (but it doesn&apos;t seem like being up to EasyMock on functionality level). And a nice <a HREF="http://spice.codehaus.org/" target="_new">Spice</a> project, a sort of library of IoC-able components with multi-container support, some of them worth a look (JNDIKit, ThreadPool).<br/><br />
You know what would be really nice ? Being able to subscribe to RSS feeds containing release information a la SourceForge &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/maven-less-codehaus/tools/20031206/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acrobat Reader killed my Palm</title>
		<link>http://www.netuality.ro/acrobat-reader-killed-my-palm/andeverythingelse/20031115</link>
		<comments>http://www.netuality.ro/acrobat-reader-killed-my-palm/andeverythingelse/20031115#comments</comments>
		<pubDate>Sat, 15 Nov 2003 14:33:05 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[AndEverythingElse]]></category>
		<category><![CDATA[IEEE]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/acrobat-reader-killed-my-palm/uncategorized/20031115</guid>
		<description><![CDATA[You can tell that my Palm m105 is not exactly bleeding edge. Both by its rather bland dark ugly look (completely out of fashion compared with today&apos;s shiny brigh colored semi-transparent PDAs) and its feature list which does not include webcam, MP3 player, Internet browsing and Office compatibility. However, back to 2001 when I received [...]]]></description>
			<content:encoded><![CDATA[<p>You can tell that my Palm m105 is not exactly bleeding edge. Both by its rather bland dark ugly look (completely out of fashion compared with today&apos;s shiny brigh colored semi-transparent PDAs) and its feature list which does not include webcam, MP3 player, Internet browsing and Office compatibility. However, back to 2001 when I received it as a gift it was a pretty decent machine.<br/><br />
Nevertheless, this little piece of silicone and glass is playing an important role in my life. I keep my agenda and calendar on it, I use it as an alarm clock and especially for evening reading. Instead of printing articles and waste trees, I use <a HREF="http://www.pyrite.org/" target="_new">Pyrite publisher</a> to easily convert between major formats and store files on Palm for subsequent reading.<br/><br />
PDF is a major format, but haven&apos;t really felt the need to convert it to Palm-readable until recently. As a IEEE Computer subscriber, I have access to the <a HREF="http://www.computer.org/publications/dlib/" target="_new">Digital Library</a>, where articles are first published in PDF format, then &#8211; only after a few weeks &#8211; in HTML. My first thought was to save files as TXT from Acrobat Reader (6), but it&apos;s a no-no (although, I vaguely remember being able to save in a different format from Acrobat 5). OK then, let&apos;s just use the text tool, select everything and copy/paste into an editor. Well &#8211; stupid design flaw or feature crippled on purpose &#8211; the text selection can be done only INSIDE a single page. So &#8211; 20 pages mean 20 copy/paste operations. Ctrl-A does select only text from the current page. Then, I tried to bypass the &#8220;functionality&#8221; by using automation and the ActiveX Acrobat control. More or less expected, the control does not allow usage of text tool and selection is not possible (yes you can display documents, walk through them page by page, but that&apos;s the most you can do). Grrr.<br/><br />
My hope that GhostScript and GhostView could perform a text extraction proved utopic. Yes it probably works on some simple test files, but on Computer&apos;s documents with different layouts and formats and their inserted textboxes it either produce a completely unreadable textfile or it simply fails with a cryptic error.<br/><br />
All this left me with only two choices : buy a conversion product (huh, is there a market for such a thing ?) or use Adobe Acrobat for Palm, latest (3.05) version. My hardware is in the supported list, I have a hefty 8MB of RAM on my Palm so I decided to go with the latter. It was a mistake.<br/><br />
First, PDF &#8220;conversion&#8221; of files does almost nothing to reduce file size. If you start with a 3MB PDF, you&apos;ll end up loading a 3MB PDF into your Palm (that is, if you have the available memory). Go on, check graphic resize in preferences &#8211; it&apos;s NOT helping. Second, it&apos;s slow as hell. A few seconds to pass from a page to another. But what the heck, I could read PDF documents and this was my initial purpose. Alas, it was too early to declare victory.<br/><br />
My reading pattern in bed is quite simple : I read until I&apos;m too asleep to continue, then put my Palm next to the bed and turn off the light. Don&apos;t even bother turning off the Palm, since it automatically turns off after 30 seconds of inactivity. That is, until I had installed Adobe Acrobat.<br/><br />
Next morning, instead of the familiar tut-tut-tut of my Palm alarm clock, there is someone knocking energically at the door. And surprise-surprise, it&apos;s not 7 o&apos;clock but almost 9 ! It was another day when I was supposed to be the driver and give a lift to the office to other 3 co-workers, usually leaving around 8:20. No wonder they were at my door wondering if I was sick or something. No, I was perfectly well and my Palm was alive and kicking, still on and displaying happily the now familiar Acrobat screen with the last page from the previous night. The Palm was FREEZED, unresponsive to any button and only the hidden reset switch from the back had managed to provoke some faint reaction. I left in a big hurry.<br/><br />
After a long day back in the evening, almost forgotten the incident, watched a movie, read some blogs and back to bed. No reading this time. But it seems that, after a whole night turned on, the AAA batteries are low so I can&apos;t turn on the alarm clock (what sort of idiosincracy is this, forbidding an action because the batteries are low). It was too late to call anybody, so I ended up WARMING the Palm to trick it into thinking that the batteries are a tad more active and allow me to activate the alarm clock. So much for the useful things learned in the electronics classes.<br/><br />
Anyway, the next synch crashed on me, and the synch after, and the few subsequent retries. It calmed down only after uninstalling Acrobat. So I guess it was not a victory after all. From now on, I&apos;ll stick with reading simple plain text files on my Palm. Anyway, Reader is a free product after all so I&apos;ll stop the rant here &#8211; but I was expecting something more from a company such as Adobe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/acrobat-reader-killed-my-palm/andeverythingelse/20031115/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This rocks : Bugzilla plugin for Eclipse !</title>
		<link>http://www.netuality.ro/this-rocks-bugzilla-plugin-for-eclipse/tools/20031103</link>
		<comments>http://www.netuality.ro/this-rocks-bugzilla-plugin-for-eclipse/tools/20031103#comments</comments>
		<pubDate>Mon, 03 Nov 2003 20:32:59 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/this-rocks-bugzilla-plugin-for-eclipse/uncategorized/20031103</guid>
		<description><![CDATA[This evening, I was searching for something completely unrelated. In the lines of how to use Eclipse CVS library (ccvs.core) in a standalone &#8220;eclipse-less&#8221; context (is this possible, by the way ?). Stumbled upon this interesting project called Hipikat, from the Software Practices Lab of University of British Columbia, CA, Computer Science department, of course. [...]]]></description>
			<content:encoded><![CDATA[<p>This evening, I was searching for something completely unrelated. In the lines of how to use Eclipse CVS library (ccvs.core) in a standalone &#8220;eclipse-less&#8221; context (is this possible, by the way ?). Stumbled upon this interesting project called <a HREF="http://www.cs.ubc.ca/labs/spl/projects/hipikat/index.html" target="_new">Hipikat</a>, from the Software Practices Lab of <a HREF="http://www.cs.ubc.ca/" target="_new">University of British Columbia</a>, CA, Computer Science department, of course.<br/><br />
I would have downloaded it and put it in my fat &#8220;to_see_later&#8221; folder (which is growing and growing and growing), but suddenly became a little nervous when I noticed that there is a certain &#8220;Bugzilla plugin&#8221; required in order to run the  Hipikat app which by the way is an Eclipse plugin and freely downloadable. I jumped immediately on the update link for Eclipse and (whaddayanow) I have a perfectly functional Bugzilla interface in Eclipse.<br/><br />
It works like a charm and it&apos;s perfectly integrated with Eclipse. You have a search Bugzilla tab, favourite bugs view and even a new bug wizard ! I had no problem to make it work with 2.16.1, but it completely crazed the search view when tried on 2.17.1, needing an Eclipse restart. There are some small glitches here and there, but overall it&apos;s a fine piece of software that I recommend to anybody using Bugzilla on frequent basis.<br/><br />
And i&apos;m pretty sure that if they dare to opensource it there are going to be lots of contributors. There is huge potential in the direct integration of a bug database with Eclipse, besides this Hipikat app which I&apos;m going to try right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/this-rocks-bugzilla-plugin-for-eclipse/tools/20031103/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SWT has an older brother &#8230; wx4j</title>
		<link>http://www.netuality.ro/swt-has-an-older-brother-wx4j/tools/20030605</link>
		<comments>http://www.netuality.ro/swt-has-an-older-brother-wx4j/tools/20030605#comments</comments>
		<pubDate>Thu, 05 Jun 2003 11:43:56 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.netoo.loco/swt-has-an-older-brother-wx4j/uncategorized/20030605</guid>
		<description><![CDATA[wx4j is a Java wrapper around the *tried and tested* wxWindows widget framework. The main idea may be similar with one which gave birth to SWT : hide native widgets behing a [more or less] thin layer of Java. By &#8220;native&#8221; I mean widgets for Windows flavours, Linux/Unix with GTK+ or Motif, and MacOS as [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wx4j.sourceforge.net/" target="_new">wx4j</a> is a Java wrapper around the *tried and tested* wxWindows widget framework. The main idea may be similar with one which gave birth to SWT : hide native widgets behing a [more or less] thin layer of Java. By &#8220;native&#8221; I mean widgets for Windows flavours, Linux/Unix with GTK+ or Motif, and MacOS as well. However I see some interesting differences :<br />
+++ source code is available for native wxWindows, however not available for native part of SWT ?!?<br />
+++ wx has considerably more C++ than Java. Some layers such as event loop are native to the OS thus (afaik) faster than SWT&apos;s.<br />
&#8212; what about wxEmbedded ? would be nice to integrate also &#8230; SWT has already made some steps in this direction<br />
&#8212; I find somehow questionable the sanity of the &#8220;native&#8221; approach, because we&apos;ll eventually end up writing small Java control layers manipulating native GUIs and native data sources (<a href="http://otl.sourceforge.net/home.htm" target="_new">OTL</a> anyone ?). But then again, this might be a valid approach.<br />
As well as in SWT, there is some ["non-Javaic"] memory management needed such as destroying transient windows containers and deleting memory used by drawing contexts &#8230; Although the library is extremely young the doc is quite useful, even showing non-obvious things like how to deploy a wx4j app with webstart.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.netuality.ro/swt-has-an-older-brother-wx4j/tools/20030605/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

