<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>Joerg Plewe&apos;s Blog</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/" />
<modified>2008-06-24T19:17:03Z</modified>
<tagline></tagline>
<id>tag:weblogs.java.net,2008:/blog/herkules/195</id>
<generator url="http://www.movabletype.org/" version="3.01D">Movable Type</generator>
<copyright>Copyright (c) 2007, herkules</copyright>
<entry>
<title>WYLIWYT - where you look is where you type in NetBeans</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2007/10/wyliwyt_where_y.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2007-10-04T21:25:23Z</issued>
<id>tag:weblogs.java.net,2007:/blog/herkules/195.8375</id>
<created>2007-10-04T21:25:23Z</created>
<summary type="text/plain">In my latest blog 
 I wrote about the TrackIR device and my Java binding
JTrackIR.
Now what to do with it? What about controlling the IDE with the head?</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: JavaDesktop</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[ In <a href="http://http://weblogs.java.net/blog/herkules/archive/2007/09/head_banging_1.html">my latest blog</a> 
 I wrote about the <a href="http://www.naturalpoint.com/trackir/">TrackIR</a> device and my Java binding
<a href="http://drts.cvs.sourceforge.net/drts/projects/trackir/">JTrackIR</a>. The device allows to track
the users head position and attitude in front of the screen using infrared reflecting strips on a basecap
the user has to wear.
<br>
<br>

Now what to do with it? What about controlling the IDE with the head? Activating different areas 
(editor, properties, output ...) by just looking at them. So that the keyboard focus is always in the window 
I am looking at.
<br>
<br>
A good opportunity for an excercise of 
<a href="http://http://www.netbeans.org">NetBeans</a> module development that I did not do for quite a 
time now (NB5 or so...).
<br>
<br>
Creating the infrastructure for the module was surprisingly easy. Just calling some wizards for a library module wrapping
my <code>jtrackir.jar</code>, a module that does the actual work and a module suite sueing everything together. 
Finally I created a <a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">
<code>TopComponent</code></a> that can control the TrackIR device. I configured the suite to be a standalone application
and added some IDE modules to have some more windows for testing. Very easy.
<br>
The <code>TopComponent</code> is meant to visualize where the user is looking at. For that, a scheme of the current 
<a href="http://http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/Mode.html"><code>Mode</code></a>
layout  - that's how NetBeans calls the different areas of a GUI application - is rendered as it can be seen at the bottom 
left of the screenshot. The red dot is the place I'm currently looking at.
<br>
<br>
	  
<center><img alt="NB_JTrackIR_screenshot.jpg" src="http://weblogs.java.net/blog/herkules/archive/trackir/NB_JTrackIR_screenshot.jpg" width="765" height="620"/></center>
<br>
<br>
To code the functionality I needed some help from the web, but as soon as somebody guide me to 
<a href="http://http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/WindowManager.html"><code>WindowManager</code></a>
the rest was quite easy.	  
<br>
<br>
Using the module requires a bit of practise and fine tuning the 'sensitivity' value. After that, it is possible to 
have the focus really in the window I am looking at. I admit the module is of low practical value, but at least it was fun to 
create the module and get acquainted with some NetBeans APIs e.g. like NbPreferences used to save the sensitivity
value.
<br>
It was my first time creating, starting and debugging an appplication with the NetBeans RCP and I have to say: 
very easy, very cool, it just worked!  I was suprised how fast the edit-compile-debug cycle was (that has to launch 
a full copy of the NetBeans framework) even on my poor notebook.
I can encourage everybody to try it out.
	]]>

</content>
</entry>
<entry>
<title>Head banging...</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2007/09/head_banging_1.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2007-09-30T18:58:35Z</issued>
<id>tag:weblogs.java.net,2007:/blog/herkules/195.8305</id>
<created>2007-09-30T18:58:35Z</created>
<summary type="text/plain">TrackIR is a headtracking device that currently is quite popular amongst gamers, especially in the simulation community. 
JTrackIR is my Java binding. Not a big thing, but maybe useful to somebody.</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: JavaDesktop</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[<p><a href="http://www.naturalpoint.com/trackir/">TrackIR</a> is a headtracking device that currently is quite popular amongst gamers, especially in the simulation community. <br />
It consists of a small device to be placed on top of the monitor and a prepared base cap with three IR reflecting strips.<br />
<a href="http://drts.cvs.sourceforge.net/drts/projects/trackir/">JTrackIR</a> is my Java binding. Not a big thing, but maybe useful to somebody.</p>

<p><br />
<img alt="TrackIR4-laptop-TrackClip-hat.jpg" src="http://weblogs.java.net/blog/herkules/archive/trackir/TrackIR4-laptop-TrackClip-hat.jpg" width="800" height="545" /></p>

<p><img alt="2inch-TRACKIR4-iso-ns.jpg" src="http://weblogs.java.net/blog/herkules/archive/trackir/2inch-TRACKIR4-iso-ns.jpg" width="144" height="100" /></p>

<p>TrackIR shows an impressive resolution and supports all 6 axes (x,y,z,yaw,pitch,roll). So it not only detects the heads attitude but also the translational position  and even the heads distance from the screen. </p>

<p><img alt="6DOFmovement.jpg" src="http://weblogs.java.net/blog/herkules/archive/trackir/6DOFmovement.jpg" width="432" height="110" /></p>

<p><!-- img alt="dof_movement.jpg" src="http://weblogs.java.net/blog/herkules/archive/trackir/dof_movement.jpg" width="432" height="110" /--></p>

<p><!-- img alt="dof_movement.jpg" src="http://weblogs.java.net/blog/herkules/archive/dof_movement.jpg" width="432" height="110" /--></p>

<p>The device is not cheap but also not extraordinary expensive and definitely worth the money if you have a good use-case.</p>

<p>As with all parts of the <a href="http://sourceforge.net/projects/drts">Distributed RealTime Simulation project on SourceForge</a>, the source is available from <a href="http://drts.cvs.sourceforge.net/drts/projects/trackir/">cvs</a>. <br />
The Java source code is free while I'm not allowed to opensource the C/C++ code accessing the TrackIR DLL because it is covered under an NDA. So you have to refer to the compiled binary located in the <em>bin</em> directory.</p>

<p>The API is stupid simple. For there can only be a single device, the API layout is completely static. Here are parts of it:</p>

<pre><code>
public static void setDeveloperID( int id );
public static void update();
public static boolean isOperational();
public static float getRoll();
public static float getPitch();
public static float getYaw();
public static float getX();
public static float getY();
public static float getZ();
...
</code></pre>

<p><br />
The jar file in the <em>bin</em> folder there also contains a simple test UI that paints the values as it is delivered by the device. </p>

<p><!-- If no device is available, Naturalpoint provides a mock server. This is very useful to make sure that the Java API provides the right values. If you like to get it, you have to <a href="http://www.naturalpoint.com/trackir/05-developers/developers-sdk-form.html">request an SDK</a>-->.</p>

<p><br />
<img alt="jtrackir_screenshot.jpg" src="http://weblogs.java.net/blog/herkules/archive/jtrackir_screenshot.jpg" width="279" height="305" />  <br />
<!-- img alt="trackir_mock_screenshot.jpg" src="http://weblogs.java.net/blog/herkules/archive/trackir_mock_screenshot.jpg" width="650" height="432" /--></p>

<p><br />
Currently, JTrackIR is not yet embodied to <a href="http://www.flyingguns.com">FlyingGuns</a>. My own architecture placed the camera far away from the input system, so they are hard to connect :). But there is still some hope.</p>

<p>If you think controlling something with your head and you like to use your head not only for its mental power, JTrackIR allows you to do that easily and your application might proudly show a new logo:<br />
 <img alt="trackir_logo50.jpg" src="http://weblogs.java.net/blog/herkules/archive/trackir_logo50.jpg" width="145" height="50" /></p>

<p><br />
</p>]]>

</content>
</entry>
<entry>
<title>A simple physics/dynamics stack</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2007/09/a_simple_physic.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2007-09-23T18:09:23Z</issued>
<id>tag:weblogs.java.net,2007:/blog/herkules/195.8283</id>
<created>2007-09-23T18:09:23Z</created>
<summary type="text/plain">        Are you doing engineering using Java? Or even science? Than you sometimes might need to calculate how objects move under 
		the impression of forces and torques. The following might be for you then...
</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>J2SE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[        Are you doing engineering using Java? Or even science? Than you sometimes might need to calculate how objects move under 
		the impression of forces and torques. The following might be for you then...
        <br/>
        <br/>
        Maybe somebody of you, dear reader, has already tried out my flight simulator 
		<a href="http://www.flyingguns.com">FlyingGuns</a> which is part of the 
		<a href="http://sourceforge.net/projects/drts">Distributed RealTime Simulation project on SourceForge</a>.
		The flight model of motion is very simple. 
        I call it <em>physically motivated</em> instead of <em>physical</em> because it relies on some heuristics 
		that are not modeled using forces and torques. That is appropriate for a game but not for a true simulator. 
        <br/>
        <br/>
        There is no framework to plug in forces that are then correctly treated. This is the main reason why 
		the airplane cannot land, because there is just no mean to model the forces caused by the undercarriage on the ground.
        <br/>
        <br/>
        In order to change this, I started to develop a simple dynamics framework. 
		It currently is located <a href="http://drts.cvs.sourceforge.net/drts/projects/sandbox/dynamics/"> in the projects sandbox</a> 
		because the API is not fully settled yet.
		With this package, it is easy to define bodies that behave physically correct. This is a 
		piece of sample code to setup a 5kg body with gravity <code>G</code> and a <code>Spring</code>:
        <br/>
        <br/>
		
		<code><pre>
Body body = new Body();
body.setMass(5.0);

KinematicState state = new KinematicState();
state.attitude(QuatUtil.ONEd);		

CompositeForce f = new CompositeForce();
f.addForce(new G(body));

Vector3d springcenter = new Vector3d(0,0,5);
Spring s = new Spring(springcenter, 5 );
f.addForce( s );

Dynamic dynbody = new Dynamic(body, state, f);
		</pre></code>
        <br/>
        <br/>
        
        I call it <em>dynamics stack</em> to keep it apart from a <em>physics engine</em> like 
		<a href="http://odejava.org/">ODEJava</a> or <a href="https://joode.dev.java.net/">JOODE</a>. 
		A <em>physics engine</em> is a far more complex beast dealing a lot with collision detection 
		and - as a main task - computing the appropriate forces. But any <em>physics engine</em> 
		needs some kind of dynamics code under the hood.
        <br/>
        <br/>
        
        There is no secret in how to do that. The math is known for hundreds of years meanwhile. 
		Yet some aspects, esp. those concerning rotational motion are highly unintuitive 
		(it took me 2 years to develop kind of mental image). 
        Having this thoroughly solved makes the value of this package.
        <br/>
        <br/>
        
        <h2>Stack</h2>
        
        Why is it a stack? Because on each level of the stack there is a set of classes implementing the interface of the next lower level. 
		Each level of the stack can be used on its own, omitting higher levels as desired. 
		These are the stacked components:
        
        <ul>
            <li>intergrator</li>
            <li>kinematics</li>
            <li>dynamics</li>
            <li>physics</li>
            <li>application, e.g. flight model</li>
        </ul>
        
<img alt="dynamics_overview.jpg" src="http://weblogs.java.net/blog/herkules/archive/dynamics_overview.jpg" width="958" height="571" />		
        <br/>
        <br/>
        <h2>Integration</h2>
        
        Integration has the task to solve <i>ordinary differential equations</i> (ODE). It gets some initial 
		values and an object that can calculate the resp. derivatives in time d/dt. The integrator has no idea 
		what the values do mean - it has no notion of e.g.  <i>position</i> or <i>speed</i>.
        <br/>
        There are several well-known ways to do that with different quality and performance. 
		My package implements <i>Euler</i> and <i>RungeKutta</i>. While the algorithms are 
		not easy to understand, the resp. code is quite simple because the algorithms are very 
		well described in various <a href="http://www.nrbook.com/a/bookcpdf/c16-1.pdf">textbooks</a> 
		and there are many samples on the net. 
		<i>Cash-Karp</i> (see <a href="http://www.nrbook.com/a/bookcpdf/c16-2.pdf">Numerical Recipes in C</a>) 
		is currently under development.
        <br/>
        <br/>
        
        The <i>Euler</i> integrator is the most simple one basically perfoming:
        <br/>
        <br/>
        
        <code>x_new = x_old + v*dt</code>
        <br/>
        <br/>
        
        Thats very fast, but only works if forces are small and do hardly ever change. 
		A common spring already may blow that approach.
        <i>RungeKutta</i> is much more advanced but also takes (at least) four times more CPU power.
        
        <br/><br/><h2>Kinematics</h2>
        
		Kinematics gives a meaning to terms like <i>position</i> or <i>speed</i> and can transform them to 
		the array of values needed by the integrator. It also respects that we are dealing with second
		order differential equations (eg. position is order 0, velocity is order 1, acceleration is order 2) 
		and transforms them into a system of equations of first order:
		<br/>
        One second order equation
        <code><pre>
			position = f( velocity, acceleration )
        </pre></code>
			
		makes 2x first order equation:
		<code><pre>
			position = f(velocity)
			velocity = f(acceleration)
        </pre></code>
        
		On the kinematics level, the interface <code>Acceleration</code> plays the key role. On this level,
		there still is no notion of a phyical body having <i>mass</i> properties.
        
        <br/><br/><h2>Dynamics</h2>
        
		Dynamics introduces the phyical body having <i>mass</i> and <i>inertia</i>. A class implementing
		the kinematics interface <code>Acceleration</code> converts forces and torques acting on a 
		physical body into acceleration. While this is trivial for translational properties (just divide
		by mass - F=ma - remember?), the rotational parts needs some consideration concerning world-
		and body-fixed coordinate systems and the transforms between them.
        
        On the dynamics level, the interface <code>Force</code> plays the key role.
		
        <br/><br/><h2>Physics</h2>
        
		On this level, forces and torques are defined. It is not truely a level in the stack, but more
		a collection of utilities. There are predefined forces like gravity <i>G</i> or a spring. 
		Conceptually harder is a class called <code>RotatingPart</code> which allows to model parts 
		within a body that do rotate themselves. Think of propellers or turbines as an example. 
		Again, this rotational things are not easy to deal with on an intuitive level.
        
        <br/><br/><h2>Tests</h2>
        
        Now how to test dynamics? I took two approaches. One is the classical unit test comparing the results of
		the integration with a know analytical solution. Here is one taken from a textbook:
<br/><br/>		
		<code><pre>	
// problem 10-32 in my edition of Classical Dynamics by Marion+Thornton
@Test
public void spinningPlate() 
{
    Body b = new Body();

    // I1 = 1, I2 = 2*I1, I3 = I1 + I2
    b.setInertia(new Matrix3d(1.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 3.0));

    KinematicState state = new KinematicState();
    state.omega(new Vector3d(Math.sqrt(3), 0, 1));

    // with no forces and torques, w_body_y(t) should be |w| cos(a) tanh(|w| t sin(a)).
    // a = 30 degrees, so cos(a) = sqrt(3)/2 and sin(a) = 1/2.  the expected result is
    // thus sqrt(3) * tanh(t).		

    Dynamic d = new Dynamic(b, state, Force.NONE );

    double dt = 1.0/1000.0;
    double t = 0;
    for( int i = 0; i &lt; 300; i++ )
    {
        d.progress((long)t, dt);
        t += dt;
//		System.out.println(i + " " + Math.sqrt(3)*Math.tanh(t) + " " +  state.omega().y);
        assertEquals(Math.sqrt(3)*Math.tanh(t), state.omega().y, 0.05 );
    }
}
</pre></code>
<br/><br/>
    The other approach is <i>piecewise comparison</i> with a human judging from the visuals. E.g. assuming euler 
	integration works, I run the system with a RungeKutta integration. The results have to be 
	comparable. The same can be done to show that the calculation of acceleration from forces work correct 
	or that a rotating body behaves like one that does not rotate, but has a rotating part with same 
	inertia.
    <br/><br/>    
    <img alt="screenshot_DynamicSample.jpg" src="http://weblogs.java.net/blog/herkules/archive/screenshot_DynamicSample.jpg" width="431" height="595" />

        <br/><br/><h2>Next</h2>
		
		Things to come (besides an application for a new flight model for FlyingGuns) is some 
		kind of exception handling in case of overstress. Sometime, forces may go beyond their limits
		that e.g. may destroy the structure. This could be implemented using exceptions.
        
        <br/><br/><h2>Links</h2>
        <ul>
            <li><a href="http://www.flyingguns.com">FlyingGuns homepage</a></li>
            <li><a href="http://sourceforge.net/projects/drts">DRTS main project page on SourceForge</a></li>
            <li><a href="http://drts.cvs.sourceforge.net/drts/projects/sandbox/dynamics/">
				Source code of the dynamics package in CVS
			</a></li>
        </ul>
]]>

</content>
</entry>
<entry>
<title>Little helpers for the editor</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2007/01/little_helpers.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2007-01-28T19:30:07Z</issued>
<id>tag:weblogs.java.net,2007:/blog/herkules/195.6428</id>
<created>2007-01-28T19:30:07Z</created>
<summary type="text/plain">The NetBeans source code editor is not known the be the ultimate one these days. But sometimes even small things have big effects and make work more enjoyable.</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[The <a href="http://www.netbeans.org">NetBeans</a> source code editor is not known the be the ultimate one these days. From what I heard and saw, IDEA seems to be #1 in this respect today. But sometimes even small things have big effects and make work more enjoyable.

Sandip Chitale created a set of <a href="http://blogs.sun.com/scblog/entry/line_tools_module_updated">linetools</a> as a NetBeans module that nobody should miss. It gives a liteweight way to work with lines. It's very easy to move lines around or duplicate them (and then move around). The same works with multiline selections. Very handy, for it avoids prior selection of text in many cases.
<br /><br />
Working with that reminded me of an editor feature I created in the glorious times when I was allowed to work in the  <a href="http://en.wikipedia.org/wiki/Forth_%28programming_language%29">Forth</a> programming language (my all-time favorite).
<br /><br />
Those days I had a line- and a character stack. A single keystroke allowed to swallow or copy lines or characters to the stack and spit them out at another place. This was one of the features you'll never miss again once getting used to it. Much better than the common cut/copy/paste based on selections.
<br /><br />
Sandip, please, can you help me (again)?]]>

</content>
</entry>
<entry>
<title>My first CVS checkin 2007</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2006/12/my_first_cvs_ch_1.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2007-01-01T00:47:25Z</issued>
<id>tag:weblogs.java.net,2006:/blog/herkules/195.6229</id>
<created>2007-01-01T00:47:25Z</created>
<summary type="text/plain">Happy coding to everybody in the new year. </summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: Java Games</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[<br /><a href="http://drts.cvs.sourceforge.net/drts/projects/flyingguns/scene3d/shared/java/com/flyingguns/scene3d/features/SustainedFire.java?revision=1.2&amp;view=markup">This is my first CVS checkin 2007!</a><br /><br /><br /><br /><big><font color="#ff0000"><b><big>Happy coding to everybody in the new year.</big></b></font></big><br /><br /><br />

<script type="text/javascript"><br/>&nbsp;z_post_title="My first CVS checkin 2007" z_post_category="<$MTEntryCategory$>"</script>
<script id="stats_script" type="text/javascript" src="http://metrics.performancing.com/mt.js"></script>]]>

</content>
</entry>
<entry>
<title>C with NetBeans on Linux  ... check it out!</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2006/12/c_with_netbeans.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2006-12-21T17:27:49Z</issued>
<id>tag:weblogs.java.net,2006:/blog/herkules/195.6207</id>
<created>2006-12-21T17:27:49Z</created>
<summary type="text/plain">My current project is something with C on Linux. This is no fun, believe me. Especially when you are used to the rich development environment in the Java world.</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: JavaDesktop</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[My current project is something with C on Linux. This is no fun, believe me. Especially when you are used to the rich development environment in the Java world.
<br /><br />
What do we have on Linux? vi, emacs, make, kdevelop, gdb. Ouch.
<br /><br />
Fortunately, Java tools reach out to that foreign, hostile world. First I tried Eclipse/CDT which works pretty well and I use it for my daily development. By far the best thing I could get hold of. The C/C++ module for NetBeans, which was at beta3 those days, was not in a productive state.
<br /><br />
Today, I gave it a second try with all the brand new stuff. JDK6, <a href="http://www.netbeans.org/">NetBeans 5.5</a> and the new <a href="http://www.netbeans.org/products/cplusplus/">C/C++ development pack</a> - surprise, surprise! It looks pretty polished and works like a charm. 
<br /><br />
NB/C wraps very nicely around existing Makefiles. This allowed me to browse a real complex project (&gt;1mio LOC) within the IDE very soon. It also recognized the SVN structure immediately and guided me smoothly to checkin the NB projects just created. Another big plus is that it was very easy to create the NB projects completely separated from the source directories. I missed that in Eclipse (maybe it's my fault). And no more switching between 'perspectives' which I always found annoying. A matter of taste. Also, NetBeans 5.5 runs very smooth even on an X terminal.
<br /><br />
So I had 2 lucky hours today exploring my new toy. Everything was so easy. Maybe tomorrow I will run into the issues. But thats OK for a first release. I'll just post the issues to the NB bug tracker. Typically they do respond quickly.
<br /><br />
What I love about NetBeans is the speed of improvement. Subversion, UML, C/C++ and much more ... all that has been added just recently. So I'm really excited to see what comes next....

<script type="text/javascript"><br/>z_post_title="C with NetBeans on Linux";<br/>z_post_category="<$MTEntryCategory$>";<br/></script>
<script id="stats_script" type="text/javascript" src="http://metrics.performancing.com/mt.js"></script>]]>

</content>
</entry>
<entry>
<title>What people consider interesting...</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2006/11/what_people_con.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2006-11-04T22:19:49Z</issued>
<id>tag:weblogs.java.net,2006:/blog/herkules/195.5867</id>
<created>2006-11-04T22:19:49Z</created>
<summary type="text/plain">Recently I reviewed my blogs access statistics and was quite puzzled why my latest blog about 3D cloud rendering attracted only very few readers. Only about 10% of what I usually have. My expectations have been quite the opposite.</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[Recently I reviewed my blogs access statistics and was quite puzzled why my <a href="http://weblogs.java.net/blog/herkules/archive/2006/10/clouds_in_the_s.html">latest blog about 3D cloud rendering</a> attracted only very few readers. Only about 10% of what I usually have. My expectations have been quite the opposite. 

I though that an unusual topic (not dealing with creation of web pages) is what makes people curious. About what people do with Java besides creating web pages? About something colourful, animated?

People are ten times more fascinated about my thoughts of <a href="http://weblogs.java.net/blog/herkules/archive/2006/08/why_i_dont_use.html">why I cannot use groovy</a>. 


How is that possible? What's wrong?

<script type="text/javascript">
 z_post_title="<$MTEntryTitle$>";
 z_post_category="<$MTEntryCategory$>";
</script>
<script id="stats_script" type="text/javascript" src="http://metrics.performancing.com/mt.js"></script>]]>

</content>
</entry>
<entry>
<title>MS FlightX, FlyingGuns and clouds in the sky</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2006/10/clouds_in_the_s.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2006-10-13T14:17:47Z</issued>
<id>tag:weblogs.java.net,2006:/blog/herkules/195.5727</id>
<created>2006-10-13T14:17:47Z</created>
<summary type="text/plain">For the FlyingGuns project there are so many things to do that I never even started to think about cloud rendering. Fortunately, IndieTechnologies offers its famous particle system GenesisFX. Using genesisfx.jar, a couple of lines of code are sufficient to create clouds that look quite impressive.</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[<a href="http://www.flyingguns.com"><img alt="FlyingGunsSmallLogo.gif" src="http://weblogs.java.net/blog/herkules/archive/images/FlyingGunsSmallLogo.gif" width="111" height="91" border="0" /></a>
 Cloud rendering in 3D games, esp. flight simulators, is not easy. Upcoming <a href="http://www.microsoft.com/games/flightsimulatorx/">Microsoft FlightX</a> does a brilliant job for its clouds (amongst many other brillant things) and I assume there has been more than one developer working on it for ... hours at least.

<br/><br/>

For the <a href="http://www.flyingguns.com">FlyingGuns</a> project there are so many things to do that I never even started to think about cloud rendering. Fortunately, <a href="http://www.indietechnologies.com">IndieTechnologies</a> offers its famous particle system <a href="http://www.indietechnologies.com/products.html">GenesisFX</a>. Using <code>genesisfx.jar</code>, a couple of lines of code are sufficient to create clouds that look quite impressive.

<br/><br/>

<center>
<a href="http://weblogs.java.net/blog/herkules/archive/images/screenshot_02.10.06_1.jpg" onclick="window.open('http://weblogs.java.net/blog/herkules/archive/images/screenshot_02.10.06_1.jpg','popup','width=842,height=719,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img alt="screenshot_02.10.06_1.jpg" src="http://weblogs.java.net/blog/herkules/archive/images/screenshot_02.10.06_1.jpg" width="336" height="284" /></a>
</center>

<br/><br/>
There still is long way towards true clouds, but the ratio of effect/lines_of_code makes the value.

<br/>
Additionally I used GenesisFX to replace some of my own fire/smoke effects for burning planes. Again, very few lines of code - very impressive result.


<br/><br/>

<center>
<a href="http://weblogs.java.net/blog/herkules/archive/screenshot_02.10.06_2.jpg/screenshot_02.10.06_2.jpg" onclick="window.open('http://weblogs.java.net/blog/herkules/archive/screenshot_02.10.06_2.jpg/screenshot_02.10.06_2.jpg','popup','width=842,height=719,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img alt="screenshot_02.10.06_2.jpg" src="http://weblogs.java.net/blog/herkules/archive/screenshot_02.10.06_2.jpg/screenshot_02.10.06_2.jpg" width="336" height="284" /></a>
</center>

<br/><br/>
Now if someone out there feels inspired to create cool graphical effects in a rich environment, just drop me a line. The FlyingGuns project is constantly looking for support. All other sources can be found in the <a href="http://sourceforge.net/projects/drts">projects CVS</a>.
<br/><br/>

<code><pre>
/*
 * Clouds.java
 */

package de.hardcode.threed.terrain;

import com.indie.genesis.j3d.CloudPuff;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

/**
 *
 * @author Herkules
 */
public class Clouds extends TransformGroup
{
	private final static double		RADIUS			= 250.0;
	private final static double		GROUPRADIUS		= RADIUS*12.0;
	private final static float		MIN_BRIGHTNESS	= 0.5f;
	private final static float		MAX_BRIGHTNESS	= 0.8f;
	private final static int		NUM_PUFFS		= 40;
	
	private class Cloud extends TransformGroup
	{
		Cloud()
		{
			CloudPuff cloud = new CloudPuff( (float)RADIUS, getCloudColor() );
			cloud.setAlignmentMode( CloudPuff.ROTATE_ABOUT_AXIS );
			cloud.setAlignmentAxis( 0,1,0 );

			Transform3D tx = new Transform3D();
			tx.setTranslation( new Vector3d(	(Math.random()-0.5)*GROUPRADIUS,
												Math.random()*RADIUS, 
												(Math.random()-0.5)*GROUPRADIUS ) );
			setTransform(tx);
			
			addChild(cloud);
		}
		
		Color3f getCloudColor()
		{
			float c = ((float)Math.random() * (MAX_BRIGHTNESS - MIN_BRIGHTNESS)) + MIN_BRIGHTNESS;
			return new Color3f( c,c,c );
		}
	}
	
	/**
	 * Creates a new instance of Clouds
	 */
	public Clouds( float x, float z, float baseheight )
	{
		Transform3D tx = new Transform3D();
		tx.setTranslation(new Vector3f(x, baseheight + (float)RADIUS/2.0f, z));
		setTransform(tx);
		
		for( int i =0; i<NUM_PUFFS; i++ )
		{
			addChild(new Cloud());
		}
	}
}

</pre></code>


<h2>Links</h2>

<ul>
<li><a href="http://www.flyingguns.com">FlyingGuns</a></li>
<li><a href="http://sourceforge.net/projects/drts">Distributed  realtime simulation - FlyingGuns' parent project</a></li>
<li><a href="http://www.indietechnologies.com">Indie Technologies</a></li>
</ul>

<script type="text/javascript">
 z_post_title="<$MTEntryTitle$>";
 z_post_category="<$MTEntryCategory$>";
</script>
<script id="stats_script" type="text/javascript" src="http://metrics.performancing.com/mt.js"></script>]]>

</content>
</entry>
<entry>
<title>Why I don&apos;t use Groovy: I just cannot.</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2006/08/why_i_dont_use.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2006-08-17T09:35:08Z</issued>
<id>tag:weblogs.java.net,2006:/blog/herkules/195.5373</id>
<created>2006-08-17T09:35:08Z</created>
<summary type="text/plain">Groovy is a cool language and I&apos;d like to use it. But somehow it is very hard....</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[<a href='http://groovy.codehaus.org/'>Groovy</a> is a cool language and I'd like to use it. But how to?
<br/>
<br/>
Whenever I start editing a Groovy script with <a href='http://www.netbeans.org'>my favorite IDE</a>, I notice that I really don't know all the Java APIs by heart. Hands up who can setup BufferedReader/Reader/InputStream/whatever chain without code completion and parameter help in the IDE? Ok, <a href='https://coyote.dev.java.net'>Coyote</a> offers some basic support like syntax coloring, but this doesn't help very much.
<br/>
<br/>
What I always need to do is to open a dummy Java class in parallel and edit all my Java-related expressions there using the full-blown IDE support. When the statement is fine, copy&amp;paste to the Groovy script. But the easy-of-use promised by a sweet syntax is complete compromised by that.
<br/>
<br/>
I'd love to do sketches or API experiments using a scripting language, but for the lack of IDE support this is much easier using Java itself. That's a pitty.
<br/>
From what I here from Eclipse people, the situation over there is pretty much the same.
<br/>
<br/>
So what do <em>you</em> do?]]>

</content>
</entry>
<entry>
<title>NetBeans, Eclipse, IDEA ... pah! VS2003!</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2006/05/netbeans_eclips.html" />
<modified>2008-06-24T19:17:03Z</modified>
<issued>2006-05-16T08:28:17Z</issued>
<id>tag:weblogs.java.net,2006:/blog/herkules/195.4757</id>
<created>2006-05-16T08:28:17Z</created>
<summary type="text/plain">There are many discussions around: which is the best IDE? From my current point of view: take any of these and be happy!</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: Java Tools</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[<p>
There are many discussions around: which is the best IDE? <br/>From my current point of view: take any of these and be happy! Really.
</p>
<p>
When still working in the Java area, I was used to <a href="http://www.netbeans.org">NetBeans</a>. Many of my collegues used <a href="http://www.eclipse.org">Eclipse</a>, the rich ones used <a href="http://www.jetbrains.com/idea/">IDEA</a>. Of course, we flamed and discussed a lot about it. IDE is religion.
</p>
<p>
Nowadays, I have to work with C#/C++ on .NET1.1. The tool of choice: Visual Studio 2003. </br>
</p>
<center><strong>What a contrast!</strong></center></br>
<p>
Although I worked with Visual Studio for years in the past and felt quite comfortable with it - today I miss everything! Visual Studio is <tt>Notepad.exe</tt> plus some small extra features. But most of the features we got used to and that make our daily work so enjoyable are missing:
</p>
<ul>
<li>no <em>usable</em> code completion worth mentioning</li>
<li>no suggestions about exception handling, redundant <tt>using</tt> or namespace qualifiers, types,...
<li>no good VCS integration (beside good'ol SourceSafe, which is not used here)</li>
<li>no refactorings</li>
<li>no 'where used'</li>
<li>no unit testcase generation (<a href="http://www.testdriven.net/">TestDriven</a> helps a bit)</li>
<li>no <em>(insert any point you like about your IDE here)</em></li>
<li>no <em>(insert any point you like about your IDE here)</em></li>
<li>no <em>(insert any point you like about your IDE here)</em></li>
<li>no <em>(insert any point you like about your IDE here)</em></li>
</ul>
<p>
It feels like being kicked back to stoneage. Not even talking about these ugly, cluttered toolbars, these always-too-small, not resizable  dialogs,...
</p>
<p>
Conclusion: if you can use any of the leading Java IDEs, be happy with it. Really happy. Know that you are far ahead us poor VS guys.
</p>]]>

</content>
</entry>
<entry>
<title>db4o and it&apos;s queries</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2005/12/db4o_and_its_qu.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-12-11T11:28:22Z</issued>
<id>tag:weblogs.java.net,2005:/blog/herkules/195.3771</id>
<created>2005-12-11T11:28:22Z</created>
<summary type="text/plain">Being a fan of db4os easy-of-use, I like to guide your attention to this blog, giving a nice overview about the various approaches for queries, esp. the native queries.</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Databases</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[I <a href="http://weblogs.java.net/blog/herkules/archive/2005/02/db4o_persistenc.html">mentioned</a>  the lightweight OODB <a href="http://www.db4o.com">db4o</a> in some <a href="http://weblogs.java.net/blog/herkules/archive/2005/03/a_new_db_benchm.html">earlier</a> blog entries and I admit that I really like that piece of software.
<br/> 
For that, I like to guide your attention to <a href="http://javajeff.blogspot.com/2005/12/db4o-is-pretty-interesting.html">another blog</a>, giving a nice overview about the various approaches for queries, esp. the <a href="http://www.db4o.com/about/productinformation/whitepapers/Native%20Queries%20Whitepaper.pdf">native queries</a> introduced with <a href="http://www.db4o.com/about/news/release/2005_11_14.aspx">db4o V5.0</a>. I feel it is worth reading.]]>

</content>
</entry>
<entry>
<title>&apos;Close&apos; icons on a JTabbedPane w/o UI interference</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2005/10/close_icons_on_1.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-10-29T12:18:54Z</issued>
<id>tag:weblogs.java.net,2005:/blog/herkules/195.3509</id>
<created>2005-10-29T12:18:54Z</created>
<summary type="text/plain"><![CDATA[Many apps require a 'close' icon on a tab of a JTabbedPane. Most solutions require manipulation of the L&amp;F classes. There is another option that works without interference with the UI using proactive icons.]]></summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: JavaDesktop</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[Many apps require a 'close' icon on a tab of a <tt>JTabbedPane</tt>. The solutions I've seen so far all require manipulation of the L&amp;F classes which can be considered bad in many respects.
<br/>
<br/>
There is another option that works without interference with the UI classes. It relies on a special implementation of <tt>Icon</tt> that is sensitive to the mouse itself. Such an icon can be set for each tab (<tt>setIconAt()</tt>).
This solution is far from perfect. E.g. the close icon always appears on the left side of the tabs text. But it is simple, easy to use and works with all L&Fs. The schema might be useful in other areas of icon usage as well.

<br/>
<br/>
<h2>How does it work?</h2>
The implementation of <a href="http://cvs.sourceforge.net/viewcvs.py/drts/projects/util/java/de/hardcode/util/swing/TabCloseIcon.java?view=markup"><tt>CloseTabIcon</tt></a> uses are common <tt>Icon</tt> and delegates all method calls to it. Just, during <tt>paintIcon()</tt>, it remembers the last position the icon has been painted and additionally adds a <tt>MouseListener</tt> to the resp. <tt>Component</tt>. This mouselistener can test wether the mouse button has been pressed above the icon and perform the appropriate action then.
<br/>
<br/>
In order not to loose the possibility to set an icon to the tab that does not close it, I provide another utility class <a href="http://cvs.sourceforge.net/viewcvs.py/drts/projects/util/java/de/hardcode/util/swing/CombinedIcon.java?view=markup"><tt>CombinedIcon</tt></a>. It implements <tt>Icon</tt> and delegates to two <tt>Icon</tt>s given to its constructor. Using <tt>CombinedIcon</tt> and <tt>CloseTabIcon</tt> can create <tt>JTabbedPanes</tt> like this:
<br/>
<br/>
<img src="https://bloggers.dev.java.net/files/documents/84/23174/file_23174.dat?filename=Screenshot%20ClosableTabbedPane%2ejpg"/>

<br/>
<br/>

<pre style="tab-size: 4"><code>
/*
 * TabCloseIcon.java
 */

package de.hardcode.util.swing;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTabbedPane;

/**
 *
 * @author Herkules
 */
public class TabCloseIcon implements Icon
{
	private final Icon mIcon;
	private JTabbedPane mTabbedPane = null;
	private transient Rectangle mPosition = null;
	
	/**
	 * Creates a new instance of TabCloseIcon.
	 */
	public TabCloseIcon( Icon icon )
	{
		mIcon = icon;
	}
	
	
	/**
	 * Creates a new instance of TabCloseIcon.
	 */
	public TabCloseIcon()
	{
		this( new ImageIcon( TabCloseIcon.class.getResource("icons/closeTab.gif")) );
	}
	
	
	/**
	 * when painting, remember last position painted.
	 */
	public void paintIcon(Component c, Graphics g, int x, int y)
	{
		if( null==mTabbedPane )
		{
			mTabbedPane = (JTabbedPane)c;
			mTabbedPane.addMouseListener( new MouseAdapter()
			{
				@Override public void mouseReleased( MouseEvent e )
				{
					// asking for isConsumed is *very* important, otherwise more than one tab might get closed!
					if ( !e.isConsumed()  &&   mPosition.contains( e.getX(), e.getY() ) )
					{
						final int index = mTabbedPane.getSelectedIndex();
						mTabbedPane.remove( index );
						e.consume();
					}
				}
			});
		}
		
		mPosition = new Rectangle( x,y, getIconWidth(), getIconHeight() );
		mIcon.paintIcon(c, g, x, y );
	}
	
	
	/**
	 * just delegate
	 */
	public int getIconWidth()
	{
		return mIcon.getIconWidth();
	}
	
	/**
	 * just delegate
	 */
	public int getIconHeight()
	{
		return mIcon.getIconHeight();
	}
	
}
</code></pre>

<a href="http://cvs.sourceforge.net/viewcvs.py/drts/projects/util/java/de/hardcode/util/swing/">Find the sourcecode here</a> and a <a href="http://cvs.sourceforge.net/viewcvs.py/drts/projects/util/test/de/hardcode/util/swing/TabCloseTest.java?view=markup">usage sample here</a>.]]>

</content>
</entry>
<entry>
<title>L&amp;F getting active! Substantially!</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2005/09/lf_getting_acti.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-09-16T15:46:41Z</issued>
<id>tag:weblogs.java.net,2005:/blog/herkules/195.3265</id>
<created>2005-09-16T15:46:41Z</created>
<summary type="text/plain">Surprise, surprise! L&amp;Fs today don&apos;t just look nice. Some add new features to the GUI! </summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: Java Web Services and XML</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[Surprise, surprise! L&Fs today don't just look nice. Some add new features to the GUI: 
<br/>
<br/>
When I started the daily build of <a href="http://www.netbeans.org">NetBeans</a> with my preferred configuration I noticed a small new button in the menubar. I tried it out. It allows to find and activate any menu item that contains a certain text. For each menuitem a small button with a descriptive tooltip is added. Pushing it drops down the resp. menu. How cool! These NetBeans guys .... ts ts ts.... :)
<br/>
<br/>
<br/>
<center>
<img src= "https://www.dev.java.net/files/documents/84/20745/ScreenshotMenuFinder.jpg"/>
</center>
<br/>
<br/>
<br/>
A moment later I figured out that not NetBeans was doing the magic ... <a href="http://www.jedit.org">jEdit</a> suddenly had the same feature.
<br/>
<br/>
In fact, the <a href="http://substance.dev.java.net">Substance L&F</a> is responsible for that new feature. IMHO thats new: a L&F not only dealing with the L&F but also adding extended GUI features. <br/>
I'm really keen to see what's coming next, go ahead <a href="mailto:kirillcool@dev.java.net">kirillcool</a>!]]>

</content>
</entry>
<entry>
<title>Quick tabbedpane switching w/o sacrifying mnemonics</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2005/09/quick_tabbedpan.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-09-08T11:51:13Z</issued>
<id>tag:weblogs.java.net,2005:/blog/herkules/195.3220</id>
<created>2005-09-08T11:51:13Z</created>
<summary type="text/plain">Having JTabbedPanes with many tabs can be awkward concerning keyboard usage. Per-tab mnemonics are not really an option because they really limit the number of available mnemonics for the tabs own valuable content! The TabSwitcher utility can help!</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: JavaDesktop</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[Having <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTabbedPane.html"><code>JTabbedPane</code>s</a>      
with many tabs can be awkward concerning keyboard usage. Per-tab mnemonics are not really an option because they really limit the number of available mnemonics for the tabs own valuable content!

<br/>
<br/>

Facing this problem, I created the <code>TabSwitcher</code> utility applicable to any <code>JTabbedPane</code>:


<pre><code>new TabSwitcher(tabbedpane, KeyStroke.getKeyStroke(KeyEvent.VK_T, KeyEvent.ALT_DOWN_MASK));</code></pre>

<code>TabSwitcher</code> will automatically pop up when the given <code>KeyStroke</code> occurs on the <code>JTabbedPane</code>. It reflects the current number of tabs with their resp. titles and icons, computes a reasonable set of mnemonics and offers them as a <code>JPopupMenu</code> right at the position of the currently selected tab.

<br/>
<br/>
For the usage is mnemonic-like, I suggest to use an ALT-combination for the <code>KeyStroke</code> (Alt-T in my sample above). 

<br/>
<br/>

<center><img src="https://bloggers.dev.java.net/files/documents/84/20303/ScreenShotTabSwitcher.jpg" alt="screenshot"/></center>

<br/>
<br/>


Find the <a href="http://cvs.sourceforge.net/viewcvs.py/drts/projects/util/java/de/hardcode/util/swing/TabSwitcher.java">sourcecode  here</a> and a <a href="http://cvs.sourceforge.net/viewcvs.py/drts/projects/util/test/de/hardcode/util/swing/TabSwitcherTest.java">usage sample here</a>.]]>

</content>
</entry>
<entry>
<title>Pressing F5 all the day.... waiting for NetBeans 4.1</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/herkules/archive/2005/04/pressing_f5_all_1.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-04-12T17:53:19Z</issued>
<id>tag:weblogs.java.net,2005:/blog/herkules/195.2291</id>
<created>2005-04-12T17:53:19Z</created>
<summary type="text/plain"> These days I tend to press F5 in my favorite browser every couple of minutes. I&apos;m visiting the NetBeans page and cannot wait the delivery of NetBeans 4.1 since the release branch is known to be taken. Sure, 4.0...</summary>
<author>
<name>herkules</name>

<email>plewe@hardcode.de</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/herkules/">
<![CDATA[<p>
These days I tend to press F5 in my favorite browser every couple of minutes. I'm visiting the <a href="http://www.netbeans.org">NetBeans</a> page and cannot wait the delivery of <a href="http://www.netbeans.org/community/releases/41/index.html">NetBeans 4.1</a> since the <a href="http://weblogs.java.net/blog/ttran/archive/2005/04/netbeans_41_bra.html">release branch is known to be taken</a>.
</p>

<p>
Sure, 4.0 has been a big step in the development of NetBeans, but from my point of view (J2SE) introduced a lot of difficulties. I cannot judge how the benefits have been to the J2EE world, but I severely suffered from the new project system. It took huge efforts to create a NetBeans-compatible and <em>usable</em> project structure for the <a href="http://www.flyingguns.com">FlyingGuns</a> project.
<br/>Ok, there have been 1 or 2 refactoring methods but that project system... 
<br/>
It brought me close to switching to Eclipse.
</p>
<p>
For I use to work with the 4.1 daily builds I can say there are huge improvements on that side. So I'm just too eager seeing 4.1 released  so that I can convert my 4.0 projects into a much more usable form. For me, 4.0 could have been skipped. 4.1 now is the truely renewed NetBeans!
</p>

<p>
But there is more to look forward to:
<ul>
<li>multi-sourcedirectory projects (<em>yeah!</em>)</li>
<li>nice editor features (some not very obvious, like treatment of <code>import</code>) and more annotations</li>
<li>Ant debugger</li>
<li>the nice and completely new <a href="http://www.netbeans.org/kb/40/navigator.html">Navigator</a></li>
<li>import of Eclipse projects</li>
<li>direct usage of <a href="http://maven.apache.org/">Maven</a> projects</li>
<li>...</li>
</ul>
</p>

<p>
Just around the corner, the integrated <ahref="http://profiler.netbeans.org/">profiler</a>, improved version control and unit tests and much more is already waiting. The future is bright. 
</p>

<p>Seems today the release won't come any more. So I go home now. But tomorrow, maybe, I'll start pressing F5 again...</p>]]>

</content>
</entry>

</feed>