White Ranch Park
There's nothing like riding your bike up a mountain on a beautiful Spring day...
![]() |
![]() |
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 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.
I decided to go out on a limb this evening and give SiteMesh a run for its money. The first warning sign was that the documentation refers to version 2.0.2, while the downloads section refers to version 2.0.1. So I proceeded to download 2.0.1. I promptly noticed that the install guide indicated I needed to download SiteMesh's two TLDs and configure them in my web.xml. Blech - this is so year 2000 - most modern containers support loading taglibs from JAR files with a URI.
So I did a good ol' cvs co of sitemesh from java.net. First of all, I'd like to say kudos to java.net and their CVS repositories - they've been rock solid for the few weeks I've used them. After checking out sitemesh, the first thing on my agenda was to give it the tried n' true ant test. This means I navigate to the sitemesh folder and simply type "ant". At this point, I should get one of two things - a BUILD SUCCESSFUL with a JAR or a help message telling me what I should type. I got the former, which I prefer.
After this, I integrated it into my app using the decorators documentation and deployed it. At first, I received the lovely ol' "getOutputStream() has already been called for this response" error, so I hacked PageFilter.java to use PrintWriter writer = response.getWriter(); instead of PrintWriter writer = new PrintWriter(response.getOutputStream());. Build, copy, package, deploy and voila - it all worked!! Wow that was easy. ;-)
Here's the weird part. I decided to reverse my hack on PageFilter.java to prove that I'd actually fixed the bug. Now I'm back to the original code I got from CVS and I can't get the getOuputStream() error to rear its ugly head. Doh!! This experience begs the following question.
Is SiteMesh stable enough on Tomcat 5 that I can should use it in my Spring Live sample app?
SiteMesh definitely passed my 10 minute test, we'll see if it holds up for the long haul. So far, I'm quite impressed with its easy configuration and quick implementation. I especially like that you can literally guess at it's syntax and you'll get it right. Maybe I was just lucky...
P.S. You should probably know I'm a big fan of Tiles. I wonder if SiteMesh will let me switch a decorator on the fly like Tiles does?
Our builder and I were in our front yard swapping lies this afternoon - when all of a sudden, the existing basement wall fell off! It didn't look like it was holding the house up at all, so I kinda just shrugged my shoulders and said "oh well." We're planning on moving out this weekend anyway. Bob (the builder) took a quick look and determined the wall (and former wall under it) was not holding the house up, so we both chalked it up to no big deal.
However, after a closer look - he determined it was an important wall and I should get out of the house. So now I'm at DU's Library. I don't think our house will cave in because the wall just fell off. Who knows though - it's kinda freaky walking around in a house that has a chance of collapsing. The 2nd picture below is kinda funny - he was going to prop the house up, but decided it wasn't gonna work. Hopefully, I can go home in a couple of hours and all will be patched up - so I can continue working there for the next couple of days.
![]() Basement wall falls off |
![]() Propping it up ;-) |
It's been so nice (75-80s) in Denver this week that I've dusted off my mountain bike and started hittin' the trails. Below are a couple picks from Sunday (South Platte) and yesterday (Red Rocks). It's great to be back in the saddle again...
![]() South Platte Trail |
![]() Red Rocks Trail |
When I finished hacking away on Roller this past Saturday, my fingers hurt from typing so much. Who knows why, I didn't add that much code. Must've been all the keystrokes to run Ant, start Tomcat, and test stuff. Yeah, we need more tests - but those won't help tweak CSS. Yesterday, all I did was review Hibernate in Action, so no coding, but a fair amount of typing. By the time I went on a bike ride yesterday afternoon - my left hand's left-most fingers were curled up naturally and my forearm was aching. Carpal Tunnel has set in quite nicely in my left forearm. I can still type, as evidenced by this post - but it definitely hurts and it seems like I could do some serious damage if I keep it up.
Herein lies the problem. I took this week off from my regular gig to concentrate on the Spring book. So I need to be typing like a madman all week - but my body is not cooperating. Rather, it's trying to tell me something - "you're not cut out for this this much coding/typing." So what should I do? I've had these same symptoms before - and when I did, I got a massage and took a couple of days off. That's a bit difficult this week with my livelihood depending on a pain-free left arm/wrist/fingers. I've booked a 10:00 massage - let's hope that gets me through the week. I definitely need a longer-term solution though. It'd be nice to write this book w/o typing, just talking.
Related: Carpal Tunnel in March 2006.
This morning, I found some scripts to do MD4, MD5 and SHA encryption with JavaScript. If I add these to AppFuse and Roller, it means that a user's password will never be sent in plain-text. Very nice - anyone using any of these scripts? Any reason I should use someone else's scripts instead of the ones I found?
OGNL 2.6.4 was released today. So you're asking - "Why do care? You don't use it?" You're right, I don't use it - but I will be soon. It's the Expression Language used in Tapestry and WebWork - which I hope to learn, beat and abuse in the coming months. I've also had some discussions with Drew about adding it as an EL option to the Display Tag. BTW, with the release of 2.6.4, XWork 1.0.1 and WebWork 2.1 will be released very soon - quoted from the WebWork mailing list.
A lot of the WW and Tapestry folks swear by it and claim it's vastly superior to JSTL's EL. As far as I can tell, it has some more advanced features (i.e. the ability to call a method), but it's not *that* much better. It's not going to revolutionize my webapp productivity - is it? Of course, Jason and Erik will argue that [ insert WebWork or Tapestry here ] is the real productivity enhancer. Personally, it's not the MVC frameworks that slow me down. It's the meetings, the requirements gathering and the UI tweaking (CSS and JavaScript) that takes the most time - as well as the occasional fumbling with Hibernate. That's unlikely to go away no matter what MVC framework I use.
That's why I use AppFuse - b/c most of the CSS and JavaScript I use on a project is already in there. A little massaging here and there, and the UI tweaking for the whole app can be done in a matter of hours. Of course, Tiles helps tremendously with this - as Sitemesh would I suspect.
I think what helps me the most about AppFuse is having a structured process for developing webapps. Create POJO -> Create DAO -> Create Manager, etc. I suspect that my process will stay the same with Tapestry and WebWork - so that's why I'm not afraid to learn them. The productivity-enhancing attributes of AppFuse will not go away with a new framework, but some parts may become a bit easier. Of course, you can bet that if I trip and fall along the way (which I likely will), you'll be able to hear about it here. Maybe someday this site will get as many hits for these frameworks as it does for Struts (up to 914 before this post).
I put a whole sh*tload of hours into Roller today - around 14 to be precise! My main goals where to get password encryption enabled and Remember Me re-implemented as a more secure feature. I managed to accomplish both and did so much typing in the process that my fingers hurt.
Other things I managed to accomplish:
Phew - I'm ready for a beer! You can checkout our demo instance if you'd like to try out the latest code.
March 20th, the first day of Spring. Today's forecast - 65° F. Yesterday it was in the 80s. I gotta admit - I do love Spring. Especially when it might be the first day of another Spring. Clever huh?
I tested the latest code from CVS and it all looks good to me!
Yesterday, I did some more refactoring on AppFuse and got rid of Struts in AppFuse's services layer. Basically, I was using business delegates (a.k.a. Managers) to convert POJOs -> ActionForms and vise versa. So now the question is - why do I even need Managers and why don't I just talk directly to DAOs (as most sample webapps do)? I think the best justification is that Managers can be used by rich client apps and it abstracts the DAO implementation a bit more.
The question is - is there any point to using Managers in a webapps that will always be webapps (no rich client)? To be honest, probably not - but it does make for easy testing of the business logic. The main reason I did a Struts-purge is to get ready for adding other MVC options - most of which allow me to use POJOs in my view. I'm looking forward to adding Spring and WebWork support and I'm willing to bet these solutions will be a bit cleaner. Unfortunately, neither of these frameworks offer client-side validation support, but the good news is it's coming.
The best part about yesterday's refactoring? I ended up deleting more code than I added - which is always a good thing.