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.

DJUG Book Reviews

The Denver JUG is certainly a thriving community. For those of you who can't visit us for a meeting - you can still get something from us. Five new book reviews have been added to the Denver JUG web site. Two reviews cover books about automated code generation: XDoclet in Action and Code Generation in Action. The other book reviews are for Core JSTL: Mastering the JSP Standard Tag Library, Pragmatic Unit Testing in Java with JUnit and Java Extreme Programming Cookbook, which covers JUnit and other development tools.

Unfortunately, I gave up my reading aspirations for coding. I hope to get back to reading after Spring Live has been published in June. In reality, however, I'll probably never find the time to read again unless I give up contributing to open source. 24 hours in a day sucks.

Posted in Java at Apr 19 2004, 03:19:33 PM MDT 1 Comment

New PowerBooks

Apple's New PowerBooks (announced today) don't impress me. Sure it's great that you can get a 1.5 GHz processor now, but I want more. I want at least a 2 GHz PowerBook. Why? The simplest reason is easily demonstrated by the following numbers - comparing my 2.6 GHz Windows XP Deskop to my 1.33 GHz PowerBook.

AppFuse TargetPowerBookDesktop
ant compile 44 seconds 25 seconds
ant test-all 6 minutes 7 seconds 3 minutes 18 seconds

Most Mac Heads will probably cry "compare the Dual G5 and see what happens!" I tried doing this at the MySQL conference last week, but the G5s didn't have internet access so I couldn't download Ant and AppFuse to test it out. Regardless, even if I was able to test it out - the G5 is a Desktop - and I want kick-ass speed in a laptop. You can certainly buy speedy Windows laptops.

This post is not meant to be a bash on PowerBooks - I love my PowerBook and I think that Apple makes the best damn laptop hardware out there. I just wish that Megahertz did matter to Apple and they'd give us a faster laptop. Then again, I'm pumped that these PowerBooks are not G5s, 'cause then I'd want one... ;-)

BTW, I tried Jikes 1.20 to speed things up and AppFuse won't even compile. The problem seems to be a bunch of ".class has an invalid format" errors from Cactus. Sorry Jikes, you failed the 10 minute test.

Posted in Java at Apr 19 2004, 09:28:59 AM MDT 10 Comments

Done speaking for awhile

I'm sitting in Julie's mom's house in West Palm right now, trying to report a little about this past week before I go offline for the weekend. If you're interested, you can read about my talks on AppFuse on my SourceBeat blog. The next time I speak about AppFuse it'll be in Colorado in June. I'm scheduled for the Denver JUG that month, and I've been asked to do Boulder's JUG as well. I hope to use that week as a personal deadline for having Sitemesh and WebWork2 as options in AppFuse. I might not be able to pull it off though. I talked to the current owner of my new hobby and it sounds like I'll be driving the bus from San Diego to Denver in the near future. It's got a brand new engine with plenty of power - which is enough inspiration fo me. I've asked my Dad and he sounded interested in joining me for Raible Road Trip #8. The first part of June seems like a great time to embark on this trip. Maybe I'll do it the week after my DJUG preso.

I definitely enjoyed the MySQL Conference, but it wouldn't have been the same without Anthony and Mark. BTW Mark - you need to start a blog. Mark had one session where he told us about 10 or so parameters that you can use to print out debugging information for MySQL's JDBC Driver. I asked him to send me his presentation so I could document them here, but I'm still waiting. It might be a while though - the MySQL company meeting is in Cancun all next week. Mark gets to work full-time out of his house and then lives it up whenever he gets together with his co-workers. Rough life, eh?

Meeting Anthony was a real treat too. He's one of those no-computer-science-degree kind of guys (like Bruce and I), which always makes for fun conversation. The only problem was I couldn't get him to shut up about Python and scripting my Actions all week long. It's like he's in some sort of Python/Beanshell cult or something.

Today, I skipped all conference sessions and opted for a day at Sea World with Julie, Abbie and Julie's Mom Stephanie. It was a great time and Abbie was amazed by all the cool animals. Now I'm ready for a sunny, family-filled, relaxing weekend in West Palm. I'll try to post some pictures if I get around to it.

Shamu
Shamu at Sea World
Steph's Backyard
The Ladies by the pool in West Palm

Posted in General at Apr 16 2004, 10:48:40 PM MDT 2 Comments

i18n - synching up Struts and JSTL

As he did with Roller, Jaap van der Molen made some enhancements to AppFuse to fully support internationalization. He also translated all the existing keys to Dutch. What a guy, eh?!

After I installed this enhanced version of AppFuse, I noticed a few quirks. Namely that my default language was Dutch. To me, this meant that my browser's local must be Dutch. However, since it wasn't, I knew there had to be an issue. After a bit of Googling, I found my answer. It turns out that if you don't specify the language on your default properties file, JSTL won't pick it up - and it defaults to the first one with a language specified. This means that you must have ApplicationResources_en.properties instead of ApplicationResources.properties. Also, another quirk is that you need to synch up Struts locale-setting and JSTL's locale-setting. To do this, I added the following method to my ActionFilter.java class:

    // keep JSTL and Struts Locale's in synch
    Locale locale = (Locale) session.getAttribute(Globals.LOCALE_KEY);
    if (locale == null) {
        locale = request.getLocale();
    }
    if (request.getParameter("locale") != null) {
        locale = new Locale(request.getParameter("locale"));
    }
    session.setAttribute(Globals.LOCALE_KEY, locale);
    Config.set(session, Config.FMT_LOCALE, locale);

Even with all these "hacks" - Mozilla and Safari handle this stuff differently on the Mac. Jaap says that everything works fine on Windows w/o these hacks, so maybe it's just an OS X thing. Regardless, to make things easier, I've added the ability for users to switch between languages by clicking on their language of choice.

There's nothing like adding a new feature to something you're about to demo! I'm on in 45 minutes - the butterflies are fluttering like mad...

Posted in Java at Apr 15 2004, 12:42:00 PM MDT 9 Comments

MySQL Conference - Day 2

JBoss and MySQL
I'm sitting in Mark Fleury's session on MySQL and JBoss Integration. I'll try and record the things I learn in this session. The first thing that Mark mentions is how they own many popular open source projects: Hibernate, Tomcat, etc. - because they employ the lead developers on those projects.

JBoss Numbers
A standard in the market: #1 in development - more than 4 million downloads in last two years alone. A standard for System Integrators: #2 in growth - CRN survey puts JBoss certified consultant at #2 fastest growing certification with large system integrators. A standard in the market: #3 in production - JDJ survey: 70% of users to go Deployment. BZResearch survey. 13% in 2002, 27% in 2003, largest growth of all servers (IBM at 40% and BEA at 34%).

"Federated" Projects
JBoss AS, Hibernate, Tomcat, JBossIDE (Eclipse integration, XDoclet driven development, debugging), JBossCache (distributed data), JGroups (reliable multicast and cluster communication), Nukes (portal and CMS), JBossAOP and Javassist (bytecode manipulation library).

Cache and ORM: Scalability for MySQL
Keep your data in a MySQL instance. Put an ORM (Hibernate) layer on top of it. Replicate the data with cache infrastructure. Cache is King.

Mark is now talking about Hibernate and what it's useful for. I'm guessing that a lot of folks in this session are either interested in JBoss or Hibernate. He's talking about RDBs and what they do well. Next I'm guessing he'll talk about Hibernate and all its features. No need for me to regurgitate that information here - since I suspect a lot you are familiar with Hibernate. If not - what the hell are you waiting for? ;-) If you can't use Hibernate b/c you're standardized on SQL, you should at least use iBATIS. BTW - did you know that BEA's Page Flow demo app is a re-written version of Clinton's JPetstore? If you're standardized on JDBC, you might want to use Spring's JDBC support - which solves many of the problems with JDBC (try/catches, closing connections, etc.).

What is JBossCache?
A transactional replicated cache for JBoss with and without AOP. A cache for frequently accessed elements: Stateful Session Beans, HttpSession. Caches are used in a number of places in JBoss - this one provides a central cache service (MBean interface).

AOP Cache
Java is very dumb - Mark hopes the next OO language we use (in 10 years) is more event-driven (i.e. triggers in Java). This is possible today with AOP. In the example below, Joe's state is automatically transactional and replicated. State replicated, synchronized at transaction commit/rollback.

tree.start(); // kick start tree cache
tree.putObject("/aop/joe", joe); // add aop sanctioned object

tx.begin();
joe.setAge(41);
joe.getAddress().setZip(95124);
tx.commit();

Mark says, "HQL - soon to be EJB 3.0 QL". Interesting quote, eh?

PHP PostNuke - wasn't scalable when they first installed it because it hit the database all the time for security information. The Zend PHP didn't have the notion of global variables - so there wasn't a way to build a cache. According to the PHP guys, MySQL was the cache. JBoss re-wrote it all J2EE and now their server is at 5% utilization with an average of 500 concurrent users. Forums are a port of PHP BB - which is a very nice forum software package IMO. Personally, I'd prefer to use PHP BB over JBoss Nukes since most ISPs offer PHP out-of-the-box. I'm guessing that JBoss Nukes only runs on JBoss. Also, PHP BB is much cleaner and prettier out of the box. I'm a sucker for good looking webapps. ;-)

BTW, Jeremy Zawodny (Yahoo guy) has a number of links that might of interest for this conference. For your convenience, here's the best link: the 2004 MySQL Users Conference blog aggregator.

Posted in Java at Apr 15 2004, 08:30:58 AM MDT 7 Comments

MySQL Conference - Day 1

I'm sitting in the lobby of the MySQL Conference right now, next to Mr. Eden. He's been blogging this conference like a madman, so there's not reason for me to reproduce. See his posts if you're interested to see what's happening here: Registration and Opening Keynote, MySQL/Innodb Performance and J2EE Performance Tuning Workshop.

I attended the Keynote this morning, which was very informative. I didn't know that MySQL was being used so heavily in large enterprise environments. Moreover, there was an interesting slide that showed a performance comparison between MySQL (4.0.1 Max) and Oracle (9i), IBM DB2 (7.2), SQL Server (2000 SP2), Sybase (12.5). MySQL actually kept in step with Oracle in a 50 million row test - and beat the rest of the competition. Who says MySQL is only for small shops! ;-) I could give you the whole history of MySQL (I wrote it down), but I really don't the point. I'll add it here if I get enough requests. The big theme of the conference is definitely clustering.

After the keynote, I went upstairs and crashed. I was up until 3 a.m. last night fixing Ant support in Eclipse. Now you can run Ant (i.e. test-dao) or individual tests (i.e. LookupDAOTest) in Eclipse or IDEA. As part of this process, I removed the entity includes I was using for Spring's XML files. Now each file is loaded individually in tests and web.xml is configured to load them all. It seems a bit cleaner after making the change. Also, I tried to change to using "mappingJarLocations" for .hbm.xml file mappings. This would enable users to skip the step where they write the .hbm.xml file into applicationContext-hibernate.xml. Unfortunately, this works for everything but running Ant in Eclipse. WTF?! I guess the project's home directory is not the working directory in Eclipse. And finally - a warning: if you want to run JUnit tests in your IDE, you need to run "ant test-dao" (or another one) before running your test. It's not thoroughly tested since I run all my stuff from the command-line, but it's there. I definitely recommend using Ant in your IDE if you really want to use your IDE for everything.

The "Opening Night Reception" is about to begin - time to go get some free booze.

Update: I just got an e-mail on how to fix the Eclipse issue when using "mappingJarLocations". In Eclipse's Ant View right-click on a target, pull up the "Run Ant..." dialog. From there there you can set the "Base Directory:" to something like "${workspace_loc:/appname}". Tried that - doesn't work. :(

Posted in Java at Apr 14 2004, 03:48:37 PM MDT

Off to Orlando for MySQL Conference

I'm leaving in a few hours for the MySQL User Conference in Orlando. I'm looking forward to getting out of cold, snowy Denver. As I was getting ready to shut 'er down for the night, an interesting headline popped up in my Inbox.

PostgreSQL vs. MySQL vs. Commercial Databases: It's All About What You Need
Can you trust the leading open-source database engines, PostgreSQL and MySQL, to deliver the performance and features that the Oracles, SQL Servers, and DB2s of the world do? Not just yet, but they could offer enough to meet your needs. Find out how they stack up against each other, as well as against the commercial alternatives. [Full Article]

I don't have time to read it right now ... must ... get ... sleep ... but I thought it would be fitting to bookmark and read when I'm immersed in the land of MySQL lovers.

Posted in Java at Apr 13 2004, 12:40:29 AM MDT 1 Comment

[ANN] Display Tag 1.0 Beta 3 Released

View the Release Notes, checkout the changelog and/or download. Kudos to Fabrizio, who does almost all the work on this tag.

BTW, I tried downloading it a few times and it kept hanging (from several sites) - so I went with building from CVS. Same difference, right? And yes, all tests pass in AppFuse! ;-)

Posted in Java at Apr 12 2004, 02:51:02 PM MDT Add a Comment

Relative Font Sizes

A List Apart has a good article on how to do relative font-sizes in your webapps.

Relative font sizes may make websites more accessible -- but they're not much help unless the person using the site can find a way to actually change text size. Return control to your audience using this simple, drop-in solution.

I'll have to remember this the next time I need relative fonts in a webapp. I've just been using "font-size: 12px" on the body and "em" for everything else. Sure resizing fonts doesn't work in IE, but no one has complained yet. And since I use Safari or Firebird/fox all the time, I never notice.

Also spotted this morning - the Sarissa JavaScript library for parsing XML with JavaScript. You might wonder why I care? Because the bug-ridden twisty comments in Roller use JavaScript XML parsing and I could use a better solution.

Posted in The Web at Apr 11 2004, 08:25:07 AM MDT 2 Comments

[VW Bus] Could this be the one?

A 21-window Volkswagen Bus showed up on eBay this morning - and I could "buy it now" for $9,650. If you look at it, you'll think I'm crazy. $9000 for a old beater of a bus - let alone a VW?! The problem is that these things are pretty rare. The 23-windows are even harder to find. The last 23-window on eBay went for $32,000! Granted it was a bit older and a little better shape - but still, that's ridiculous. The difference between this one and previous ones is that you can "buy it now" for under $10,000. Julie is all for it and thinks it'd be a great 30th birthday present (my birthday is in July). Also, it's in San Diego - where her sister lives, so she'd love an excuse to go out there. If I do buy it, it sure would be fun to road trip across the country to bring it home!

Hmmm, if I could buy my dream car today and DU wins the National Championship tonight...

Update: Woooo HOOOOO - DU WON!!! I told myself earlier today that if they won, I'd buy the bus. So w/in 2 minutes of the win, I bought it! What a day. ;-)

Green CheckYou purchased the item using Buy It Now!

Update 2: On Sunday: it figures, buyer's remorse is starting to flood my brain. The good thing is that it's not because of my purchase. It's because a 1965 21-window showed up on eBay today for much less. It's got 6 more days until the auction ends, and it's at $360 right now. The nice thing about this newest one is that it's already been stripped for restoration. Oh well, I still think I made a good decision yesterday. And as long as Julie does too - I'm golden... ;0)

Posted in The Bus at Apr 10 2004, 09:34:30 AM MDT 10 Comments