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.

[NFJS Denver] Ramnivas Ladded and Aspect Oriented Programming

For the 2nd session of the day, I've decided to attend the session on AOP. My choices were Converting XML (Ben Galbraith), JSF (David Geary), What's new in EJB 2.1 (Monson-Haefel) and Runtime Code Generation (Glenn Vanderburg). I asked David about his JSF presentation and he said it was "boring" so I decided to skip it. This session, in the first 10 minutes, is pretty boring too. I might have to duck out of this and attend another session - but none of the other sessions really interest me. This one started this morning, and it seems to be a continuation of this morning session. It's mostly on AspectJ and he's doing the good ol' logging example. I don't really have an interest in using AspectJ since Spring's AOP is more than adequate for my needs. Oh well, I guess I'll stick around and relax.

Ramnivas is using Eclipse to compile his aspects, and shows us how if he uses "javac" to compile everything, no aspects are added. I'm guessing that there's some sort of plugin for Eclipse that allows for easy compiling of aspects. A new feature in AspectJ 1.2 is the ability to set an ASPECTPATH and then use "aj" rather than "java" to run code. This achieves the same effect as compiling the aspects in Eclipse. The "aj" script appears to just set the system classloader.

Now Ramnivas is showing us how you can use an aspect to define pointcuts on internal appserver classes. His example involves WebLogic, the J2EE Petstore and logging any EJB method calls. To use this, he has to start WebLogic with a custom script, that has a custom classloader defined. For some reason, we're now talking about log.debug() vs. if (log.isDebugEnabled()) { log.debug() }. Ramnivas thinks that most folks don't wrap their debug statements (the proper way). Who doesn't know about this?! I'd like to think that most developers are writing the 3-line version vs. the 1-line version.

An interesting quote: "So many things to show you - 3 hours is not enough." Maybe if we didn't have to wait 2 minutes for WebLogic to start each time, 3 hours would be plenty. ;-) Ramnivas just added logging to all the classes in the blueprints packages and then reloaded the page. There looks to be several thousand method calls occurring behind the scenes for a simple page. Of course, there's lots of tag libraries - but still - PetStore is a ridiculously complex application. Why did some ever impose this crap upon us as "best practices" for Java. IMO, best practices should be based around simplicity, maintainability, testability and performance. Does the PetStore even ship with unit tests? I'll bet it doesn't...

Now we're watching a pretty cool demo where Ramnivas is using aspects to enforce coding policies. In this example, he's using aspects to enforce rules in EJBs (i.e. no static variables, swing or threads). It interesting in that the aspects actually prevent compilation and display errors defined in the aspect. It's a neat idea, but I'm suspicious in that a lot of this AspectJ stuff seems to be Eclipse-specific. What I mean by this is that Eclipse seems to be required for compilation. Is it easy to aspect-enhance your classes using Ant? I would hope so.

Ramnivas seems to be quite the AspectJ expert. He mentioned that he wrote a book for Manning and has mentioned a couple of his contributions to AspectJ in this presentation. I admire authors that write and contribute to projects at the same time. It's often an indicator that the person knows what the hell they're talking about.

This afternoon's first session choices are as follows: JSF Advanced Topics (Geary), Intro to J2EE Web Services (Monson-Haefel), JSR166 (Glenn Vanderburg), Rhythm (Brian Boelsterli) and GUI Development (Ben Galbraith). Web Services and Rhythm are 3 hour presentations, so I might stay away from those - that's just too long for me. Now that I'm sitting in the 2nd half of a 3 hour presentation - it seems that these sessions are best attended in the first half. It's almost as if the presenter is trying to find things to talk about in the second half. Or maybe AOP is just a boring-ass topic. ;-)

I'd like to go to Brian's talk on Rhythm, since he's a good friend and mentor of mine. But then again, I learned Rhythm from him - and use it daily - so I don't know that I'd get anything out of it. Advanced JSF looks good, maybe I'll go to that one. For the 2nd session this afternoon, I'll probably attend Howard's Creating Powerful Web Forms with Tapestry. Maybe I should stick with JSF and Tapestry and make it a web-intensive afternoon. Both presentations are even in the same room!

Posted in Java at May 22 2004, 12:29:31 PM MDT 4 Comments

[NFJS Denver] Richard Monson-Haefel and Groovy Programming

Groovy makes for easier for loops. As an example,

for (Iterator i = r.iterator(); i.hasNext();) {
    System.out.println(i.next());
}

... becomes ...

for (i in r) {
  System.out.println(i)
}

With Groovy, you can remove semi-colons and use dynamic typing. This means you can basically remove any types (i.e. List). The nice thing is that typing is a choice - you can use static typing like you do in Java write now.

One thing I forgot to mention about this conference. Jay Zimmerman (the organizer) has a pretty good idea. The full schedule is printed on the back of the conference badges attendees hang around their necks. This makes it very easy to find and decide what session to attend. I wish more conferences would do this.

Richard is going through closures, native list looping and how you can remove classes and method declarations. It seems to me that one of the coolest features of groovy is that all of the shortcuts are optional. This is huge IMO, because it means the developer has a choice - which is always nice. Richard says that in his experience, a program written in Groovy is about 1/5 the size of the same thing written in Java (an 80% reduction in code). Someone in the room asked about performance. I was surprised to hear Richard say that Groovy was a bit slower. After asking about this, it turns out that Groovy can be executed as a script or as native bytecode (if compiled first). So when Richard said "it's slower" - he meant the script version is slower - because it's interpreted - just like any scripting language.

Sweet - I just got a connection on the hotel's wireless network. I was in the midst of reading some RSS feeds in NetNewsWire and noticed a JRoller blog with additional coverage of this conference. ... Sorry, I got sidetracked for the last 20 minutes with the Spring developer's mailing list - talking about simplifying Spring forms in JSPs.

Back to Groovy. Richard, and several members of the audience, are talking about closures. I still don't really get what they are and why they're important. I guess I shoulda been paying attention. ;-)

Groovy has regular expressions built-in - based on JDK 1.4 Regex. In Groovy, == is the same as .equals() in Java. And === is equal to == in Java. Apparently, they did this because folks usually use == when they really want to get the functionality of .equals(). I like the idea that == in Groovy means the same thing as == in JavaScript, but I don't know how I feel about ===. I'm guessing that using .equals() is still possible.

Richard has a good presentation style. He does a lot of coding during his presentation - writing scripting, compiling and executing them. Unfortunately, since I got internet access, I haven't been paying attention as much as I should - but at least 75% of the class seems to be extremely engaged. An interesting thing about this conference vs. the MySQL Conference in Orlando. At MySQL, almost all the presenters had PC Laptops. In fact, I was one of the only ones with a PowerBook. At this conference, Bruce Tate is the first one I've seen that uses a PC. Almost all the presenters are using PowerBooks - mostly 15".

Groovy can be used for easily writing XML as well as enhancing your Ant build scripts. One thing I'm hearing at this conference, as well as seeing on blogs recently is that AppFuse's build.xml could probably use some refactoring. With Ant's new import feature and the ability to write scripts in build.xml - it's likely it could be greatly simplified. Then again, it ain't broke - so why should I fix it?

Richard's showing us how easy it is to write XML using Groovy's shell:

import groovy.xml.*;

x = new MarkupBuilder();
a = x.Envelope { Body("Hi")}

If you run this, you'll get:

<Envelope>
  <Body>Hi</Body>
</Envelope>

An interesting thing from the above demo. When Richard added "print a" as the last line in the script, it printed "Envelope" after the XML output. He said this is because the last line in Groovy is treated as the script output. That's kinda wierd IMO. GroovySQL - pretty cool and simplistic. A nice feature is that connections are automatically closed (when the script completes). Another thing Richard mentioned is that Files are also automatically closed - even when used inside an Iterator. It seems to me that Groovy is trying to stop many newbie Java developer mistakes, as well as do more automatic resource management (closing files and connection). This is actually similar to Spring in how its JDBC and ORM support manages closing connections behind the scenes. Good stuff - another tool to make life easier for Java Developers.

Posted in Java at May 22 2004, 10:34:13 AM MDT 7 Comments

What sucks about JRoller

It's interesting to maintain two blogs: this one that I have full control over and my Spring Live blog hosted by JRoller. In the last couple of months, I've become increasingly annoyed with using Roller in a "hosted" environment. Read more on my JRoller blog.

Posted in Roller at May 22 2004, 09:58:04 AM MDT Add a Comment

[NFJS Denver] Friday Wrapup

After slipping out of Bruce Tate's Spring talk, I headed into Dave Thomas's Advanced Version Control talk. I was going to blog it in real-time, but his talk was full of tips-n-tricks and there was just too much information. He showed us how its possible to use CVS to "undo" things and how the "magic -j" option allows you to easily merge experimental branches, as well as undo certain time periods of code. It seems that CVS is way more powerful than I ever knew and if you use a lot of tags and branches - it can be a very handy tool. The biggest thing I got out of this talk is that it's possible to do what I want to do at Java.net.

At java.net, they give you a CVS "module" for your project, rather than a CVS "repository" like SourceForge does. A couple of weeks ago, I decided it would be nice to arrange AppFuse's CVS so it would be more similar to a repository. By default, java.net gives you a "www" folder in your project's module - and when I first imported AppFuse, I just included www as a folder in the appfuse (base) module. Since I want to add more modules, I figured it would be easy enough to move all the base appfuse stuff to an "appfuse" folder so I'd end up with:

appfuse (module)
  - appfuse
  - www

This achieved what I wanted (from a CVS viewpoint), but when I'd check everything out, I'd get "appfuse/appfuse" - which is not what I wanted. You can read more on java.net's forums. Anyway, I ended up backing out the change. After sitting through Dave's talk, I realized that it's easy to achieve what I wanted. I just need to get access to java.net's CVSROOT module and add a line to the "modules" file to say "appfuse appfuse/appfuse". Damn, I wish I would have known that a few weeks back.

After that, dinner was served (catered) by the hotel. After dinner, there was an Expert Panel Discussion - where the experts consisted of: Rick Hightower, Bruce Tate, Dennis Sosnoski, Bruce Snyder, Rod Cope, Dave Thomas and Daniel Steinberg. It was a good discussion, with topics ranging from EJB3 to .NET to dynamic configuration with scripting languages to JSR 175. A most enjoyable event. Following the discussion, a group of us headed over to the hotel bar and grabbed some beers. I got to sit next to Renee Dopplick, Dan Steinberg, Dave Thomas and Mike Clark. It was quite a treat. I didn't get home until midnight.

Today's sessions start in 45 minutes and that's about how long my commute it - I'd better get going!

Posted in Java at May 22 2004, 08:19:03 AM MDT Add a Comment

[NFJS Denver] Bruce Tate and Intro to Spring

I decided to stay in the same room after Dave Thomas's talk and attend Bruce Tate's talk on Intro to Spring. After looking through the slides, I realized that its possible I won't learn anything new - but I think I'll stick around for a 1/2 hour or so - just to hear Bruce talk. At the beginning of his presentation, he asked if anyone has downloaded Spring. Hmmm - I'm the only one in a room of about 35. Bruce then mentioned Spring books coming out in the next few months. Damn, he didn't mention Spring Live - I guess I have some more marketing to do! Bruce calls Spring's ApplicationContext a "container", but it's not really a container, but a "dictionary of instantiated objects." That sounds like a good definition to me. Spring's mission statements, or basic beliefs:

  • J2EE should be easier to use
  • It's best to program to interfaces, rather than classes. Spring reduces the complexity cost of using interfaces to zero.
  • JavaBeans offer a great way of configuring applications
  • OO design is more important than any implementation technology, such as J2EE.
  • Checked exceptions are overused in Java. A framework shouldn't force you to catch exceptions you're unlikely to be able to recover from.
  • Testability is essential, and a framework such as Spring should help make your code easier to test.

I've been working with Spring for long enough that I've actually forgot about how much easier my J2EE development life is. This session is a good reminder of how cool Spring is. Poor suckers in this room - no one is even using it. Bruce is a good speaker - and looks quite a bit younger in real life (than in his pictures).

OK, I'm outta here - time to go learn some more about CVS. Note to self - talk to Bruce and figure out how he modified JUnit's excluded.properties file. He had to do this a few weeks back in order to get Hibernate's EHCache working with Spring in JUnit tests. I was able to replicate his issue, but never solved it myself.

Posted in Java at May 21 2004, 05:28:09 PM MDT 4 Comments

[NFJS Denver] Dave Thomas and Open Source Ecosystems

Dave's talk is about bringing open source development practices into a corporate environment. The talk is not about developing open source, it's about learning from open source. Open Source is a way of developing software, a way of structuring communities and a release for frustrated developers. Dave definitely hits the nail on the head with communities and frustration. It's refreshing to work on open source projects where you have a say in the design and release goals. It's especially nice with software like Roller and AppFuse - I'm my own customer so I tend to know what I'd like to see the software do.

Open Source is driven by need, whereas many commercial products are not. Dave has had a fair amount of experience (in consulting) where he's written several thousand lines of code that never got deployed. Open Source software is measured by value - "release early, release often", encourage value, respond quickly. One of the greatest parts of open source (IMO) is feedback. Since I've been working in small development teams for the last couple of years, its essential for me that I get feedback from the community to tell me if my code looks good. It's a great way to get code reviews. BTW, speaking of feedback, Roller now has a WishList. Let us know what you want to see in Roller and we'll try to accomodate the most popular wishes.

Open Source is likely to produce high-quality applicable products because it's: driven by need, measured by value, and controlled by an evolutionary process. It also results in a very unique structure of community: volunteer, self-organizing, and geographically and culturally dispersed. Open Source projects don't have org charts. Teams are built by accretion - roles are recognized by people who can fill them, agreed by consensus. I can see where Dave is going with this. If you were able to say "I'm good at X" and you would end up doing X - development teams could be much more productive. Open Source projects consist of an Owner, Committers and Helpers. Helpers are usually power users that suggest changes and suggest improvements. In my experience, the most successful projects have very involved owners. After the Helpers come the Users - a.k.a. the Parasites! (Dave's words not mine).

This guy is good, there's been lots of laughter in this room. Dave is truly engaging and funny.

Open Source is a release for developers. Developers typically leave their day jobs, go home and work on their own time, for no money. Managers want to know why more than anything. What can you do in a corporate environment to make developers excited about their work. How can managers make developers enjoy their day job as much they enjoy open source development? One guy in the room suggests that open source allows developers to "do what they want to do" rather than "what they're told to do." Dave refutes that in saying that most of the open source work he does is support on existing projects. The crazy thing about open source - there's hundreds of thousands of developers, tens of thousands of projects - many of which produce high-quality software for little or no money with little or no management. Corporate managers wish they could figure out how to harness this energy for their own software development projects.

The major difference between open source and corporate projects? In open source, the person who starts the project cares and is capable of creating the solution. In a corporate environment, its rare that the person in charge of the project really cares - and its even less likely that they'll be the one who implements it. The solutions that Dave has seen work is when a Senior Developer and a Business Analyst are married. This way, you end up with a team that cares and acts similar to an open source project's owner. It sounds a bit far-fetched to me. The best way to bring open source practices in to a corporate environment is to adopt Agile Methodologies. Speculate -> Collaborate > Learn.

My battery is about to die - I'd better sit back and listen and quit blogging until the next session. I'm having a tough time deciding if I should go to Advanced Version Control (Thomas) or Intro to Spring (Tate). I think I'll go to Spring and if its too basic, I'll skip out and go to Dave's CVS talk.

Posted in Java at May 21 2004, 03:33:38 PM MDT 3 Comments

[NFJS Denver] Mike Clark and Continuous Performance Testing

I'm sitting in Mike Clark's Continuous Performance Testing talk right now and he's telling us about his experience with performance optimization. Unfortunately, there's wireless access in this hotel's lobby, but not in the (small) rooms. This post is being sponsored by Bluetooth and my T68i. There's two traditional methods of performance tuning - pre-optimization and after-the-fact. He's pointing out that it's most important to have well-factored code - then when you do decide to do performance optimization, it's simply easier to do.

I had lunch with Bruce and Rod Cope (my new boss) has joined us in this talk. It's cool to be engrossed in Java with my friends and peers. Choices for this first session included: EJB CMP, JDO and Hibernate (Bruce Tate), JSF (David Geary), Naked Object (Dave Thomas), Continuous Performance Testing (Mike Clark) and Practical J2EE Security (Tom Marrs).

Back to the talk - Mike is talking about JUnitPerf and how it works. JUnitPerf looks pretty easy to use, below is a simple test.

public class TunesTimedTest {
  public static test suite() {
    int maxTimeInMillis = 1000;
    
    Test test = new TunesTest("testTunes");
    Test timedTest = new TimedTest(test, maxTimeInMillis);
    return timedTest;
  }

  public static void main(String args[]) {
    junit.textui.TestRunner.run(suite());
  }
}

Looks pretty simple huh? I'm assuming that the Test and TimedTest classes are part of JUnitPerf. Next up - Profilers. Use a profiler when your performance tests fail. Low tech profiling (we've all done this) - using System.out.println with a variable and some math that prints out how long it took for a method to run. Even better - using a "Profiler" utility class that does that math for you and has start() and end() methods. Medium-Tech Profiling - JVMPI using -Xhrunprof. It spews out a whole bunch of information so you can see how long methods take to run. The problem with it? It spits out ALL the information from the JVM and your class/methods end up at the bottom of the stack. Sounds like too much information for me. Mike's take: hprof is a sledgehammer that is basically unusable in a J2EE environment. In JDK 1.5, JVMPI is going to go away and it will be replaced with JVMTI (Tool Interface). He also mentions JFluid and Dynamic Bytecode Generation

High-Tech Profiling: JProfiler, OptimizeIt, JProbe - all of which use JVMPI. Mike likes JProfile b/c it's cheap and recommends looking at javaperformancetuning.com for open source tools.

Performance Testing Cycle

  • Choose a measurable performance goal
  • Write an automated performance test
  • Run the test to baseline performance
  • Profile the code to identify hot spots
  • Tune one thing
  • Run the test again to measure progress
  • Repeat until performance goals are met

As I blog Mike's presentation, I'm starting to realize there's probably not much point to doing what I'm doing - regurgitating his presentation on the web. A better way to "blog this" event (IMO) would be if I could merely provide my thoughts and comments about each presentation I attend. The presenters will certainly get more out of it, and readers will probably enjoy the post more. But that's the hard part. It's easy to blog as a presenter speaks - but it's hard to formulate your thoughts and opinion as they speak. It's easy to blog your thoughts after the fact, but that's supposed to be the best part of NFJS - the hallway conversations b/w sessions. I could miss the first 10-15 minutes of each new presentation writing about the old one, but that's no fun either. I guess I just need to start thinking faster, formulating my opinions as fast as possible and writing them down. From now on, I'm going to try to refrain from regurgitation and go more for opinionated reporting. Is that what you'd prefer? If my readers want regurgitation, I can continue that route - I just think it makes for boring entries.

Man, these are long sessions. I just looked at the schedule and all the talks today are 1 1/2 hours! That's too long IMO. I'd loathe it as a speaker and as an attendee - I'd prefer 45-60 minute presentations. Mike's a good speaker, but it's tough to keep anyone's attention for more than an hour - unless it's something like soft core porn.

Choices for the next session are: Programming with Hibernate (Tate), Rapid UI Development (Geary), OpenSource Ecosystems (Thomas), Java Classworking (Dennis Sosnoski) and Getting Fit (Daniel Steinberg). I'm leaning towards Rapid UI Development or OpenSource Ecosystems.

Posted in Java at May 21 2004, 02:09:30 PM MDT Add a Comment

New JSPWiki Template - Springtime

I put together a new JSPWiki template this week - and I'm calling it "springtime" for now. I don't mean to reference "Spring" as in the Spring Framework, but rather Spring as in a fresh, crisp look. A lot of the styles I actually took from my Struts Resume stylesheet. For a demo, I've replicated my current wiki onto my demo server and changed the template to springtime. Whaddya think? Do you like it better than the "Redman" template I'm currently using?

Feel free to download either of these templates: Redman · Springtime

Posted in Java at May 21 2004, 06:04:17 AM MDT 3 Comments

Denver's No Fluff Just Stuff begins today

Denver's No Fluff Just Stuff begins at noon today. I'm pumped since I've tried to go the last two and never made it. It looks to be a very fun weekend with lots of knowledge stuffed in my brain that I'm sure to forget in a week or two.Anyone got any suggestions on sessions to attend? If prefer sessions that have interesting topics and good speakers - but I'm open to anything. I plan to go with the flow moreso than to try and learn everything I can.

Speakers I'm looking forward to: Brian Boelsterli and Rick Hightower. Brian is a mentor of mine that I first met in May 2001. We commuted together for 6 months and I learned a lot about independent consulting, fatherhood and agile development from him. Rick is also a good friend and of course I'm gonna be interested in his talk on AppFuse!

Posted in Java at May 21 2004, 05:43:22 AM MDT 5 Comments

XDoclet vs. JSR 175

Rob Kischuk has a post where he describes what a Struts Action might look like using JSR 175 annotations.

@StrutsAction(
  @ActionMappings({
    @ActionMapping(
      path="index"
      @ActionForwards({
        @ActionForward(
          name="success"
          path="index.jsp"
        )
        @ActionForward(
          name="failure"
          path="error.jsp"
        )
      })
    )
  })
)
public class IndexAction extends Action {

As I read it, I though - "holy crap is that ugly!" Isn't the XDoclet version a bit cleaner?

 * @struts.action path="index"
 * @struts.action-forward name="success" path="index.jsp"
 * @struts.action-forward name="failure" path="error.jsp"

I'll admit, I don't know much about JSR 175, except that it is designed to replace XDoclet. However, I don't believe that it will generate code like XDoclet does - but rather it will allow your Java code to describe metadata using doclet tags. So what good does that do? Does this mean all my metadata and configuration stuff is hard-coded into my source? With XDoclet, I realize that a lot of this stuff is hard-coded into my source, but at least I can change things by changing an ant property and rebuilding - or changing the generated XML files. Why is JSR 175 better than XDoclet? I guess I just don't see the beauty of it. More typing and uglier javadocs aren't that appealing to me.

Posted in Java at May 19 2004, 11:12:29 AM MDT 7 Comments