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 "free sex movies for men non blog". 1,227 entries found.

You can also try this same search on Google.

Installing Jetspeed 2 and deploying Struts/JSF Portlets

One of things we're moving to on my current project is portlet development. The client has a bunch of apps they want developed and it makes a lot of sense to develop them as portlets and deploy them in a portlet container. Because of this, we spent some time this week mucking around with Jetspeed-2. Bruce and I figured out how to install it, and then I did a bit of work with Equinox to deploy the Struts and JSF versions as portlets.

I didn't get equinox-struts or equinox-jsf fully functioning in Jetspeed, but I did get them to deploy and bring up the first page. I expect to do some more work in the next month to get these apps fully functional. In the meantime, I've put together the following tutorials.

If you have any tips on getting JSF or Struts WARs working in Jetspeed, please let me know.

Posted in Java at Jan 13 2005, 08:44:53 PM MST 10 Comments

[DJUG] Testing and Handling Exceptions in the Web Tier

I'm attending Denver's JUG tonight, where Scott Davis is talking about Unit Testing the Web Tier. His opening slide says he's going to cover HttpUnit, Canoo WebTest and JMeter. I'm most interested in the JMeter stuff as I've been meaning to integrate it into AppFuse. I've used HttpUnit and it's a little verbose for me. I prefer using Canoo WebTest or jWebUnit over HttpUnit. On my current project, we're considering using jWebUnit or HttpUnit to act as a browser when interacting with a 3rd-party system.

All of these tools run functional tests - which are much different from unit tests. Unit tests usually tests the bricks, whereas functional tests test the building. For unit and functional tests to be truly effective, they must be:

  • Scriptable
  • Repeatable
  • Automated
  • Darn close to 100% coverage

The tools Scott is talking about tonight have passed his basic tests:

  • Can I learn it in 10 minutes?
  • Does it play nicely with my existing test environment?
  • Does it play nicely with my existing production environment?

I didn't take any notes about HttpUnit or Canoo WebTest because I didn't really learn anything new. Scott did do a nice job in his HttpUnit examples - he made it look a lot simpler than I've previously seen. I've used it HttpUnit before and it seems a bit verbose. I've always used jWebUnit, which simplifies HttpUnit's API.

JMeter allows you to do the same thing as HttpUnit and Canoo WebTest. It's a standalone GUI, for the complete non-programmer. It does not plug into Ant/JUnit and is mostly used for load testing. I thought it was exclusively used for load testing - and I think it has an Ant task. I could be wrong.

<sidenote>Scott uses Smultron for XML editing on his Mac.</sidenote>

The basic building block of JMeter is a "Thread Group". The Thread Group allows you to control the number of users/threads that run a particular test. You can test gets, posts, change the protocol and even upload files. For load testing, make sure and check "Retrieve all Embedded objects in HTML files". You have to view the "result windows" to view that your tests actually ran - there's no "green bar" feature.

I think JMeter has improved a lot since I last looked at it. Scott's overview and demonstration make it look very straight forward and easy to use. One guy asked if it's possible to see a a global view of all tests run. Scott thinks it's possible by adding a Listener to the Thread Group and creating a graph (one of the options). Scott is now showing a lot of the options in JMeter - there's a ton! It's almost overwhelming.

Next up is "Exceptional" Web Apps by Stephen A. Stelting, a senior Instructor and Author from Sun. His latest book is "Robust Java". Stephen has spent the last year and 1/2 figuring out how to make Java fail.

Objectives:

  • Describe the types of errors that occur in the web
  • Explain how exceptions and errors can be handled
  • Describe the web container response to exceptions
  • Present best practices to address web tier exceptions
  • Show how web frameworks handle exceptions

Payoff: As a result of this talk, you'll have a better understanding of how to use exceptions in Servlets and JSPs, improving the robustness of your webapps.

I'm a little skeptical at this point. I think most folks don't do exception handling in their webapps. I hope Stephen has some good tips and tricks for those of us who are familiar with handling exceptions. I wonder how he feels about Spring and its runtime exceptions?

There are two types of exceptions in the web tier: HTTP Errors and Java Exceptions. Standard HTTP Errors are handled by the web server. You can also send your own HTTP errors by calling HttpServletResponse.sendError(). If you're using response.sendError(), make sure and call it before you commit the output. The web.xml file allows you to specify errors and exceptions with the <error-page> element.

Servlets and Filters have similar exception behavior. Both declare exceptions in both of their lifecycle methods: init and service (doFilter for Filters). Developers throw exceptions in lifecycle methods to "tell" the container about problems.

  • javax.servlet.ServletException
  • javax.servlet.UnavailableException
  • java.io.IOException

Stephen is now describing the init() method and the exceptions it can throw. Yawn. I think most Java web developers use frameworks these days. Because of this, most developers probably don't use these methods because they don't write plain ol' servlets. One thing I didn't know is that UnavailableException takes a time parameter - if you throw an UnavailableException with this parameter, the container will retry after the specified amount of time.

Result of Exceptions in init(): The destroy() method is never called, since the initialization did not complete. Client calls during component unavailability render a 500 error.

I stopped taking notes at this point because my laptop battery was dying. I didn't really learn much in the rest of the presentation. While I can appreciate Stephen's enthusiasm, it was obvious that he was an instructor and not an in-the-trenches developer. He explained a lot of what and didn't have any code to show how to do stuff. There wasn't a single demo in the entire presentation.

Most of the exception handling stuff Stephen talked about for the rest of the session was common sense (IMO). It also centered around the Servlet and JSP API, which most folks probably don't mess with. The Struts and JSF coverage at the end was cool. If nothing else, it was to nice to hear a Sun employee confirm that JSF is quite deficient in its hooks to allow easy framework-configurable exception handling.

Now that I'm working at home, and working/interacting with friends all day - it seems that the DJUG meetings aren't as exciting. They used to be fun because I could get out of the house and have a few beers with friends. Maybe it was the lack of learning anything new tonight.

Posted in Java at Jan 12 2005, 11:30:50 PM MST 3 Comments

Time to learn more about Podcasts

Now that I'm commuting to work everyday, I have 15 minutes each way on the Light Rail to read, listen to music or whatnot. I've been reading Tapestry in Action, but I think I'd like to get into Podcasts. I know a little bit about them, but not a whole lot. In the ideal world, I could subscribe to a podcast's feed in iTunes and everytime I'd synch my iPod - it would grab the latest podcast for a particular site. However, doesn't seem to be the case. As far as I can tell, I have to subscribe to someone's site with a podcast, then manually click on their "mp3" link - and then synch it to my iPod.

Is that how podcasting works? If so, it seems like there's a lot of user effort required. I suppose I can do the manual click-n-listen at work, but I'd prefer a more automated solution for the commute.

P.S. The bagel shop downtown (16th and Cali) has free wi-fi - sweet!

Later: I'm over it. I tried listening to a podcast while writing for the last 20 minutes. It's boring compared to music. I guess I'm not geeky enough.

Posted in The Web at Jan 11 2005, 06:40:51 AM MST 9 Comments

Using Acegi Security with AppFuse

Want to use Acegi Security in your AppFuse project? Here's how. Acegi Security will replace Container-Managed Authentication in the next release of AppFuse (1.8). All the code for this was added to CVS today.

Posted in Java at Jan 07 2005, 02:57:49 PM MST 12 Comments

How do you become an independent consultant and get contracts?

A friend recently sent me an e-mail looking for advice on becoming an independent consultant and specifically how to get contracts. I thought this advice might be interesting for others. The e-mail below is unmodified for the most part. He's an animator and does a lot of stuff in Flash, so this naturally has that twist to it. For Java Developers, just replace Macromedia/Flash stuff with Java stuff.

The best thing is to subcribe to the job mailing lists in Denver. There's a Rocky Mountain Internet Users Group and Macromedia Users group that would probably help you.

http://www.rmiug.org/html/email_lists.html

http://www.rm3ug.com

Then I would advise you to get involved in with a local user group, like the Macromedia one. Attend meetings, talk to people, see where they're getting their gigs. I go to the Denver Java Users Group on a monthly basis and now I have a lot of friends there. It was nerdy at first, but then I realized they all went out for beers afterwards and it's kinda cool now. If you volunteer to speak at one of the meetings, you'll probably get some leads from that. It's really all about networking.

The best thing you could possibly do for you career and new clients is to start a weblog. On it you can talk about what you do and how you solve problems. Tips and tricks kinda stuff. I put a lot of personal stuff on mine (www.raibledesigns.com) too. Ever since I started my weblog, I haven't had to do much looking. Often, I can just post I'm looking for a new gig and I'll get offers. I get 8000 visitors a day and around 2 million hits a month. It's the main reason I got my last couple of book deals.

Any other advice you might have for people looking to become independent consultants?

In general, I find independent consulting a lot more fun than full-time employment. The main benefits of full-time employment are Health Insurance and 401K Plans. Stock options are not a benefit in my eyes. I've yet to meet anyone who has made money off stock options as a full-time employee.

The main benefits of being an independent consultant are higher pay and freedom. An experience full-time Java Developer (in Denver) makes around $100K year. I've heard of companies hiring employees for $120K, but the most I've known anyone to make is $108K. On other hand, a contractor with only a year or two of experience can easily make $55/hour - or $110K year. Experienced developers get anywhere from $75/hour to $200/hour. That's right folks - $150K year to $400K year! For the higher dollars you often have to travel, which kinda sucks.

People that are full-time employees often like it for the benefits - health care and such. As a consultant, you get to see how screwed up our health care system is and pay for your health insurance out-of-pocket. I've seen folks pay anywhere from $250/month to $1000/month for health insurance. We've done both (the latter thanks to Corba) and I'm happy to say that we're paying $250/month now. United Healthcare, minimal plan - but we're still insured. What about 401K? As an independent, you often will establish your own company, and then you can contribute to an SEP plan. With a 401K, you're limited to contributing something like $15K/year. With an SEP, you can contribute up to $40K! Granted, you won't have any employer matching, but you can still plan for your retirement.

The one downside I've seen personally from being independent is I tend to find a lot of projects where I'm the development team. This is great at first since I can work remotely and don't have to attend any meetings, but I tend to miss the water-cooler talk and synergy that a team provides. With full-time positions, this can happen too, but it's rare. With full-time positions, you're likely part of a development team - and if you're lucky - one full of smart developers. One myth about contractors is that they often don't fit into a team full of full-time employees. Personally, I've found this to be a personality thing and have rarely had issues fitting in with full-time employees. The ideal situation is simply to work with smart people. In my career, working with people smarter than me has always been very lucrative to my knowledge base.

Working from home is not all it's cracked up to be. I've done it off and on for a few years now and I'd much rather go into an office at this point. When I work from home, dinner tends to be a just a "break" in my day and I go back to work after the kids go to bed. When I'm in an office, the work day ends when you leave. So how do you get the team-benefits as a independent consultant? The best way I've found is to work with a group of consultants on a project - where the whole team is contractors. You'll often share the same lifestyle and attitudes about your careers. Also, a lot of independent consultants tend to be smart - so you get that benefit.

The last thing I like about independent consulting is freedom. I had 4 months last year where I attended conferences, went on vacation or worked on Spring Live. Good luck finding that kind of freedom with a full-time gig. The higher rates allow you to take more time off to spend with your family - or just enjoy life in general.

If you're thinking about becoming an independent consultant, now is a better time than ever - especially if you live in Denver. The Denver JUG mailing list received more job postings last year than any previous year. From what I've seen, at least half of these are for contracting positions. Unfortunately, most of them are in the $40-60/hour range, but that's still good money.

Any feedback on why you think being a full-time employee is better is most welcome.

Posted in Java at Jan 05 2005, 04:45:14 PM MST 25 Comments

Macworld Expo

Erik expects an AirPod to be announced at the Macworld Expo next week. While that would be cool, I'm hoping for a dual processor 2GHz PowerBook. Jeff mentioned this might happen sometime this Spring. I'd rather have a G5, but I'll settle for a 2GHz G4.

Posted in Mac OS X at Jan 05 2005, 11:57:33 AM MST 2 Comments

RE: J2EE App Server Security

Dion and Christian are talking about J2EE App Server Security. Specifically, they are talking about setting up standard container-managed security. J2EE allows you to specify security settings in your web.xml, but to make those work - you have to configure your app server. For Tomcat, this is pretty easy, and Resin makes it easy too. However, the XML you have to write for both is quite different and some app servers don't even let you write XML - instead you have to use their "admin console". Personally, I think most admin consoles are a pain in the ass. I'd prefer to write a single XML file to configure the server. Some servers require several files just to authenticate against a database.

AppFuse uses both container-managed authentication and a JNDI DataSource. This means you have to configure the appserver in order to run AppFuse. On many servers, this is difficult to do (or, they didn't pass my 10 minute test at least). I like servers where I can deploy a couple of JARs into a directory and a single XML file to configure the server. Tomcat and Resin come to mind.

After using Acegi for the last month, I think I'm going to ditch the "standard" J2EE security stuff. I managed to port AppFuse to use Acegi last month - and didn't have to change a single line of security-related code. The hardest parts of integrating Acegi where 1) figuring out how to build it from CVS (there's currently two src trees) and 2) excluding URLs. Once I got these two things solved, I had to add an "enabled" column to my user table, but that's about it. This is awesome b/c it means you can always port back to CMA with very few code changes.

I used to think that using the container's resources was a good thing, but I'm starting to change my mind. Spring allows you to configure a DataSource connection pool just like Tomcat does, so there's not as many benefits as there once was. Being able to drop a WAR into a directory and have your app work without configuring the server is a very nice thing. What do you think? Are there any advantages to using a container's services anymore? I suppose there is for distributed or clustered apps, but that's all I can think of.

Posted in Java at Jan 04 2005, 09:59:26 AM MST 17 Comments

Welcome to 2005

Happy New Year y'all! 2004 was a great year for this website. It was also an awesome year personally. I have a new baby, a new house and a new bus. I learned way more than I thought I would about Spring, WebWork, Tapestry and JSF. And I spoke at a couple conferences, which I certainly didn't anticipate. In 2005, I hope to step back a bit and spend less time working and more time being a good father and husband. Restoring the bus is my major goal I hope to accomplish this year.

Here's this site's stats for 2004:

Usage summary for www.raibledesigns.com

Summary by Month
Month Daily Avg Monthly Totals
Hits Files Pages Visits Sites KBytes Visits Pages Files Hits
Dec 2004 69799 49161 22409 8240 48267 14900635 255456 694680 1523995 2163770
Nov 2004 60768 44741 19467 6909 44461 14825881 207276 584016 1342233 1823057
Oct 2004 59121 42360 19773 6143 45245 13809074 190443 612977 1313172 1832774
Sep 2004 63906 43636 23673 5774 42490 13261427 173226 710216 1309089 1917204
Aug 2004 64860 45090 19532 5624 43517 11726885 174369 605511 1397803 2010661
Jul 2004 57133 39572 16076 5186 42676 10198473 160794 498364 1226754 1771147
Jun 2004 60793 43063 16368 5250 47805 12193392 157517 491061 1291909 1823808
May 2004 57158 42594 14260 5233 48390 13505124 162228 442085 1320430 1771900
Apr 2004 65187 49228 14960 5366 48607 14728211 160982 448823 1476866 1955629
Mar 2004 56271 43067 13638 4956 44910 12697448 153664 422780 1335091 1744423
Feb 2004 53122 40628 13052 4514 41702 10786518 130932 378534 1178222 1540566
Jan 2004 47717 36967 11173 4147 37554 10305975 128587 346372 1145985 1479249
Totals 152939043 2055474 6235419 15861549 21834188

Posted in General at Jan 01 2005, 09:30:53 AM MST 5 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

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