Thursday, June 30, 2005

Working with Netbeans 4.2 Dev - Part 1

This past week has been an avalanche of new open source announcements. In particular there's been the final release of Eclipse 3.1, a preview of Matisse with the Netbeans 4.2 developer release, and the release of Trolltech's QT 4 for Windows, X11, and Mac OS X under their open source license. In this post I'm going to talk about Netbeans 4.2 and the many new features, large and small.

I downloaded and installed the development version of Netbeans. Given time this will become Netbeans 4.2. This release comes with three new major features that I am aware of; code completion extensions, support for Netbeans module creation, and Matisse, the GUI builder. I'll talk about the GUI builder in this post.

I downloaded the June 28th developer build from the developer build section of the Netbeans website. I downloaded the installer executable for Windows and then ran it. I then edited the file etc/netbeans.conf per the instructions on the Matisse page to enable the GUI construction tool extensions. After that it was a simple matter to fire it up.

I use Eclipse for a lot of Java development, and I've gotten into the habit of right clicking on the Package Explorer pane to create a new project. For Netbeans 4.1 and earlier this does not work. But for Netbeans 4.2 development, it does. Figure 1 shows the Project pop-up for Netbeans 4.2 dev. Figure 2 shows the Package Explorer pop-up for Eclipse 3.1.


Figure 1

Figure 2


Clicking on "New Project produced a project selection dialog (Figure 3) and another surprise. You can now explicitly create two types of Netbean module projects. In fact, it turns out there are now new tutorials for building plugins on the Netbeans site.


Figure 3

Once I had the project created I added a JFrame form to the project (Figure 4). From there I started to add various controls from the Palette.


Figure 4

One of the controls I attempted to add to the JFrame was a vertical slider (see Figure 5). The sliders on the Palette default to horizontal. So I placed the slider on the form and then attempted to change its orientation via the sliders properties panel. That produced an immediate exception. I noticed while working with the slider that every time I touched it I got an exception, until the Netbeans IDE would no longer work stably. I then had to shut down the IDE and start it back up.


Figure 5

The last figure, Figure 6, shows the layout with its indicators. (And yes, I know this is super ugly, but that's not the point). I am very interested to know what the various icons on the layout form mean. The lines are clear enough. They help to line up all the various controls, and they dynamically change as the controls are moved around the form. The semi-circles seem to indicate an anchor point.


Figure 6

Impressions

The layout of Swing controls is clean and fairly intuitive. The alignment lines appear when they're needed, such as when elements line up (along top edges, side edges, or the centers of controls). I've yet to attempt to attach actions to the controls. The code generated by the layout tool is clean and understandable. An attempt to create a radio button group failed for me, but that could be my lack of understanding of how to use the tool properly. Hitting the form preview button on the editor generates a nearly instantanious frame with the controls. On Windows the preview is excellent. Over time the IDE seemed to stutter when adding controls or moving them around, but this may have been due to the exception generated by the slider exercise. Double clicking on any control allowed me to easily change the associated label text. Right clicking on any control brought up its property dialog and allowed me to inspect and change properties. Good.

While the alignment lines are good, I have to wonder what is wrong with the Visual Basic-style of control layout using a grid on the form. Symantec used this with Visual Cafe (Version 3) six years ago back when it was in the Java tools business. Other form creation tools, such as Trolltech's Designer, still use that method with great success. Surely snapping to points on a grid would be easier than what Netbeans Matisse is attempting? What's wrong with Netbeans (or Eclipse, for that matter) using the same style of layout?

Wednesday, June 29, 2005

'War of the Worlds' A Fatally Flawed Failure

Let me start this review off with two quotes.
Science Fiction is speculative fiction in which the author takes as his first postulate the real world as we know it, including all established facts and natural laws. The result can be extremely fantastic in content, but it is not fantasy; it is legitimate - and often very tightly reasoned - speculation about the possibilities of the real world. This category excludes rocket ships that make U-turns, serpent men of Neptune that lust after human maidens, and stories by authors who flunked their Boy Scout merit badge tests in descriptive astronomy.
Robert A. Heinlein from: Ray Guns And Spaceships, in Expanded Universe, Ace, 1981
Science fiction for me is a vacation, a vacation away from all the rules of narrative logic, a vacation away from physics and physical science. It just let's you leave all the rules behind and just kind of fly.
Steven Spielberg from: Reuters Movie News, Wednesday June 29
With Spielberg's words echoing in the back of my mind, I went into the movie with knives drawn ready to draw blood. I was not disappointed. From beginning to end I had all sorts of technical questions for the guy who leaves all the rules behind and just kind of flys:
  1. How could machines that large and that complex have been buried under ground, especially under large metropolitan areas, without having been discovered before now?
  2. Why were the machines were buried under the earth "1 million years ago" according to Ogilvy (Tim Robbins)? Why not just invade then and be done with the task?
  3. If they were buried that long ago how could they still be fully functional?
  4. If the invaders rode down the energy bolts into the buried walkers as the CBS news crew seemed to have recorded, then why couldn't the entire group of walkers have been similarly transported? For that matter, how did the walkers get here and how did they get buried?
  5. Well's original invaders were from Mars. Based on the knowledge of the time, Wells speculated that the Martians, if they existed, would live in an environment without germs. So it was easy to postulate that they would be brought low by our germs because they would have no resistance. But nearly a century has passed since that book was published and we earthlings have traveled to the moon and returned. We quarantined our returning astronauts precisely to avoid bringing in alien organisms that might have hurt us. I can't believe that an advanced civilization capable of the technology inherent in the walkers and of traveling to this world to wreck such havoc would not have thought about possibly fatal alien (to them) contagions. Especially if they had been around at least one million years (see point 2 above) they should have at least figured out that minor plot detail by now.
  6. The alien heat rays had the peculiar property of vaporizing humans to ash but not touching their clothing. Excuse me, but anything powerful (and hot enough) to turn us to ash, especially when we're mostly water, is more than adequate to turn the clothing to ash as well. What's more, there should have been nasty indirect burns on other people near targets that were directly hit.
  7. The EMP effects from the lightning strikes disabling electrical and electronic devices was a nice touch. But when the first walker appeared in the movie, there was a bystander camcording the whole thing.
  8. Etc, etc, etc.
And then, of course, there's the acting (or lack thereof) by all involved.
  1. Dakota Fanning screamed far too much for far too long. She was also a brat ("I have a bad back").
  2. If Justin Chatwin had taken out my vintage Mustang I'd have killed him first and then asked if he was all right. He was way too insubordinate and an overly petulant jerk. No normal male would have put up with that for very long (even a deadbeat dad like Cruise) without busting his chops.
  3. Tom Cruise was too pretty. Too buff, no tattoos, no spare tire as we all saw with the gratuitous shirtless scene early in the movie. And I don't care what anybody says, his acting in this movie was disjoint and unbelievable.
  4. Chatwin is separated from Cruise during a big attack scene where one of the walkers rises up over a hill wreathed in flame and smoke. Yet he miraculously makes it to Boston at the very end of the movie and is reunited with the family.
  5. Tim Robbin's acting engine seemed to be on idle the whole time he was on screen. I expected something harder edged in the Ogilvy character.
  6. Etc., etc., etc.
I've had enough of Cruise, Spielberg, and Fanning. A pox on all their houses. I will never again watch a movie in which they have a significant role.

Good Alternative Science Fiction

The idea of ancient invaders (Martians in this case) buried under the earth for millions of years and then coming back to menace us was the plot of 1967's "Quatermass and the Pit". I saw this movie on TV several years later and found it quite riveting. The movie raised the question: "What if our primate ancestors were modified in such a way that it gave rise to our current limited pyschic abilities?" (This was different from Kubrik's idea that an alien monolith nudged us towards intelligence in 1969's "2001".) The movie dropped lots of interesting hints and ideas (for example the area where the Martian machine was buried was named Hobb's (Devil's) Lane). The buildup was logical and relentless, from the time the Martian ship is first dug up by a construction crew working on the London underground until the Martian ship attempts to re-establish a lost Martian colony (triggering the latent psychic abilities rather horrifically at the end of the movie). I most enjoyed the movie because it was a heroic scientist, Dr. Matthew Roney, who gave his life to destroy the thing the Martian ship had become to save London.

If you want to read about alien invasions that do more than take one volume to cover, then you should read Harry Turtledove's WorldWar series. In this series of books Turtledove creates an alternative history where "the Race" attempts to invade the earth during our WWII. Harry Turtledove knows quite about history, and he uses historical figures (Stalin, Patton, Churchill) along with fictional characters to flesh out a world where the reptilian "Race" fight against humanity. The Race didn't fly here in faster-than-light ships, they have technology that is only a decade or so in advance of WWII technology, and the war is bloody and brutal on both sides. It is an adult's alien invasion story.

Saturday, June 25, 2005

Running With the Netbeans Platform

This is the second of two posts documenting the creation of a Netbeans module, and running it stand-alone on the Netbeans Platform. The first post was Newbee NetBean Module Creation. It's been over a month since that first post, and a lot longer than I intended. Unfortunately life intruded. I'm now on vacation (working around the house on my infinitely long honey-do list) and making the odd post. I've now caught up somewhat and I can relax and look at my other lists of things to do, such as this series.

The Netbeans Platform is the equivalent of the Eclipse Projects Rich Client Platform (or RCP SDK). The significant difference between the Netbeans Platform and the RCP is that the Netbeans Platform will run out-of-the-box (although it is very dull at that point) while the RCP must be combined with a Eclipse plugin and configured to run as a complete application (although this is not hard to do). The Netbeans Platform appears at first blush to be easier to work with.

You need to get the Netbeans Platform. When you go to the download page, make sure to select release 4.1, that you select the release version, and then select the platform you're running on (Windows, Linux, etc). For this example I'm running on Windows, so I'll install netbeans-4_1-platfirm.zip. And as before, it will be installed in my Java work area, C:\Java. In addition, I have created an empty work user directory, C:\Java\nb_test.
  1. To install the Anagrams plug-in/module into the NetBeans Platform, you need to run the platform. Go to the directory where the NetBeans Platform distribution was extracted.
    Change directory into netbeans\platform5\lib (in my case, C:\Java\netbeans\platform5\lib). In this directory is a Windows binary called nbexec. So that you don't collide with the NetBeans settings in your .netbeans directory, you should pass the --userdir [test_dir] arg to nbexec. For instance, to set the C:\Java\nb_test as the userdir for the NetBeans Platform (as well as to just test the platform), you would execute:
    C:> nbexec --userdir C:\Java\nb_test
  2. To illustrate how lightweight the NetBeans Platform is, select the File > View Toolbars and select the checkbox next to Memory. You will now see a Java heap memory usage meter in the NetBeans Platform toolbar. The NetBeans Platform is only using a small amount of Java heap. In this example, it's about 7 meg.

  3. To add the Anagram plug-in / module, select the Tools > Update Center menu item. Click the radio button "Install Manually Downloaded Modules (.nbm Files) and press the Next button.

  4. Click on the Add button and traverse to the directory where you created your Anagram project back in Step 5 of the first post. In the Anagram project directory you will find the an anagrams.nbm file. Select this file and press Ok. Click the Next button. Click the Next button again. The NetBeans Platform will install the anagrams plug-in / module very quickly. Press the Next button again. Check the box next in the "Include" column. The NetBeans Platform will tell you this module is an unsigned plug-in/module and ask if you want to install it anyway. Say, "Yes" to proceed with the installation. Then, press the Finish button.

  5. You will now see a "Games" menu in the NetBeans Platform (see the image at step two above). Go ahead and click on the Games menu and select Anagrams.
One of the advantages of installing plug-ins / modules in the NetBeans IDE is that you can use the NetBeans tools such as the debugger to help debug the plug-in. One of the things you'll need to do in order to re-install the plug-in as you go through the code, compile, test, debug cycle is to remove the old plug-in and its metadata in NetBeans. Unfortunately, you have to do this manually.

If you are working with the NetBeans Platform and you want to remove the plug-in so you can re-install a different one, go to the directory you specified as the --userdir. Above we used C:\Java\nb_test. You will need to remove the following files:
C:\Java\nb_test\update_tracking\com-toys-anagrams.xml
C:\Java\nb_test\config\Modules\com-toys-anagrams.xml
C:\Java\nb_test\modules\anagrams.jar

If you are working with the NetBeans IDE and you want to remove the Anagrams plug-in after you have added it to the NetBeans IDE, go to the C:\Documents and Settings\[username]\.netbeans directory and remove the following files:
4.1\update_tracking\com-toys-anagrams.xml
4.1\config\Modules\com-toys-anagrams.xml
4.1\modules\anagrams.jar

After you have removed these files you will be able make changes to your plug-in / module, rebuild it and re-install it.

Friday, June 24, 2005

JDK 5 Update 4 Just Released

It's getting more and more interesting with Sun's Java. Sun just released it's latest version of Java (1.5 Update 4). What does this mean? First and foremost it means that Netbeans Profiler Milestone 6 can now fully support Java 5. That wasn't supposed to happen until this release. I've looked at the release notes and I can't spot what was fixed or added to allow this to happen, but I will be working with the profiler in Netbeans 4.1 Real Soon Now just to give it a spin.

Another related release are the Q builds for the next version of Netbeans. I'm looking at new code completion extensions added to Netbeans 4.2. I've pulled down the latest Netbeans developer version just to try that out. I decided to try that feature after reading about it in Roumen's blog. Between the immanent release of Matisse, the Q builds, and now this new point release, I'm going to be in geek heaven for a while. Oh, yes, my sandbox system was upgraded to Fedora Core 4, and I've gone back to the bad old habit of running everything on the latest kernel from kernel.org (in this case, it's 2.6.12.1). Sun may want to sell me Solaris on x86, and they may not have fond feelings for Redhat, but for me the combination of FC4 and the latest Java bits makes for one sweet development environment.

Tuesday, June 21, 2005

Jack St. Clair Kilby - In Remembrance

Outside of the invention of the transistor and the microprocessor, the invention of the integrated circuit is one of the seminal electronic inventions of the 20th century. Two men are credited with inventing the integrated circuit, or IC, at essentially the same time: Robert Noyce of Fairchild Semiconductor and Jack Kilby of Texas Instruments. The invention of the IC led directly to the development and production of the microprocessor and other highly complex devices. And those devices have in turn driven contemporary society and shaped it in ways undreamed of even a century ago. While Jack Kilby stayed on with Texas Instruments, Robert Noyce went on to found Intel.

Jack Kilby passed away on June 20th in Dallas following a brief battle with cancer. He was 81. Texas Instruments has created a web site with more information.

Although I never met Jack Kilby or Robert Noyce, I certainly knew of them by name and reputation and I most certainly appreciated the products that sprang from their inventions. I first started to work with IC's while still in high school (1969) when I started to buy Fairchild RTL (Resister-Transistor-Logic) ICs at local electronics stores in Atlanta. The RTL ICs were supposed to be digital devices, but they were notoriously linear when properly biased, and I was using them as oscillators in some projects I built at the time. It was a few years later while in engineering school that I started to use TI 7400 series ICs (remember the big yellow TI IC catalogs?). Over the following years I worked with SSI (small-scale integration) on up to LSI (large-scale-integration), bit-slice, and eventually, the heir to the TTL IC, the microprocessor and gate array. And TI ICs weren't the only TI products I used. I was quite the TI-58 and TI-59 calculator fan boy. I purchased the TI-99/4A personal computer.

My professional engineering life began as a lowly junior engineer, responsible for etching PC boards, stuffing them, and then testing them after the parts had been machine soldered. As time progressed I was involved with designing systems using microprocessors, and the ICs were there as support circuitry or "glue logic", tying memory, peripherals, and microprocessor into a cohesive whole. I started writing assembly routines to test portions of the system, and eventually followed that path to where I write nothing but software today. I have, over the years, returned to my hardware roots and designed small microprocessor-driven boards for embedded use, following up with a kernel or other application software to perform specific tasks.

I will always remember that time in my life, I suppose with the same fondness that my dad looks back on his early career working with vacuum tube electronics. Jack Kilby and Robert Noyce made that part of my life, as well as my entire career, possible with their invention. He will be missed.

Monday, June 20, 2005

Show Me The Money!

I just got through reading an interesting article on The Register titled "Robertson gives up Linspire CEO post." The article covers Robertson giving up the CEO position to concentrate on two other businesses he's started. What caught my eye was this fact tossed out about Linspire:
Robertson fought a long battle with Microsoft, which didn't like the name Lindows for a Linux product. Finally, Robertson agreed to drop the Lindows name from its software and change it to Linspire. In return, Microsoft dropped its legal action and gave the company $20m. Linspire earlier this year boasted only 350,000 users, half of whom paid for extra services.
Stop and consider this for a moment. Linspire, one of the more visible Linux distributors, claims 350,000 users, only half who have paid for extra services. Yet Robertson got a $20 million consolation prize from Microsoft. Microsoft paid pocket change to Linspire while it generated nearly $10 Billion (with a 'B') in revenues in just the latest quarter. After listening to the constant drumbeat from the F/OSS quarter for over 10 years about how bad Microsoft is, and how good Linux is (among other things), you have to ask yourself where's the reward, specifically the monetary reward?

It isn't with Novell. Novell purchased SuSE last year in order to expand into the Linux space. Since purchasing SuSE in 2004 there have been a number of high-profile exits by former SuSE and Novell executives. In the latest quarter Novell sold 19,000 copies of SuSE. Compare this to Redhat's 175,000. This doesn't mean Novell isn't making money. Far from it. Novell made $1.2 billion in sales in fiscal 2004 on - Netware. And Novell continues to make money on existing Netware contracts.

It isn't with Mandriva, formerly Mandrake. Mandriva/Mandrake emerged from bankruptcy protection in April 2004 with a plan to pay off its debts over the next 9 years. With what little cash it has it's purchased Lycoris (down to one employee due to failure to sell enough desktop systems) as well as Brazil's Conectiva (which is where the 'iva' comes from in the new name). Mandriva is another weak Linux company slowly fading away.

The only real company seeming to make mainstream money is Redhat, and I have my questions about its profitability. Redhat's sales are orders of magnitude lower than Microsoft's.

It doesn't matter how evil you think Microsoft is, or how awful Sun or Apple are. I strongly question the long-term financial viability of Linux companies in the marketplace. Linux needs real company support in order to survive, let alone thrive. Going to newsgroups and web FAQs is no way to support enterprise systems. I run Fedora Core at home because it's fun, it's just me, and the applications I run can also be hosted on Windows, the real operating system everyone uses. Microsoft isn't going away, and Windows will get better because it has to for it's customer's sake, not because Linux is a threat. Wishful and delusional thinking by rabid Linux supporters won't change that reality.

Batman Begins - An Excellent Summer Movie

For Father's Day I went with my wife to the Point Orlando 21 Muvico to see "Batman Begins." Starring Christian Bale in the Batsuit and directed by Christopher Nolan, it has to be the best Batman movie produced so far, even better than Tim Burton's 1989 "Batman". What made the movie for me was director Nolan's attention to detail, his careful buildup of a structure that explained Bruce Wayne's motivation and character, and then the strong character interaction between all the actors. And when it came to acting, just about everybody in the movie did a really great job.

The cast for "Batman Begins" reads like an acting who's who ensemble. Everybody gave strong performances. My favorite characters were (in no particular order):
  • Christian Bale - His performance as Bruce Wayne/Batman was dead on. He didn't mince words or throw out funny one liners. His character was focused like a laser. He was also very human. He suffered bloody noises and bruises. In one scene where he was leaving Jim Gordon's (Gary Oldman) office, he kissed the side of a building pretty hard, and you could see he felt it. There is nothing "super" about this Batman, but this Batman's overcoming of his mortality and his fears makes him superb none-the-less.
  • Michael Caine - Michael Caine is back. I've not been particularly impressed with his roles over the past five years, but this time around it seemed he actually enjoyed playing Alfred. And why not? Bruce may own the mansion and have all the money, but Alfred gets to play with all the toys, as witnessed in one scene in the movie where the Wayne jet arrives (with Alfred comfortably seated and sipping champagne) to bring Bruce back home. Caine's Alfred is sharp, dedicated, and tosses out a few quick one liners that help to balance out Bruce's almost overwhelming seriousness. They make a good team on the screen. Here's an article on Micheal Caine where he discusses Batman and his other two current movies.
  • Liam Neeson - Liam was excellently cast as Ducard, the arch villan in this movie. As my wife says, all Liam and Michael have to do is show up and breath and it's a great performance. Some critics have complained about how Ducard, injured by Bruce early in the movie, magically shows up later in the movie to try and brind down Gotham. There's nothing magical. Bruce saved Ducard's life before heading back to Gotham, and as Bruce later realized, it was Ducard who was the real brains behind the League of Shadows.
  • Gary Oldman - I first became aware of Gary Oldman in "The Fifth Element" where he played the character Jean-Baptiste Emanuel Zorg. He showed up again in "Air Force One" as Ivan Korshunov. And then I saw him a year later as Dr. Smith in the movie version of "Lost In Space." I didn't see anything that Oldman starred in until his role as Sirius Black in "Harry Potter and the Prisoner of Azkaban." In all those movies he played energetic and forceful characters. This time around he was a good cop, constrained and quiet but never the less solid and powerful. He had to. No wimp could stay good surrounded by all the corruption his character had to live with. Oldman was another perfect cast.
  • Cillian Murphy - Plays Dr. Crane/Sandman. Murphy's character comes across as quite the slimy corrupt little pawn of the League of Shadows. The Sandman was a recurring character in the Batman comic books, so it was interesting to see him tasered (but not killed) by ADA Racheal Dawes. Murphy was also Jim in "28 Days Later", one of only two zombie movies I've ever liked (the other being "Shaun Of The Dead").
  • Tom Wilkinson - I've seen Tom Wilkinson in only one other movie before this, as Gen. Lord Charles Cornwallis in "The Patriot", in which he played the aristocratic lead commander of the British "Southern strategy." His role as Carmine is diametrically opposite that of Cornwallis, a role where as an American-style mobster he chewed up the scenery with gusto. His short monologue to Bruce Wayne in the restaurant about not really knowing the ugly side of life was an instant classic.
  • Rutger Hauer - Although his role was not as extensive as other actors in this film, he played the greedy manipulative backstabbing CEO Earle to a tee. I've been watching Rutger Hauer in films since "Blade Runner", where he played Roy Batty. I thought he was fantastic in that film, acting rings around Harrison Ford. Over the long years Hauer has acted, he's been in some pretty bad stinkers. But this time he played up to his considerable abilities.
  • Linus Roache - Played a (too) short role as the elder Thomas Wayne. Polished and reserved, he still showed us his character's love and concern for his son. I last saw Linus Roach as the Purifier on the "Chronicles of Riddick".
  • Morgan Freeman - Last, but certainly not least, there's Morgan Freeman as Lucius Fox. As others have noted Lucius is Bruce Wayne's personal 'Q'. His portrayal of Lucius as brilliant technical mentor was superb. I would have liked to have seen more interaction between Alfred (Caine) and Lucius. The interplay between the two characters in the scene where Bruce Wayne is recovering from the adverse effects of exposure to the "weaponized" hallucinogen seemed to hint of interesting future possibilities. Whatever. I just flat-out like Morgan Freeman.
It's the acting and the characters that make this film great. There were plenty of special effects, but they only served to support the acting and the story, which is as it should be. If you really want to see a great adaptation of the Batman comics, then look no further than this film. The end of this movie is a setup for future sequels. I wait with anticipation for every one.

Booting Gnoppix 1.0 Live CD - It's Alive!

I finally downloaded and booted a version of Gnoppix, version 1.0, that runs on my Linux system. Gnoppix 1.0 was released this past June 18th. After burning a boot CD-ROM, I was able to fully boot into Gnoppix and give it a spin. Past versions of Gnoppix (based on Ubuntu) had failed to correctly detect my video setup. My Linux system uses a cheap nForce2-based Chaintech motherboard that has built-in video. I disabled the built-in video in the motherboard's BIOS and instead use an ATI 9600 video card. You don't know how many Ubuntu and/or Gnoppix coasters I've created because of that problem.

Out-of-the-box Gnoppix 1.0 runs with the 2.6.10 kernel. The desktop defaults to Gnome 2.10 (although the Gnoppix web page proudly proclaims "Gnoppix uses gnome desktop environment 2.11"). The desktop looks decent, but not as nice as KDE 3.4.1 on my default FC4 environment IMHO.

I'll probably pull down the latest Ubuntu and give it a shot, and probably a copy of Kubuntu as well just to see how those work. While I'm not going to replace my FC4 environment with Gnoppix, I will say that it looks and runs better than the original, Knoppix. For testing hardware and looking at Linux for the first time, current live distributions just can't be beat. I guess I'm going to have to break down and create my own FC4 live CD. Just to see if I can.

Sunday, June 19, 2005

Living with Fedora Core 4 - Initial Impressions

I upgraded up to Fedora Core 4 when it hit the servers this past Wednesday. This was a big change over past procedures. In the past, I'd copied/saved all my critical configuration files (stuff out of /etc and out of my home directory) and performed a clean install (reformat and clean install). This time, I threw caution to the wind and decided to just update my FC3 installation.

I pulled the DVD ISO down and burned a single disk. It was that or else burn four CD-ROMS and do the media shuffle. With the DVD I'm back to just setting things up and then walking away and letting the installation grind through. I started it late in the evening, went to bed, and when I got up the next morning I removed the DVD and booted the system into FC4 for the first time. It kept all my original settings and I just logged in like I normally did.

General Impressions

Out-of-the-box FC4 runs with kernel 2.6.11, KDE 3.4, Gnome 2.10, and gcc 4.0 with patches. It's also got OpenOffice Beta 2 (build 104) which I find to be fast and useful. I'd already installed KDE 3.4 on my FC3 system, and I'd set up my login to use KDE instead of Gnome. I much prefer KDE over Gnome. With KDE 3.4 that preference grows. The overall look-and-feel of KDE 3.4 on FC4 is gorgeous, much more than KDE 3.4 on FC3. I believe that the fonts were updated on FC4, so that web pages in particular render nearly identically on Firefox 1.0.4 on FC4 as they do on Firefox running on Windows XP. And everything runs fast and stable.

I got to try out gcc 4 this evening when I pulled down the latest kernel (2.6.12) from the kernel archives and built it. One reason I like Fedora Core is that I can pull a stock kernel, build it on Fedora Core, and then boot Fedora Core with the newly minted kernel. I have a nice collection of kernel configs, and I just copied the latest I was using from 2.6.11.12 into the kernel directory tree. After building and installing everything, I rebooted the box into the new kernel. Everything worked as expected.

Normally I use up2date to automatically track new changes and updates. But it looks like it's broken with FC4, so I decided to use yum to pick up any updates. I had yum pull all the updates, and it nearly succeeded until it ran into a dependency problem with an old library carried over from FC3. Remember when I said it kept the FC3 config bits? One of those bits was a failed attempt to install ATI hardware acceleration using ATI's latest "automatic" installer. I say automatic because it pops up a lovely graphical installer and does the kernel module build and installation behind the scene. Unfortunately it failed the last time because the latest kernel no longer has a call the ATI module depends on. The ATI installer installed it's version of the OpenGL library, but failed to build and install the kernel module. Great. I forgot about it until I was reminded by yum's inability to install all the new updates. I had to use RPM to remove the complete package, then restarted yum. Yum, fortunately, had everything cached and it picked up where it had stopped.

When it was finished I had, among other things, the latest Xorg updates and KDE 3.4.1. I still wasn't finished. When I forcefully removed the ATI driver bits, my xorg.conf file was no longer valid. When I logged off my local account so that the new X and KDE would start to execute, it failed because the configuration file was now referencing resources no longer on the system. Fortunately I have an original (stock) xorg.conf file, so logging in as root I copied it over and restarted X. The X windowing system and KDE came back up.

Do Not Try This At Home

Fedora Core is not the kind of OS you give to your grandmother. You just read what I went through to get the latest updates and to fix a problem with my graphical desktop. I've worked with Linux distributions since 1993 and I've reached a point where fixing problems are second nature. I can work equally at the command line or the GUI. But while this works for me, it is of no use to the casual user who just wants to turn it on and have it Just Work. For that you have to pay extra, and you do with Redhat's commercial desktop.

I put up with this because of the freedom it gives me. I have all the source and I can do anything I want, including breaking it utterly if I so desire. My system is built around two partitions: root and opt2. Everything goes on the root partition and that's the part that boots. All my tools and information goes on opt2. That means that if I want to scrub and reinstall the OS I can do so with impunity. If I want to install an alternate distribution I can do that as well. I don't have to worry about activation or other digital rights issues. I don't care about playing movies or MP3s or running somebody's high-cost software off a warez site. Instead I take real delight in experimenting and trying out new things, of taking apart the digital watch and seeing if I can put it all back together so that it works. Maybe even better than before.

Spam-a-lot: More Phishing Expeditions

It's amazing what you get in your spam slot these days. I've got a number of email accounts: Google Mail, Yahoo! Mail, and my account for RoadRunner. And they all get their share of amusing spam messages. It seems, however, that somebody somewhere is targeting specific classes of messages to specific accounts. I do wish I knew what the marketing reasons were behind the types of messages I get in each account.

The gmail account is the most entertaining. For some reason I've been getting lots of admonitions and dire warnings about my non-existant eBay account:
  • Pay Your eBay Fees (four of those)
  • eBay Fraud Mediation Request (two of those)
  • Open now and verify your email at eBay (five of those)
  • Security problems (two of those)
  • Billing issues
  • etc.
And then there's similar dire messages coming in for LaSalle Bank, SouthTrust, and PayPal. And, of course, I have no accounts with any of those institutions either.

The second most amusing is my RoadRunner account. There I get all sorts of offers for penis and breast enhancement pills and treatments, low-cost medications, and stock investment opportunities. I don't get any of these messages on any of the other two accounts. I run Thunderbird as my mail client, and I've got it trained to filter out this crud. To give credit to RoadRunner it does seem to cut down on the number of spam messages I get. But some still get through, and that's then T-bird automatically sorts them out.

Finally, there's my Yahoo account. There I get all sorts of super-low-discount software offers, Nigerian 419 get-rich-quick schemes, and porn site offers. And I get the highest number of spam messages there, usually more than the other two combined. Yahoo recently raised the amount of on-line storage to 1GB, and they've added some page-local Javascript to make the on-line email more "user friendly". For example, when I hit the Empty link to empty the bulk email, I get a Javascript popup window asking "Are you sure?" Of course I'm sure.

I've noticed an overall shift in my spam messages across all my accounts. It used to be, especially on Yahoo, that a lot of messages came in with virii attachments. Not any more. Since April I have not gotten a single attachment. Instead the phishing scams have steadily increased.

Saturday, June 18, 2005

Found: Solution to Eclipse Plugin Failure

In a previous article, "Eclipse Annoyance - Failures with Plugin Development using Eclipse 3.1", I documented a problem with starting up a plugin project (any plugin project) with the first two release candidates of Eclipse 3.1. It turns out that moving from milestone 7 (M7) to the first release candidate (RC1) changed the internals a bit. One of the new features of Eclipse 3.1 is that when you update Eclipse you no longer blow away your settings. You workspace is now seperate from your Eclipse installation. For Windows and Linux your workspace by default is placed in your login or home area. Eclipse 3.1 keeps the metadata that defines everything in your environment separate from Eclipse proper itself and in this workspace. This has been great for all the milestones in Eclipse 3.1 I've tested, because it was so simple to just delete the older Eclipse installation and unpack (unzip) the new Eclipse. I could then start it up and carry on.

That was great as long as nothing critical changed. But something critical did change and the older metadata poisoned the newer Eclipse runtime environment, causing plugin startup to fail. I got a big clue to the problem when I installed the latest, Eclipse 3.1 RC3, on two other systems besides my notebook. One was Windows XP SP2, and the other was Fedora Core 4. Both installations allowed me to create and to immediately launch plugin projects. But when I upgraded to RC3 on my notebook, sure enough, it failed. That's when I decided to restart the notebook Eclipse and point it at a blank workspace. Bingo. I could create plugin projects and they would launch without failure. That meant that I would have to move all my projects over to the new workspace, but that turned out to be straightforward, and once added back into my project explorer, everything continued to work just as it had before.

With one notable exception. I have two Eclipse projects, one based on Openmap, and the other based on a complex SWT/JFace application I've been working on. Most of the information about a project is in the project directory. However, other critical information, specifically information needed to run the application, is in the metadata directory. When I trashed the original workspace, I lost my run settings for those applications as well. There is no reason why all information about a project shouldn't be in the project directory. That way, you can truly move projects around the file system, or even between Eclipse users, without losing any critical information. Those projects will have a better chance to work as intended.

More Thoughts on Dual Core Systems

In my previous article "The Dual Cores Are Here" I looked at the cost of upgrading one of my home systems from an Athlon XP to a dual-core system. I wanted to keep as much of the existing system as possible, since the technology in a lot of the pieces were still reasonably current. The system I wanted to upgrade had been built, from scratch, 2 1/2 years ago and I had been upgrading bits on it since. I decided, based solely on price, that I could spend about $800 for a new Intel Pentium D, motherboard (955 chipset), 1GB of DDR2 667, and a mid-range PCI Express video card. I thought that was a reasonable decision until I read X-bit labs review on the Intel Pentium D 820.

A lot of the hardware sites lavish gobs of verbiage and innumerable tests in order to determine the merits of today's PC technology, such as processors and motherboards. The X-bit article has all of that, including attempts to overclock the processor as well as all the frame-per-second speeds possible with today's popular games. But what X-bit also checked, which I have not seen before now, is an analysis of the 820's power consumption. And that's when I sat up and paid attention.

The article compared the 820 with two Athlon 64 single core processors - the 3200+ and the 3500+, both of them Venice core processors. At idle, the 820 D consumed 50 watts to the 3500+'s 12 watts, while at full load the 820D consumed 131 watts to the 3500+'s 46 watts. That's right. The Intel 820 D, running at 2.8 GHz, consumed 3 to 4 times as much power as the Athlon 64. Yes, we are comparing a dual core Intel chip to the single core AMD chip. But, if we (reasonably) say that the dual core Athlon will consume twice as much power as the single core, then the Athlon 64 will still consume, on average, 50% less power than the Intel.

Why am I concerned about power consumption? Let me count the ways.
  1. Heat. You need to dump heat out of the box. Big sources of heat in today's systems are the processor, the video card, the hard drives (specifically SATA), and the mother board. I try to stay away from video cards that require that extra power connector on the edge, although I do own one, an ATI 9700 Pro purchased in a moment of weakness.
  2. Fans. My big Athlon XP box has no less than nine (9) fans: four on the case, two on the power supply, one on the motherboard north bridge chip (nForce2), one on the video card (ATi 9700 Pro), and the big one on the CPU itself. Fans make noise if they're moving fast. I've got the system box set up so that it's off to the side and unobstructed and I have nothing overclocked so that the fans are all spinning at their lowest settings. As a consequence the system is fairly quiet, but it is by no means silent.
  3. Stability and longevity. I keep my system up for days or weeks at a time. It only reboots when I change the operating system or update it (for Windows, it's an update, and for Linux, it's a new kernel), or if Florida Flash and Flicker decides to take a vacation (think of the Florida 2004 hurricane season). Heat kills stability and longevity. Parts that run hot crash a lot and die an early death. Furthermore, I do not overclock.
  4. Cost. The more power you consume, the more you pay every month to the power company. And over time it does add up.
Right now my Athlon XP 3200+ dumps about 63 watts. That's entirely too much for my tastes, but it's still lower than an equivalent Pentium 4, especially the 90 nm Prescott cores. And keep in mind that my older Athlon XP is on 130 nm geometry. AMD showed, unlike Intel, that going to 90 nm would drop the power consumption (all else, especially frequency, being equal). AMD's Venice core chips have been talked about all over the web for their low running temperatures.

Looks like I'm going to wait a little longer. I don't know why Newegg only got in two of the Athlon 64 X2 chips, or why they only got the OEM chips. I'd prefer a boxed chip because you do get a decent chip cooler and it has a 3 year warranty vs. the OEM chip's 1 year warranty. I do want to make a decision, though. Time is flying by, and it seems I've got some money burning a hole in my pocket.

Friday, June 17, 2005

The Dual Cores Are Here

Wondered over to NewEgg to look at the prices for the Intel and Amd dual-core processors and see if it's possible for me to afford the newest in processor technology...

Basic requirements.
  • I'll look at the Athlon64 X2 and the Pentium D. I'll compare the processors that have 1MB of L2 cache/core. This helps level things a bit because the Intel parts have 1MB of L2 cache/core.
  • I'll need a new motherboard to support the new chips. My current systems are both Athlon XPs running on Chaintech manufactured motherboards using the nForce2 chipset.
  • I will need a new video card. The latest chipsets from nVidia and Intel that can support the latest processors only support PCI Express.
  • I want to keep (recycle) my current system memory. I've got a pair of 512MB DDR 433 DIMs in my current system. There's no reason to get rid of them.
  • I want to keep (recycle) my current hard drives. I've got two Maxtor 120Gig IDE133s that are still quite useful. I have Windows XP on one and SuSE 9.0 Professional on the other.
Now lets get some prices from Newegg.






ProcessorPrice
Athlon64 X2 4400+$639.00
Intel Pentium D 820$291.99
MotherboardPrice
MSI K8N Neo4 Platinum Socket 939 NVIDIA nForce4 Ultra ATX$142.00
ASUS P5WD2 Premium Socket T (LGA 775) Intel 955X ATX$225.00

At this point we need to compare the total basic prices (processor + motherboard) between AMD and Intel and what it is you get. For the AMD solution I get to spend $781. For the Intel solution I get to spend $517. That's a significant difference of $264 (and I'm already pausing to reflect on the prices in and of themselves). Remember how I wanted to recycle my 1GB of DDR 400 memory? Can't do that with the Intel solution, so I need to drop another $138 on 1GB of Corsair Value Select DDR2 667 SDRAM. That drops my price differential down to $126 and puts me further into sticker shock. I know I have to purchase a new video card with either solution, and since I'm not a gamer, I can live with a low-to-mid range video card from nVidia or ATI. I can reuse my hard drives. I've got an all aluminum case and a solid 450W power supply; they're reusable. Tube is reusable as well until it just flat dies. As I dig further I find that the Athlon chip is OEM only, which means I have to spend more on a cooler. Oops. Waited to long. Newegg is sold out of the Athlon processor. Well, I guess that solves that problem. Between the cost and the lack of availability, I'll favor the Intel solution.

Depending on your gender and your view towards computers you may ask why would I want to replace two perfectly good systems with the latest and greatest? After all it's going to cost about $800 before it's all finished to replace the guts on one of them with the newer processors and motherboards. The answer to that question is the relentless drive of technology. Yes, I'd have to spend $800. But look at what I get for that $800. You get processor technology and capability that would have cost a fortune a mere five years ago. Dual-core processors and the latest motherboard chipsets give you a system that, given the right software, gives nearly a 2X (or more!) increase in raw computational performance. It also gives you the ability to learn and use leading edge technology. That $800 isn't for gaming (although I'm sure I'll play a few games on it) as much as it's an investment in my continuing education. And that, to me, is what it's all about. Continuous personal improvement leads to continuing competitiveness.

A computer is a magical crucible for the inventive and the inquisitive. We're reaching a new inflection point with the systems that are now hitting the street. There's a real excitement in the air, something I haven't felt since the mid 90's. That $800 may be expensive to some (and truth be told, put a dent in my budget), but it's dirt cheap when you consider future possibilities.

Eclipse Annoyance - Failures with Plugin Development using Eclipse 3.1

I'm a big Eclipse fan, and have been since version 2. I've been working steadily with Eclipse 3.1 since milestone 5. Right now I'm up to release candidate 2. I've been quite happy with the changes, in particular the increases in performance on both Windows and Linux. But one thing I have not been happy about is the apparent breakage in plugin development.

One excellent feature of Eclipse is its deep support for Eclipse plugin development through its plugin development environment (PDE). By following along with the excellent wizards, you can quickly build a framework for plugin development that is capable of being immediately launched. At least that's the way it worked until the first release candidate (RC1). Starting with RC1, I noticed that my older plugin development project suddenly failed to work. I quickly decided to create a simple plugin project using Hello World and then compare the two, looking to see what had changed between 3.0 and 3.1 RC1. But that didn't work either. No matter what I do, I cannot create a plugin that works. Every time I go to launch the plugin I get the following failure message:


!SESSION 2005-06-17 09:20:04.116 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.5.0_03
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US
Framework arguments: -application org.eclipse.ui.ide.workbench -pdelaunch
Command-line arguments: -application org.eclipse.ui.ide.workbench -data C:\Documents and Settings\beebew\runtime-workspace -dev file:C:/Documents and Settings/beebew/workspace/.metadata/.plugins/org.eclipse.pde.core/Favorites/dev.properties -pdelaunch -os win32 -ws win32 -arch x86

!ENTRY org.eclipse.osgi 2005-06-17 09:20:06.400
!MESSAGE An error occurred while automatically activating bundle org.eclipse.ui.workbench (178).
!STACK 0
org.osgi.framework.BundleException: The activator org.eclipse.ui.internal.WorkbenchPlugin for bundle org.eclipse.ui.workbench is invalid
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:151)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start( BundleContextImpl.java:965)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker( BundleHost.java:321)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start( AbstractBundle.java:266)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:112)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass( SingleSourcePackage.java:37)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:386)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.defineClass( DefaultClassLoader.java:370)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.defineClass( EclipseClassLoader.java:223)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClassImpl( DefaultClassLoader.java:343)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClass( DefaultClassLoader.java:235)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.findLocalClass( AbstractClassLoader.java:183)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.basicFindLocalClass( EclipseClassLoader.java:137)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:78)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:144)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start( BundleContextImpl.java:965)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker( BundleHost.java:321)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start( AbstractBundle.java:266)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:112)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass( AbstractBundle.java:1259)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:152)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:142)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:129)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension( ConfigurationElementHandle.java:48)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run( PlatformActivator.java:222)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)
Caused by: java.lang.NoClassDefFoundError: org/eclipse/swt/SWTError
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
at java.lang.Class.getConstructor0(Class.java:2640)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:146)
... 55 more
Root exception:
java.lang.NoClassDefFoundError: org/eclipse/swt/SWTError
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
at java.lang.Class.getConstructor0(Class.java:2640)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:146)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start( BundleContextImpl.java:965)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker( BundleHost.java:321)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start( AbstractBundle.java:266)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:112)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass( SingleSourcePackage.java:37)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:386)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.defineClass( DefaultClassLoader.java:370)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.defineClass( EclipseClassLoader.java:223)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClassImpl( DefaultClassLoader.java:343)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClass( DefaultClassLoader.java:235)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.findLocalClass( AbstractClassLoader.java:183)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.basicFindLocalClass( EclipseClassLoader.java:137)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:78)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:144)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start( BundleContextImpl.java:965)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker( BundleHost.java:321)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start( AbstractBundle.java:266)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:112)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass( AbstractBundle.java:1259)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:152)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:142)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:129)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension( ConfigurationElementHandle.java:48)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:222)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)

!ENTRY org.eclipse.osgi 2005-06-17 09:20:06.430
!MESSAGE An error occurred while automatically activating bundle org.eclipse.ui.ide (173).
!STACK 0
org.osgi.framework.BundleException: The activator org.eclipse.ui.internal.ide.IDEWorkbenchPlugin for bundle org.eclipse.ui.ide is invalid
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:151)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start( BundleContextImpl.java:965)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker( BundleHost.java:321)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start( AbstractBundle.java:266)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:112)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass( AbstractBundle.java:1259)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:152)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:142)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:129)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension( ConfigurationElementHandle.java:48)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run( PlatformActivator.java:222)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)
Caused by: java.lang.NoClassDefFoundError: org/eclipse/ui/plugin/AbstractUIPlugin
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.defineClass( DefaultClassLoader.java:370)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.defineClass( EclipseClassLoader.java:223)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClassImpl( DefaultClassLoader.java:343)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClass( DefaultClassLoader.java:235)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.findLocalClass( AbstractClassLoader.java:183)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.basicFindLocalClass( EclipseClassLoader.java:137)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:78)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:144)
... 27 more
Root exception:
java.lang.NoClassDefFoundError: org/eclipse/ui/plugin/AbstractUIPlugin
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.defineClass( DefaultClassLoader.java:370)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.defineClass( EclipseClassLoader.java:223)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClassImpl( DefaultClassLoader.java:343)
at org.eclipse.osgi.framework.adaptor.core.DefaultClassLoader.findClass( DefaultClassLoader.java:235)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.findLocalClass( AbstractClassLoader.java:183)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.basicFindLocalClass( EclipseClassLoader.java:137)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:78)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator( AbstractBundle.java:144)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start( BundleContextImpl.java:965)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker( BundleHost.java:321)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start( AbstractBundle.java:266)
at org.eclipse.core.runtime.adaptor.EclipseClassLoader.findLocalClass( EclipseClassLoader.java:112)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass( BundleLoader.java:337)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:389)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass( AbstractBundle.java:1259)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:152)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:142)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:129)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension( ConfigurationElementHandle.java:48)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run( PlatformActivator.java:222)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)

!ENTRY org.eclipse.osgi 2005-06-17 09:20:06.440
!MESSAGE Application error
!STACK 1
org.eclipse.core.runtime.CoreException[1]: java.lang.ClassNotFoundException: org.eclipse.ui.internal.ide.IDEApplication
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:403)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass( BundleLoader.java:350)
at org.eclipse.osgi.framework.adaptor.core.AbstractClassLoader.loadClass( AbstractClassLoader.java:78)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass( BundleLoader.java:275)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass( BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass( AbstractBundle.java:1259)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:152)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:142)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension( ConfigurationElement.java:129)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension( ConfigurationElementHandle.java:48)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:222)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)


One of the reasons I use Eclipse is its extensibility as well as its rich client platform (RCP) that allows the rapid creation of stand-alone applications. Both use the plugin architecture and supporting development tools, which currently appear to be broken. Release candidate 3 is coming out this weekend, and I'm going to check and see if this problem is addressed. But if it is not, then I'm going to seriously consider moving over full time to Netbeans. I've been living in both worlds as of late. As good as Netbeans has become (and it has become very, very good) I've been hesitant to move across because Eclipse as been as good if not better in some areas. But this is a major failure, especially in a release candidate, and it's a feature that's too important not to have in the final release. If Eclipse 3.1 hits the streets with this problem then I will make the official change to Netbeans. Netbeans still has some problems I'd like to see addressed, but it will improve over time.

Thursday, June 16, 2005

Why Microsoft Fails against Linux - It's About Tools

My brother called me today to tell me that Microsoft is now selling a cheaper version of their MSDN (Microsoft Developer Network) development suite. If you go to the Microsoft website and look for MSDN Universal , you'll see you can purchase it for the princely sum of $2,799. That's right, that's not a mis-type. That really is almost three grand. You do get a lot in this package, including regular updates through the period of the subscription (12 months), but you have to ask yourself is it really worth that much? Not to me. At that price I can afford a new PC every year and still have money left over for SuSE Pro twice/year, Red Hat Enterprise Workstation, and FreeBSD.

It wasn't always that way. I'm an original Microsoft booster from back in the 80's when Santa Cruz Operation's Xenix and Digital Research's CP/M and MP/M cost dearly. For a fraction of either product I could easily afford Microsoft DOS, Windows, and their developer tools. I'm even an original MSDN subscriber. I signed on when it was introduced in the early 90's along with Windows NT 3.1. At that time all I got from Microsoft was a developer's newsletter (which was really quite good, IMNSHO). Microsoft announced in that newsletter a yearly service where, for an initial $199, I could get a collection of CDs with all of Microsoft's latest operating systems and tools. I snapped that up in a heartbeat. Up until that time I separately purchased Microsoft's Windows, C and SDK, and here Microsoft was offering all that and more for less than the individual purchase prices of those tools. I was not disappointed when it arrived. The early MSDNs were excellent gateways to understanding Windows internals as well as really innovating with the OS. That sense of well-being lasted until the mid-90's when the price of MSDN rose beyond my home budget to keep up. I stopped buying yearly subscriptions when the price went north of $400.

As MSDN grew ever more expensive Linux as a complete solution was beginning to come into its own. By the mid 90's I could choose from a number of complete quality distributions on CD-ROM that included not only the operating system but a myriad tools to do real work. There were compilers and editors (emacs in particular, which was a decent IDE if you could stand text-based tools, and I could) and dynamic languages (scripting languages back then such as Perl) as well as debuggers and the beginnings of windowing toolkits. For those who just had to have that Motif look-and-feel there was even lesstif. And all this for the cost of distribution on CD-ROM media, which was usually around $20. Linux wasn't as pretty as Windows at the time, but it was a Unix-like clone that did a lot more than any version of Windows available and it was stable, extensible, and above all else, affordable.

When Microsoft raised the bar to easy development on Windows, they chased away all but the well-heeled, and left many of us looking for alternatives to scratch that inventor itch. That itch has been, and continues to be, scratched by Linux (and to a lesser extent, *BSD). Microsoft has spent the last decade building up their hegemony in the corporate space while ignoring everything else. It's been a good short to near term strategy with regards to profitability. After all, you can't argue with nearly $10 billion/quarter revenues. But while they've been managing that area of their business they've forgotten a fundamental law of business: where the next generation of IT users and decision makers come from, and how that generation forms its initial perspective. It's formed from the systems and the system tools that are easily affordable. With Linux and open source it's a no-brainer. You download everything you need and put it on easily affordable hardware. For the last 10 years, and especially the last 5, all those high-school and college kids have been "indoctrinated" by Linux. And that's what they're going to carry with them as they move out and into the work force. When there are finally enough to make some real decisions and make them stick, then Microsoft the company will find out what it's like to shrink from prominence to niche status. And they'll have only themselves to blame.