Matt RaibleMatt Raible is a writer with a passion for software. Connect with him on LinkedIn.

The Angular Mini-Book The Angular Mini-Book is a guide to getting started with Angular. You'll learn how to develop a bare-bones application, test it, and deploy it. Then you'll move on to adding Bootstrap, Angular Material, continuous integration, and authentication.

Spring Boot is a popular framework for building REST APIs. You'll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy.

For book updates, follow @angular_book on Twitter.

The JHipster Mini-Book The JHipster Mini-Book is a guide to getting started with hip technologies today: Angular, Bootstrap, and Spring Boot. All of these frameworks are wrapped up in an easy-to-use project called JHipster.

This book shows you how to build an app with JHipster, and guides you through the plethora of tools, techniques and options you can use. Furthermore, it explains the UI and API building blocks so you understand the underpinnings of your great application.

For book updates, follow @jhipster-book on Twitter.

10+ YEARS


Over 10 years ago, I wrote my first blog post. Since then, I've authored books, had kids, traveled the world, found Trish and blogged about it all.

Increasing Productivity

I have a new plan for increasing my productivity. With any luck, she'll be writing Java by the time she's 3. Abbie's so cool

Abbie likes Macs

Posted in General at Dec 19 2004, 06:50:11 AM MST 8 Comments

What's up with my PowerBook?

My PowerBook seems to be dying a slow death. When I put it into hibernate mode (by closing it), often it won't startup again. I open the lid and nothing happens. I often have to hold down the power button, power it off, and then restart it.

What's this mean? It means I'm rebooting the damn thing once or twice a day. It's especially frustrating when I'm about to give a talk at JUG meetings or conferences. I get everything setup (IDEs open, Keynote open, etc.), close it as I walk to the front, and then after I plug it in and open it - nothing happens!. This leads to me spending the next 5 minutes rebooting and opening everything again. It's extremely frustrating - especially since it's such a slow-ass machine. ;-) This week, I've headed to the coffee shop (3 blocks away) several times to write, and it seems to happen every time I open it. Each time I think, "Did I save before I closed it?" Luckily, I have Word set to save every minute, so it hasn't been a problem yet.

I believe this happened when I first I bought the machine. However, it was only a couple of times per month. Now that it's become a daily event, and I think it's time to take it in. Has anyone else had similar issues?

The good news is I'm back in love with my PowerBook after using it so much this week. It's really an excellent laptop - especially for writing. I hooked it up to my 23" for the first time in a few months today and I thought, "I really need to get a G5." In reality, I don't want a G5 - my Windows box suites me just fine. What I want is a faster PowerBook - when's the next revision?

Posted in Mac OS X at Dec 18 2004, 05:18:15 PM MST 19 Comments

Did you make the list?

It would've been nice if the Spread Firefox team had let folks know before the Firefox Ad was published. But oh well, shit happens. At least I made the list (PDF).

Posted in The Web at Dec 17 2004, 11:00:47 PM MST Add a Comment

New Gig?

There's a possibility that I'll be looking for new gig starting in January. If you're looking for some help, let me know.

Posted in Java at Dec 16 2004, 01:28:12 PM MST 5 Comments

If you could add another framework to AppFuse, which would it be?

If you could add another web framework option to AppFuse, which one would it be and why? Please keep in mind it already includes Struts, Spring, WebWork, JSF and Tapestry.

Posted in Java at Dec 13 2004, 09:52:17 PM MST 38 Comments

AppFuse Tip: Backup and Restore Data with DbUnit

One of the nice things about having DbUnit integrated into AppFuse is you can easily import and export data. I've often used this feature to export a test database (or even production) into my development environment to try and reproduce data-related errors. Here's how to do it:

  1. Run "ant db-export -Ddatabase.host=otherhost". This exports all the data into an XML file named "db-export.xml" in the current directory.
  2. Run "ant db-load -Dfile=db-export.xml" to import the data into your local database.

I've used the db-export task for other things too - like populating the database through the UI and then updating the test data. All you have to do for this is to copy the db-export.xml file to metadata/sql/sample-data.xml.

NOTES:

  • For Oracle, you need to add a "schema" attribute to all the <dbunit> tasks in build.xml. You also need to do this for the "db-export" target for PostgreSQL.
  • If you want to limit the tables exported (i.e. from a production database), simply nest a bunch of <table name="table_name"/> elements inside the <export> element.
  • If you get errors about foreign key constraints when running "db-load" after "db-export" - you need to re-arrange the order of your tables in the imported XML file.
  • To clear out tables before your tests, add an empty <table name="table_name"/> element to sample-data.xml.

Posted in Java at Dec 13 2004, 10:43:18 AM MST 2 Comments

How do I attach a profiler to Ant?

I'll admit, I have very little experience working with a profiler - but I think I need one. Someone e-mailed me about testing all of AppFuse on a super-beafy box, and he got OOM errors after 17 minutes. For a dual CPU, 2Ghz Opterons, with 2GB RAM running RHEL3 workstation, it only made it to the Spring/AppGen test, which is #8 of 21. On my PowerBook, it makes it to #12, but my Linux box only make it to #8 too. My guess is there's some sort of memory leak in one of the testing tools - Tomcat, Cargo, WebTest or AppFuse itself.

Anyone have experience attaching a profiler to their Ant build or testing process to look for memory leaks?

Posted in Java at Dec 12 2004, 10:55:35 AM MST 10 Comments

XmlHttpRequest

Dave quotes it, Charles writes it. XmlHttpRequest is the topic at hand and how it will help us build the next generation of web UIs. I've used Brent Ashley's JSRS Library to do some fancy UI work (one drop-down populates another) last year. It worked well in combination with Erik Hatcher's articles: Remote scripting using a servlet and Sending rich messages between client and server using asynchronous messaging. The project was AppFuse based, so I have the code if someone really wants it.

An example of XmlHttpRequest is in Roller itself - in the twisty comments you see on this site. For those who have used them, you probably know they're somewhat buggy. With all this talk of XmlHttpRequest, maybe it's high-time to revisit Roller's implemenentation and see if the technology has gotten any better. In reality, I know it hasn't - it's the browsers that are the problem and there hasn't been an update to IE in quite some time. My code could probably use some work though. If you want to dig in and check it out, here's the xmlextras.js that does the heavy lifting and comment-specific JavaScript.

After looking at this code this morning, it looks like there's different methods being used for the different browsers.

/////////////////////////////////////////////////////////////////////
//// XML Document loading

function loadXMLDocument(aURL, aCallback)
{ 
  gMediaCallback = aCallback;
  
  if (window.ActiveXObject) {
    // Internet Explorer XML loading syntax
    gMediaDoc = new ActiveXObject(getControlPrefix() + ".XmlDom");
    gMediaDoc.onreadystatechange = onMediaReadyStateChange;
    gMediaDoc.async = true;
    gMediaDoc.load(aURL);
  } else {
    // Mozilla XML loading syntax
    gMediaDoc = document.implementation.createDocument("", "", null);
	var xmlHttp = new XMLHttpRequest();
    xmlHttp.overrideMimeType("text/xml");
	xmlHttp.open("GET", aURL, false);
	xmlHttp.send(null);
    gMediaDoc.loadXML(xmlHttp.responseXML.xml);
    onMediaLoaded();
  }
}

I wonder if there's a common way that can be used for both browsers? BTW, 99% of the code for these comments was borrowed from Joe Hewitt.

Later: Another article covering this technology: Using the XML HTTP Request object. Hat tip to Carl.

Posted in Roller at Dec 11 2004, 09:29:09 AM MST 13 Comments

Can you test all of AppFuse?

I'll admit, it's time for me to get a G5. I can no longer test everything in AppFuse in one fell swoop. When I try to run this Ant build file(info) (which I'd like to use with CruiseControl) on my Mac and Linux machines, I get OutOfMemory errors. My PowerBook has ANT_OPTS set to "-Xmx768m" and my Fedora Core 3 box has it set to "-Xms1024M -Xmx1024M". Both machines have 1 GB of RAM. The build dies a lot sooner on Linux (15 minutes), and the PowerBook gets really close to finishing (42 minutes). I'm guessing all the tests would take about 50 minutes on the PowerBook. There are currently 21 AppFuse combinations tested by this script. Spring is used in all of these, so I've eliminated that as a listed option.

NOTE: If you're trying this on Windows, remove the "fixcrlf" call at the beginning of the "test" target.

  1. Struts + Hibernate
  2. Struts + Hibernate and iBATIS
  3. Struts + iBATIS
  4. Struts with AppGen - Generic
  5. Struts with AppGen - Detailed
  6. Spring MVC + Hibernate
  7. Spring MVC + iBATIS
  8. Spring MVC with AppGen - Generic
  9. Spring MVC with AppGen - Detailed
  10. WebWork + Hibernate
  11. WebWork + iBATIS
  12. WebWork with AppGen - Generic
  13. WebWork with AppGen - Detailed
  14. JSF + Hibernate
  15. JSF + iBATIS
  16. JSF with AppGen - Generic
  17. JSF with AppGen - Detailed
  18. Tapestry + Hibernate
  19. Tapestry + iBATIS
  20. Tapestry with AppGen - Generic
  21. Tapestry with AppGen - Detailed

So, the question is - can your machine run all the tests for AppFuse? If so, let me know your specs. I'd love to get this setup for CruiseControl, but if I can't even run it with Ant, I doubt CruiseControl will be any better. I realize I could split things up, but I prefer to have one build file.

Posted in Java at Dec 10 2004, 08:51:02 AM MST 8 Comments

Pick the web framework you think is cool

Ever since I started adding additional web frameworks into AppFuse, people have asked me "which framework should I use?" I've often told them "use what you know." If you have in-house knowledge of Struts, use it. I thought this was good advice because I believed that existing knowledge leads to greater productivity.

Lately, I've started to change my philosophy. I'm starting to think it's more important to use the web framework you're passionate about. The one you want to learn more about. After reading Kathy Sierra's "Does it really matter if your tool is cool?", it seems this is a good idea. She writes:

Coolness (or just perceived coolness, it really doesn't matter) is linked to passion. The cooler you perceive your tools to be, the more passionate you are about those tools. And passion, while it might lead to the "everything is a nail" syndrome, has an extraordinary amount of value!

Obviously there's quality of life... a life with passion is certainly more fun than one without. And the more passion, the greater the chances that a person has what psychologists label optimal experiences. And the more optimal experiences one has, the more likely one is to describe life as being "happy". So, passion = optimal experiences = happiness. And research says happy people are generally more productive. Certainly they're more spirited and fun to be around...

So I guess passion leads to greater productivity, not existing knowledge. So which web framework do you think is cool? Which one are you passionate about?

If I had to choose based on my passionate choice, and the one that I think is the coolest, I'd have to go with Tapestry or possibly JSF (JSF would be a lot cooler if it let me put my JSPs in the WEB-INF directory instead of in the root). These are the frameworks I want to learn more about. 6 months from now? Maybe Laszlo or JDNC.

Posted in Java at Dec 09 2004, 04:47:25 PM MST 17 Comments