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.
You searched this site for "young russian teenboy model pre teen". 788 entries found.

You can also try this same search on Google.

[ANN] Struts 1.2.1 Beta Released

Read the Release Notes or Download. AppFuse has been running a nightly build of Struts from December 2003 - so most of the upgrading has already been done. I haven't upgraded to a recent version because of this functionality change. It probably still exists, but it's about time I upgraded. All tests pass in AppFuse - although I did have to change the core taglib URIs from http://jakarta.apache.org/struts/* to http://struts.apache.org/*. The EL Tag URIs still use http://jakarta.apache.org/struts. Unfortunately, it looks like XDoclet may need to be modified to support the new DTD. Tip o' the hat to Nick.

Posted in Java at Jul 11 2004, 10:29:38 PM MDT 2 Comments

[ANN] AppFuse Light 1.0 - a.k.a. Equinox

For those of you looking for an AppFuse Light, I have good news for you. I've actually been sitting on it for several months now, but now I'm prepared to release it. It's name is Equinox and it's much, much simpler than AppFuse. Equinox has only one build-time dependency (CATALINA_HOME being set for the servlet-api.jar). There's no code generation and no features - not even security. However, it supports building, testing and deploying from Ant, and even has support for managing Tomcat out-of-the-box.

To get started with Equinox, you can download the QuickStart Chapter from Spring Live. This chapter shows you how to develop a simple webapp using Struts, Spring and Hibernate - which talks to an HSQL database. Struts and Spring are integrated using the ContextLoaderPlugin and all tests are designed to be run out-of-container using JUnit and StrutsTestCase. Equinox ships with project files for both Eclipse and IDEA so you can develop and run the tests in either of these top-notch IDEs. There's also a demo available. Thanks to Boér Attila for the kick-ass CSS.

If you like what you see in the QuickStart Chapter, there's much more in the other ERP chapters of Spring Live - now available for download. Too see what's in the other chapters, checkout the Chapter Summaries.

This is a nice milestone - feels good to have made it this far. Have a good weekend!

Posted in Java at Jul 09 2004, 04:38:01 PM MDT 34 Comments

Working too much - what about office hours?

I currently work too much. I can feel it in my shoulders and I know it because I hardly ever exercise. Even worse, I know it because Julie tells me so and Abbie doesn't get to see enough of her Daddy. In addition to working all week, I work early mornings on the weekends, but that tends to spill into late mornings. I also try to cram in a couple hours during Abbie's nap - which usually spills over past when she gets up. During the week, I'll start at 4 or 5, and I'll need to get something done, so I'll work until 7. After Abbie goes to bed, I often hop on the computer again and work until midnight or later. It's easy getting 8 hours in a day or 40 hours in a week for a client. It's hard doing AppFuse support and writing Spring Live on the side. I virtually ignore all the e-mail on the other open source projects I'm on - it's the only way to keep my sanity.

This madness is likely to continue. The only way to reasonably handle my e-mail (> 1000 day - after spam filters) is to check it every couple of hours. That can't continue, so I'm going to have to change my e-mail address. Sorry folks, it's the easiest solution. I'll decide my new one after the holiday weekend, but matt AT raibledesigns.com will start going to /dev/null.

Julie and I've been talking today and we're trying to come up with more solutions to me working so much - especially since a fair amount of it doesn't pay. We're thinking the best solution is Office Hours. When I work from home, I work too much. When I go into a client's office, I tend to end my day when I get home. So, from now on, I'm going to try and only work from 8 to 5 MDT (-7 GMT). Actually, Julie says she doesn't care if I work before 8, I just need to be done at 5 to play with Abbie and join Julie when she goes to bed.

To help accomplish this, I'm going to start closing the door to my office and using the backdoor to leave and come back during the day. Hopefully it'll be like an office away from home. I'll likely be working on Spring Live in the mornings from 4-8 and doing some AppFuse support as well. My best bet is probably e-mail/blogging from 4-5:30 and writing from 5:30-8 (at the local bagel shop). I'll let you know how it goes. I'd also like to hear other ideas from you "I work too much" guys/gals out there - I know there's lots of you.

Posted in General at Jul 02 2004, 03:57:09 PM MDT 8 Comments

JDNC: Simplifying Java Desktop Client Construction

Next session: Java Desktop Network Components. I'm trying to attend sessions that I don't know much about. J2EE ones are likely to bore me. I just noticed that Amy Fowler is one of the presenters - and I've heard she's hot - so I'm sitting up close (5th row).

JDNC is designed to provide shortcults for building common archetypal applications. Better clients with less effort. Less (maybe no) coding. Gentle learning curve and incremental development model. Assumes network or web data source. Geared towards Java application and XML developers. Sun is going to do a lot of work to get Tools vendors to include JDNC. It seems similar to AppFuse, but I'm guessing it's more of an API than a project template. Their goals seem to be the same - get something to show your manager in a matter of hours, not weeks.

Swing Extensions API: targeted for Swing developers, extended components with more features, networked data connectivity and data-binding. I wonder how JDNC compares to Spring's RCP project? Amy mentions JGoodies and how they'd like to include it as part of JDNC.

Feature Highlights:

JXTable: Asynchronous data loading. Sorting, filtering and highlighting.
JTreeTable: Hiearchical-columnar view (outline)
JForm: Data-binding and Validation (as you type). Sounds a lot like what Keith is working on for Spring.
Damn - missed one...

JDNC API: Very high-level components. Built on the foundations of SpringSwing/JFCX. Solution focused and conforms to the JavaBeans Architecture Spec - BeanInfos provided for tool friendliness. Encapsulates complex operations (threading, network connectivity, data modeling). Provides usability features.

Components: JNTable, JNTree, JNTreeTable, JNForm, JNEditor. These components wrap, rather than extend lower level component. Expose simpler API and provide more defaults (i.e. scrolling).

Now we're looking at the Bug Editor Demo (WebStart). The features they're showing are similar to what folks want in the display tag - sorting, filtering, column visibility. It's very cool to see that this is now a built-in feature of Swing. I wonder how hard it is to use JDNC and JGoodies in project? Is it just a matter of adding a couple of JARs to your classpath? It'd be cool to add J2ME and Swing clients to AppFuse. I think the hardest part would be emulating the current (container-managed) security model that exists in the webapp clients.

Sorry, zoned out on e-mail for a while there.

Amy is now showing code and how to create a form for the detail view. It's interesting that the data-binding, including exceptions, is similar to Spring.

JDNC Markup Language: Looks very cool. You can actually develop a Swing app with XML!

Important thing to remember: JDNC simplifies rich client development on all levels. Overall I think JDNC is a very cool open-source project - it's nice to see Sun trying to make developer's lives easier. For more information on developing Swing apps, checkout javadesktop.org.

Posted in JavaOne at Jun 29 2004, 04:09:19 PM MDT 14 Comments

Clustering: Tips and Techniques

I'm sitting in a session on clustering. I'm interested in this topic because I'm going to try and setup Tomcat clustering for Roller. Furthermore, I'm going to try and do it between my current ISP and Groove Systems. Rather than just hopping ISPs, I figured it would be easier to setup a highly available system. I was talking to Dave last night about setting up clustering on JRoller.com. The main problem there is handling file uploads. A lot of folks have uploaded files, and if you setup a cluster, you'll either have to do it on the same machine or mount the first machine's "resources" directory onto the second machine. Regardless, I doubt it would be that difficult.

A typical cluster architecture has a firewall, followed by load balancers that proxy to a webserver farm. Then there's another firewall that talks to J2EE app servers that talk to a highly available database.

Gotcha #1 Apps don't have to be cluster-aware do they?
In a perfect world, this can be true. Programming model issues: serializability and handling failures. HTTP Session and EJB Stateful Session bean state. Tip: Serialize only when needed. Here's a personal tip - add <distributable> to your web.xml file. In most cases, you're appserver will tell you when objects in the session are not serializable. It's a simple way to test if your application is ready for clustering.

Gotcha #2 Idempotence
I missed the definition but it seems to be the ability to do something again and again and get the same results. Here's the real definition of idempotent. Basically, can your application handling retrying something?

Gotcha #3 Using the session or SSB's state as a database
The session is designed to handle conversational state, not information that might need transactional attributes. Stuffing a large volume of data in the session is just a memory issue on a single server - but it becomes a performance issue in a cluster.

Gotcha #4 Upgrades/Patches without impacting availability
Tip: Rolling upgrades and Quiescence. What is quiescence? It's the ability to prevent new users from coming into your app while upgrading, while continuing to service existing users. Quiescence in clustering refers to the ability to bring down servers, upgrade them, and re-introduce them to the cluster.

This talked switched speakers about 10 minutes ago. The new guy is talking about how vendors might implement clustering solutions. In other words, it's boring and doesn't interest me. I care about what I need to do to deploy to clustered servers.

Now we have another speaker - to talk about performance. Performance is always addressed at the end isn't it? Even in the real world. It was funny talking to Dave last night about JRoller. He said that Matt and Rick setup Roller on a test box and hammered it while there were trying to figure out issues. The hit it more often then the production JRoller instance gets. Unfortunately, there were unable to reproduce any issues. The main things that Dave did to fix the latest release was to remove OSCache and to remove Roller's Query API. Now it uses Hibernate directly (I'm guessing that Castor is no longer a persistence option).

That's it - session is over. Now onto learn more about JNDC.

Posted in JavaOne at Jun 29 2004, 01:22:50 PM MDT 3 Comments

JavaOne - the journey begins

My flight leaves Denver around 3:00 and is supposed to arrive at SFO at 7:15. If I'm good, I can grab a taxi and make it to Moscone before registration closes at 8. I doubt it, but it's worth a try. If it's closed, I'll head to my hotel and try to hook up with Bruce, Bill or Simon. Leave a comment or shoot me an e-mail if you are around and want to hook up tonight.

JavaOne 2004

Posted in Java at Jun 27 2004, 12:02:28 PM MDT 5 Comments

Booze, Baby, Booze

Java One Blogger Meetup on Monday. Be there or be square. I'll be around Sunday night if anyone wants to do a little pre-party before Monday. My goals for the week are to attend at least 5 sessions and meet some folks that I've never meet before. Who's bringing the chasers? ;-)

Posted in Java at Jun 22 2004, 09:27:24 PM MDT 2 Comments

How do you make your source tree Eclipse/JUnit friendly?

I've never had a problem getting builds and unit tests to work with Ant. However, unit tests run faster in an IDE, so I'm trying to refactor some code to allow for testing in the IDE. My current directory structure looks like this:

-- project
   - web
     - WEB-INF
       - classes

I need both "WEB-INF" and "WEB-INF/classes" in my classpath. There's XML files under WEB-INF for Spring and Commons Validator, and there's a log4j.xml under WEB-INF/classes for log4j. These files are all in their natural locations as far as all the projects I've seen. However, Eclipse won't allow me to nest classpaths - so it's virtually impossible (as far as I know) to add both directories to my classpath. Any ideas how to workaround this Eclipse "feature" are appreciated.

For those "IDEA is better" folks - I agree. IDEA allows me to add web, web/WEB-INF and web/WEB-INF/classes to my classpath with no issues.

Posted in Java at Jun 02 2004, 12:46:10 AM MDT 6 Comments

Tomcat 5.0.25 quietly released

Download · Changelog. Less than two weeks ago, Tomcat 5.0.24 Stable was released. However, it had a small bug where two cookies would be issued instead of just one - so a hotfix was released. Today, I discovered that 5.0.25 Stable is already out with a whole bunch of other fixes. Since there seem to be no announcements about this release - I thought you might like to know in case you have an upgrade planned.

Tomcat tip o' the day: When you install a new version of Tomcat, clean out its webapps directory (rm -r $CATALINA_HOME/webapps/*) and remove the balancer.xml from $CATALINA_HOME/conf/Catalina/localhost/. The webapps directory contains a number of sample apps that do nothing more than slowdown server startup. I also typically delete the "admin" application since I don't use that either:

rm -r $CATALINA_HOME/server/webapps/admin 
rm $CATALINA_HOME/conf/Catalina/localhost/admin.xml

Lastly, don't forget to add a user with a "manager" role in $CATALINA_HOME/conf/tomcat-user.xml. This way you can use the slick Manager app (http://localhost:8080/manager/html) to install/start/stop/reload/remove webapps.

Update: After installing this release, I discovered that looking up a Mail Session in JNDI doesn't work. It's possible its a bug in my configuration, but it's worked fine on all previous 4.1.x and 5.0.x releases. Because of this, I recommend sticking with 5.0.19 or 5.0.24.

Update 2: This has been verified as a bug in 5.0.25.

Posted in Java at May 27 2004, 12:18:11 PM MDT 3 Comments

[NFJS Denver] Howard Lewis Ship and Creating Tapestry Components

Tapestry - "we try to make the simplest approach the correct approach." I haven't been blogging much of this session b/c I'm just sitting back and soaking it up. It's a good session and Howard is a good speaker. I'm learning a lot about Tapestry and it's philosophy about web development. I especially like the line-precise error reporting - it's something that all frameworks need to do better.

Tapestry looks very cool. You basically write an abstract Java class that has abstract methods for properties you define in an XML file. Tapestry them implements this class and its abstract methods. The class that Howard wrote to handle a login form is very simple - it's only about 7 lines long - and 4 of those are abstract methods! The HTML form is cool too - not much of the HTML has changed since it was bare-bones HTML. He's merely added some a few "jcwid" and "listener" attributes to some of the elements.

Tapestry is a large system of subsystems, all implemented behind interfaces. It ships with its default behavior (i.e. page/template pooling), but you can (supposedly) easily change this behavior or implement custom classes. Internationalization is a first-class citizen in Tapestry - no surprise here since it is in most MVC frameworks. Tapestry 3.1 will embed Hivemind at its core and will provide much easier integration with tools like Hibernate and Spring.

Tapestry's "Validation Subsystem" looks very rich - providing both client side and server side validation. It uses Field decorations to highlight both labels and fields when validation fails. By default, it promotes using CSS to change colors, backgrounds, etc. There are a couple of Helper Beans for validation: the Validation Delegate and the Validator. It's pretty neat that you can bind a label to a field in XML. Since HTML already allows binding <label>'s to form elements - you'd think that Tapestry could harness this by parsing the template. I suppose it's just easier to require the XML binding - then you don't have to worry about the user writing invalid HTML.

Howard is trying something new in this presentation - real-time coding. I use this in my presentations and it works pretty good. He's having some serious issues b/c he can't mirror his laptop's monitor with the projector. This obviously makes it difficult to code since the slide show is his monitor. I try to use pre-canned code (i.e. IDEA Live Templates) so there's less chance of fat fingering things. I also use a Mac - on which mirroring works great.

The "Page" object is pretty cool in that it contains a bunch of lifecyle methods you can override. Most frameworks don't have lifecycle methods. I guess Spring's SimpleFormController does with onSubmit, onBind. Lifecycle methods are a Good Thing IMO. The formSubmit() method is always called, regardless of validation errors. Therefore, you have to get the IValidationDelegate and check if it has errors before continuing. I wonder what the logic behind this is? Most frameworks seem to support automagical validation - with no further work required by the programmer. I guess it's kinda cool b/c you can continue with validation errors if you want to. Choice is always a good thing.

Howard just showed us a client-side validation example. The wicked cool thing is that the client-side script is configured in a .page file rather than in the HTML template. Most frameworks I've seen (that support client-side validation) require you put something into your template. This was a good talk, I'm definitely interested in Tapestry and excited to start learning it in the next couple of months.

Posted in Java at May 22 2004, 06:18:47 PM MDT 1 Comment