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.

The good ol' Struts vs. WebWork Debate

Jason Carreira has been nice enough to post a technical comparison of Struts vs. WebWork. Don Brown (creator of many Struts add-on packages) and Jason have been going at it ever since. It's funny, there's a small part of me that doesn't believe there's a future for Struts (because of JSF). I believe that JSF and WebWork are quite similar, and if I'm going to take the time to learn a new framework, I should learn JSF. Why? Because, I'm willing to bet the literature for Struts -> JSF is out there, and there's probably no literature for Struts -> WebWork. Also, I believe there will be JSF jobs in the near future, but not many opportunities for WebWork. In a perfect world, I'd do something like Kris is doing and learn them all - extend AppFuse to support my favorite framework (if I find one better than Struts) after the learning process, and use that for new projects.

Where does Kris find the time to learn all these frameworks? I barely have enough time to workout and complete my 8-hours-per-day of productivity-for-pay. Then again, I've been getting up around 7:30-8:00 a lot lately vs. the usual 4 a.m.

In my current gig, I'm teaching a fellow programmer how to write webapps in Java. He's never written Java, HTML, CSS or JavaScript. He wants a tool to do it all - so he can drag-n-drop, point-n-click and voila - he's created a webapp. This is a fundamental problem with J2EE - it's not possible? Or maybe it's the beauty - you have to get down and dirty with the code to create a webapp. Another issue is that we're using Struts Resume as our baseline and architecture - and there's really nothing in this app that's drag-n-drop or tools-friendly. Everything is Ant, JUnit, Struts and Hibernate. You have to be somewhat familiar with all of these to build/deploy this app. Personally, I like getting down-n-dirty with the code, but that's because I'm familiar with it and have been working with it for years. Teaching someone else how to get down-n-dirty (and to like it) is proving to be a whole other battle.

Posted in Java at Nov 12 2003, 06:17:46 AM MST 12 Comments

Upgrading to Fedora

I'm in the midst of upgrading my Red Hat 9 machine to Fedora Core 1 (a.k.a. Red Hat 10). So far, I'm very impressed and I haven't even installed it yet. The download was super simple using bittorrent for Fedora Core 1. I took a couple of hours and voila - I had all three ISOs. This is the easiest RedHat download I've ever done. Burning the ISOs was a breeze since I have two CD burners in my Windows box. The first time I tried to install (a few hours ago), it failed with "Not Enough Disk Space." I suspect it's all my kernels in my /boot partition, so I removed them with some advice. The nice thing was that even though the install failed, I was right back where I started - with a working Operating System. I've yet to have a failed install on Windows or OS X that actually reverted back to the previous OS. Attempt #2 coming up shortly.

1/2 Hour Later: Hmmm, it still says I don't have enough disk space. I cleared out all the ISOs from /home, but I doubt that's gonna help. Here's my current usage - looks to be plenty of space (to me):

[root@drevil /]# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda5               381139    110294    251167  31% /
/dev/hda1                46636      9359     34869  22% /boot
/dev/hda3              4830728     65860   4519476   2% /home
none                    773772         0    773772   0% /dev/shm
/dev/hda2             13203660   3659772   8873176  30% /usr
/dev/hda7               256667    125652    117763  52% /var
/dev/hdb1             19686804  16801136   1885624  90% /data

Posted in General at Nov 11 2003, 06:57:41 PM MST 2 Comments

Problems integrating CVS Spam and CVS NT

I've been trying to post the following question to the CVS Spam mailing list for the past couple of days with no luck (I keep getting undeliverable receipts). I figure posting it here might get me some answers or alternatives to CVS Spam on NT.

At my new gig I'm trying to setup CVS Spam on a Windows 2000 Server machine with CVS NT. I know, it'd be much easier to do on Linux, but it's an NT shop, so I'm trying to workaround the environment as best I can. I tried using the Ruby Installer from SF, but had no luck.

After reading the Archives, I saw that the best way was to install Cygwin and use cygwin/bin/ruby.exe. I tried this and now I'm getting the following error:

Checking in README.txt;
c:/source/apptracker/README.txt,v  <--  README.txt
new revision: 1.9; previous revision: 1.8
done
C:/Source/CVSROOT/COLLEC~1.RB:100:in `process_log': missing data dir
(/tmp/#cvsspam.2632.18-XXXXXX) (RuntimeError)
	from C:/Source/CVSROOT/COLLEC~1.RB:215:in `choose_operation'
	from C:/Source/CVSROOT/COLLEC~1.RB:314

In CVSROOT/commitinfo, I have:

^apptracker c:/Source/CVSROOT/record_lastdir.rb

In CVSROOT/loginfo, I have:

^apptracker c:/Source/CVSROOT/collect_diffs.rb --to [email protected] %{sVv}

I also checked in cvsspam.conf to CVSROOT and uncommented smtp.host to be localhost (required for NT).

If anyone has setup CVS Spam with CVS NT successfully (on a Windows 2000 server), please let me know. I'd like to use CVS NT over Cygwin's CVS because I think it'll be easier to maintain after I leave. I'm also interested to know if anyone has successfully used other "cvs e-mail" packages with CVS NT.

Update: I finally got through on the mailing list and received a solution from Angus Mezick. To make it easier for everyone, I've made this patched version of CVS Spam for CVS NT available for download. Just a note, these have only been tested with Cygwin's Ruby install. I hope to test these out next week when I get back from Missouri.

Posted in Java at Nov 07 2003, 11:32:04 PM MST 4 Comments

Tomcat Issues

This site continues to puke and choke - and I believe it's 1) Tomcat or 2) my ISP. Why? Because all the other Roller installs seems to hum along just fine with no issues (i.e. Dave and JRoller). I get OutOfMemory Errors and too many connections open. As of last night, I'm thinking of a new strategy. Netcraft reports that this site is capable of running Resin 3.0.3. Maybe I'm reading it wrong, but it certainly seems like it to me. Now I just need to sit down and 1) figure out how to setup Roller on Resin and 2) do it. Knowing my luck, migrating to Resin won't solve anything, but it's worth a try!

Posted in Roller at Nov 06 2003, 08:41:21 AM MST 5 Comments

New Tomcat Releases: 4.1.29 and 5.0.14 Beta

I know these have already been announced on javablogs.com, but no insight was given - so here's some lovin'. 4.1.29 seems to be merely an upgrade to DBCP 1.1 - which is great AFAIK because the "kill abandoned connections" hasn't been working for me. Hopefully DBCP 1.1 fixes this. Unfortunately, I'm running 5.0.12 on this site (where I'm still having connection issues) and the 5.0.14 release seems to only have DBCP 1.0. Oh well, maybe they'll upgrade to 1.1 in the next release. I'll still upgrade this site to 5.0.14 - maybe sometime this weekend.

Later: I upgraded this site to 5.0.14 and it does appear to have DBCP 1.1. Also, the abandoned connection timeout might actually work - or at least it's doing some logging - as indicated by the following message:

AbandonedObjectPool is used (org.apache.commons.dbcp.AbandonedObjectPool@1077fc9)
   LogAbandoned: true
   RemoveAbandoned: true
   RemoveAbandonedTimeout: 60

Posted in Java at Oct 31 2003, 11:37:06 AM MST 3 Comments

What do you get a 1 year old for their birthday?

Abbie in September Abbie turns 1 year old next Wednesday - a birthday so good that they've decided to release The Matrix: Revolutions on the same day! We're having a party this weekend (yes, a keg will be there for the papas) and I don't know what to get her for her birthday. So I'm asking all you Dads out there - what was the coolest gift you got your kid(s) for their 1st birthday? When I say cool - I mean to say that they thought it was cool. Of course, if Mom thought it was cool - that counts too (esp. since it seems to be just as much for her as for Abbie).

Posted in General at Oct 29 2003, 07:32:43 AM MST 10 Comments

AppFuse and all it's libraries

I received a question about AppFuse that I've been pondering every since. The question basically boils down to two things:

  • How do you manage Eclipse's .classpath file in conjunction with lib.properties (the file that manages it for Ant)?
  • When using AppFuse for multiple projects, do you put a "lib" folder in each project or use a central repository?

Quick Answers: I replace files in the appfuse/lib directory and update lib.properties. Then I update my project properties in Eclipse to reference the new jars. A pain, yes - but only a 2 minute process. I run all my tests before I bother changing the Eclipse classpath. As for multiple projects - the easiest thing to do is to move $yourProject/lib to a folder called "libs" in the same directory as $yourProject and change the ${lib.dir} property in properties.xml to point to the new folder.

Begins Rambling... I'm currently using AppFuse on 3 different projects. 1 is AppFuse itself, the 2nd is Struts Resume, and the third is for a client I created a webapp for in August. Right now, when I synch up Struts Resume with AppFuse, I copy paste from appfuse/lib to struts-resume/lib and update the lib.properties appropriately. I can't just copy lib.properties to struts-resume/lib because struts-resume uses libraries that appfuse doesn't. Yes, this is admittedly a pain in the arse. It's almost as bad as changing all the method signatures when moving the Hibernate Session from all method signatures into the constructors (can your IDE do that?!). I don't want to make people download appfuse to build struts-resume though, so I doubt I'll change this process.

The whole "massive lib folder" has been bouncing around in my head for quite some time. I'd like to use Maven or Greebo to download the dependencies for AppFuse, but at the same time, it's nice being able to download the whole thing at once and be up and running. I don't want to go the Maven route because I don't really want/need a website for AppFuse and it sounds tough to get it working with XDoclet (though WebShop looks like it might be a good template). KISS

The project.xml in AppFuse is my feeble 20-minute attempt to get it Mavenized (it's currently not used). I tried Greebo this morning, and it really does nothing for me. Especially since I've setup separate compile/test classpaths (read from lib.properties). It'd be a real pain with Greebo to separate out the classpath's for testing and building - it seems to only support one long classpath. Also, who wants to make their whole best-practices open-source app dependent on a 0.1 open-source app?

As for having my IDE (wether it be Eclipse or IDEA) reading the classpath from Ant - that would be the sweetest feature of the year! Currently in Eclipse and IDEA, I have to give an absolute path to j2ee.jar since I don't want to distribute it (it's 11 MB). When I switch b/w OS X and WinXP, I always have to change this classpath. I'm sure there's an easier way with setting variables in the IDE, I just haven't figured it out yet.

The other thing that is annoying is that IDEA doesn't seem to read my $ANT_HOME environment variable. Does it have it's own $ANT_HOME? It's annoying for me b/c I check for JUnit classes in the classpath in my "init" task, and IDEA doesn't find them. Don't worry Eclipse bashers - it doesn't work in Eclipse either. This is fine with me b/c I prefer the command line, but those "I use my IDE for everything" folks might not like it because they can't run AppFuse's build.xml file from w/in their IDE.

Posted in Java at Oct 23 2003, 06:21:59 PM MDT 7 Comments

Panther has shipped?

Apple just sent me an e-mail stating that my $20 (gotta rub it in) Panther upgrade has shipped. Fedex Tracking seems to disagree - at least as of 9:00 this morning.

Posted in Mac OS X at Oct 22 2003, 08:59:34 AM MDT 3 Comments

Upgrading from Struts 1.1 to Nightly build

I'm upgrading our application at work to the nightly build (20031020) of Struts in order to use the validwhen Validator. I found a few deprecations and errors in the process, so I thought I'd share to help others upgrade easier:

  • ActionError has been deprecated in favor of ActionMessage. Likewise, ActionMessages.GLOBAL_MESSAGE replaces ActionErrors.GLOBAL_ERROR.
  • Methods in ResponseUtils have been deprecated in favor of TagUtils' methods.
  • RequestUtils.message has been deprecated in favor of TagUtils.message. Other methods include RequestUtils.lookup.
  • Many of the methods in TagUtils aren't static (they where were in Request/ResponseUtils), so you have to create an instance of TagUtils. Anyone know the logic here?
  • ValidatorResources.get deprecated in favor of ValidatorResources.getForm.
  • ValidatorForm.getFieldMap() is gone, which no apparent replacement method (at least not in the JavaDocs).
  • The Tiles' Controller interface's perform method has been deprecated in favor of execute. You gotta love this one - while perform has been deprecated, you must use it or you will get a compile error saying you must implement it (or declare your class abstract). Same goes for execute. So to upgrade, I had to implement both methods - where my perform method calls my execute method.
  • org.apache.commons.lang.NumberUtils moved to org.apache.commons.lang.math.NumberUtils
  • org.apache.commons.validator.ValidatorUtil moved to org.apache.commons.validator.util.ValidatorUtils
  • stringToInt(java.lang.String) in org.apache.commons.lang.math.NumberUtils has been deprecated. Not according to the its JavaDoc.

Final tally - two deprecation errors that don't seem to have replacements (yet):

    [javac] .../src/web/org/appfuse/webapp/filter/BreadCrumbFilter.java:182: 
        warning: stringToInt(java.lang.String) in 
        org.apache.commons.lang.math.NumberUtils has been deprecated                                                                                                  
    [javac]        int mSS = NumberUtils.stringToInt(temp);                                    
    [javac]                                  ^                                                      
    [javac] .../src/web/org/appfuse/webapp/taglib/LabelTag.java:71: warning: 
        getFieldMap() in org.apache.commons.validator.Form has been deprecated                              
    [javac]        Field field = (Field) form.getFieldMap().get(fieldName);               

Later: Thanks to Steve Raeburn (via the struts-dev mailing list), I now have no deprecation errors. NumberUtils.stringToInt(String) is now NumberUtils.toInt(String) and Form.getFieldMap().get(String) is now Form.getField(String). Thanks Steve!

Posted in Java at Oct 20 2003, 10:22:00 AM MDT 2 Comments

My IDEA Evaluation - Eclipse is better

I've been trying to use IDEA (on OS X) for the past few weeks and I keep reverting back to Eclipse for features that seem to be missing. I know the features must be there, but I just can't find them. Why else would everyone like it so much? Sidenote: I've never used IDEA for a feature that doesn't exist in Eclipse - I'm sure there are some, I'm just not using them. It sure would be cool if someone created a HowTo explaining how to migrate from Eclipse to IDEA. In the meantime, I'll settle for posting my questions here:

  • Debugging in Tomcat - I'm currently using Sysdeo's Tomcat Plugin in Eclipse for Tomcat 4.1.27. It's super easy to setup and use - I expect the same ease-of-use from IDEA. I haven't looked much, but I'd love to hear feedback on IDEA's Tomcat debugging support.
  • Renaming a variable in a JavaBean renames getter and setter methods. Sounds simple enough, in my 10 second search, I couldn't find it. In Eclipse, right-click -> Refactor -> Rename.
  • Override/Implement methods (from parent classes and interfaces). Right click -> Source -> Override/Implement methods in Eclipse.

I'll add more as I think of them throughout the day. So far, I like IDEA, but to be honest - it's not saving me any time over Eclipse. It also locks up as much as Eclipse and it's responsiveness is still a big sluggish on OS X (10.2.8) with 1 GB of RAM (1.33 MHz processor). Hopefully Panther will make both IDEs faster. Two weeks ago, I was thinking of buying it (as well as Dreamweaver) - now I'm frustrated with IDEA's lack of features and Dreamweaver's slowness. I'll probably pass on shelling out the cash since Eclipse and BBEdit are giving me all the features I need in IDEA and Dreamweaver.

Posted in Java at Oct 20 2003, 06:17:51 AM MDT 22 Comments