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.

2008 - A Year in Review

In 2005 and 2006, I did "A Year in Review" entries. 2007 was the year I got divorced, which probably motivated me to write a bit less. This year I'm back and ready to spend the next few hours writing, copying/pasting and linking like a madman. Hope you enjoy!

Workin' on the Feedlot 2008 was the year I traveled the world and developed a true passion for skiing. In January, my good friend Jason Miller moved back to Denver after quitting his job at Bear Stearns in NYC. We spent the first weekend in Nebraska working on Cletus's feedlot. The next week, my car stereo got stolen and I wondered if my bad knee would make it through the ski season (the good news is not only did I ski the rest of the season, but my knee healed itself over the summer).

Abbie and Jack on Green Mountain At the end of January, the kids and I hiked to the top of Green Mountain and Don Brown made Maven not suck. Then I wondered if there was room for both Rails and Grails at a company and quickly learned both.

February started fantastically with a 14" Powder Day at Steamboat. I wondered if there is no "best" web framework and reviewed Grails and Rails books. After spending an awesome weekend in Tahoe, I took the kids on The Ski Train and learned more about Selenium at Google.

Breathtaking Miller and Vial Lake Tahoe - Last Run

This brings us to one of my favorite posts of all time. On February 28th, Jack got a bead stuck in his nose. After taking him to the ER and paying $800, we found out magic recipe for bead removal is to "hold one nostril and give him a CPR-type breath/blow into his mouth". The reason I love the post so much is it's solved the problem for other frantic parents when they Google for "bead stuck in nose". Whenever I get a new comment, it always makes me smile.

March started out with a Powder Day at Whistler. I thoroughly enjoyed the rest of the weekend with good friends Jarvis and Korn Dog. After returning to Denver, I was allowed to blog about building a UI Frameworks Team at LinkedIn and posted my thoughts on Grails vs. Rails.

View from Our Condo In mid-March, I achieved an all-Mac family and traveled to Lake Chelan for my sister's birthday. Shortly after, The AppFuse Primer was released. At the end of the month, I attended TSSJS in Vegas and moderated a Web Framework Smackdown.

In April, the LinkedIn Denver office opened and we all celebrated by attending the Rockie's Home Opener. The ski season came to an end and I wrote a howto for configuring Apache with mod_proxy and SSL on OS X. Then I discovered the JavaOne parties and wrote about running Spring MVC Web Applications in OSGi.

April ended with 82°F and May started with snow. I attended JavaOne (or at least the parties), released AppFuse 2.0.2 and figured out how to do extensionless URLs with the UrlRewriteFilter. The kids and I spent an afternoon in Rocky Mountain National Park and I did some coding in my backyard.

Jack's Special Rock Nice Trail Beautiful Smile Here's Hoping for another run in October

On Memorial Day, I enjoyed a liver-wrenching, Rockies-filled weekend with my sister her girlfriend Mya and Mr. Miller. I also contemplated making AppFuse Struts 2-specific.

June started with some mountain bike riding, planning some excellent vacations and getting a dream machine. I rode the annual trip to Big Head Todd at Red Rocks with Matt and Bruce. I took the kids on their first camping trip for Father's Day and had a blast. It took us several hours to find the campsite and my car kept starting all night long. It's sure to be a family tradition from now on.

Catchin' Bugs

The next weekend, I attended the American Craft Beer Fest in Boston. To end the month, I embarked upon Raible Road Trip #12 with Abbie, Jack and my Dad.

Grand Tetons In July, the bus project began and I posted pictures of the trip to Montana. This year, I hope to spend the whole month of July at the cabin. I bought an iPhone (one of my best technology-related purchases to date). OSCON was fun but the week after wasn't.

Nice 'n Snug August revealed my favorite birthday present. I didn't blog much the rest of the month, revealing why later.

Jack on his 4th Birthday Jack's Birthday Weekend was an outstandingly fun mixture of old friends and good Colorado beer. In September, I went to see the bus at MotorWorks, Abbie lost her first tooth and co-workers and I performance tested Memcached.

What followed was wonderful. Miller and I headed to Oktoberfest for the Best. Vacation. Ever. We still talk about how much fun we had on that vacation. October finished with the Colorado Software Summit and a hunting trip to the cabin.

November was a crazy month. I got laid off and celebrated Abbie's birthday on the same day. Jack got a mohawk and I traveled coast-to-coast in the same week. To close the month, I announced what's next and headed to Costa Rica.

Costa Rica, courtesy of Rob Misek

I had a fantastic time in Costa Rica and was impressed to see Abbie is a blue skier shortly after. I did a Dojo/Comet Research Project for a week and enjoyed the location of my newest client last week. A small adventure turned into a scary adventure and I enjoyed telling my stories to fellow Java Enthusiasts in Portland.

Phew! It's been quite a year. For 2009, I'm still hoping for what I tweeted shortly after Costa Rica. I'd like to visit 3 foreign countries, take 3 months of vacation and spend 1 month in Montana. I have technology goals too, but those aren't nearly as much fun to dream about. ;-)

Happy New Year!

Posted in Roller at Dec 31 2008, 04:56:32 PM MST 2 Comments

Portland Tech Meetup Tomorrow Night

If you live in Portland, Oregon - or just happen to be in town - you might want to join us for some beers and tech talk tomorrow (Monday) night. Patrick Lightbody, Howard Lewis Ship and myself will be meeting around 6:30 at the Rogue Distillery & Public House (map). With 36 taps and the delicious beer from Rogue Ales, this is sure to be a fun night.

If you're on Facebook, you can let us know you're coming by RSVP'ing to the Event. Otherwise, please leave a comment or just show up.

Posted in Java at Dec 28 2008, 04:18:35 PM MST 3 Comments

My "almost slept in a snow cave" Adventure with Clint Foster

Yesterday began innocently as one of the best ski days of my life. I woke up early, drove to Eugene (Oregon) to pick up my good friend Clint Foster, then headed up to Willamette Pass. It was an Epic Powder Day with over 2 feet of fresh pow pow and face shots on almost every run. After lunch and some liquid courage, we stepped it up a notch and skied some cornices and awesome trees.

Getting ready for a Cornice Jump Epic Powder Day Willamette Pass

Around 2:30, our luck began to change. In our quest for untracked powder, Clint led us off the back side of Willamette Pass. There were no out-of-bounds signs or ropes to indicate this was a bad idea. The steep tree run we found was great, but our attitude changed quickly when we reached the bottom.

With 2 feet of snow and no trail, we found ourselves trudging down a flat path that got us nowhere fast. For two hours, we slogged through the deep snow down a cross-country ski trail (there were blue signs with arrows). As we started to pass the 2nd lake (I believe they were called Rosary Lakes), we decided it was time to bite the bullet and turn around. We had no map or compass. If we kept going in our current direction, we didn't know when (or if) we'd get out. If we turned around, we knew it would take 4-5 hours, but at least we knew it would get us out. "And besides", Clint said, "the trail is already broken." The time was 4:30 and it was starting to get dark.

Yes, the trail was broken, but it wasn't broken for hiking sideways up the mountain we'd skied down. We couldn't take our skis off because we'd immediately sink up to our waste in the snow. It was slow going, sometimes only a step or two at a time. If I wasn't sweating and breathing hard, I'd start to get cold and shiver. We were soaked on the outside from the snow and soaked on the inside from sweating. It was snowing pretty good too, so we knew we might lose our trail if we dug a snow cave and spent the night.

The scariest part happened when we were about an hour from getting out. Clint started to cramp up and it seemed for moment that we were destined to spend the night in a snow cave. While it was his idea to take the trail, he was the reason I made it out last night. He broke trail for most of the hike out. I tried, but would get tired so quickly it didn't help much. So when he, the trail breaker, started to cramp up, it began to look grim. I don't know if it was the thought of sleeping in a snow cave or because we could see the top of the ridge, but Clint's cramps subsided and we were able to make it out. We ended up on a groomed run and had to hike another 45 minutes to get to the top of the mountain and ski down the front-side.

As for Search and Rescue, they were looking for us, but had only recently started searching. The resort had night-skiing and it wasn't until 9:00 that anyone thought we might be missing. Clint's wife, Autumn, was on the ball and had contracted the authorities to inspire their search. We couldn't have asked for a better concerned relative. Autumn is a special person who has a way of making things happen. If we'd spent the night in a snow cave, there's a good chance she would've had the National Guard looking for us the next day.

We made it back to the car just after 10 PM. We first started our run at 2:30 PM. From the point we turned around, it took about 5 hours to hike out. I've never been so tired after a day of skiing. We arrived back at Clint's place just after midnight after a 2-hour drive in the blowing snow and rain. Autumn greeted us with warm clothes, hot tea and the best hugs I've gotten in a long time.

If you ever get a chance to meet Clint and Autumn, I'd highly recommend it. They're the ones who got married in Costa Rica recently. As far as skiing with Clint, that's fun too, but I wouldn't recommend following him out-of-bounds. ;-)

Posted in General at Dec 27 2008, 11:58:54 AM MST 7 Comments

My Christmas Travel Adventure

I'm currently sitting at the Los Angeles Airport (LAX) waiting to board a flight to Portland (the real one, in Oregon). The flight is delayed an hour, but I'm confident it won't be cancelled and I'll arrive there later this evening. This is a story about my adventure getting to this point. It's not that exciting, but it certainly has the potential to become exciting. Hence the reason for this post.

Yesterday afternoon, I noticed the weather was getting kinda nasty in Oregon. Soon after, I talked with my Dad in Salem. He confirmed the bad weather and told me their power had been out for several hours. Then I noticed Patrick's tweet that he was having trouble getting from San Francisco to Portland.

This morning, I used KATU's Flight Status page and flightstats.com to setup text message alerts for my flight and the earlier one I was hoping to catch. At 9:49 this morning, I received a text message that my flight was cancelled. I realized this could be a very bad situation with everyone traveling for the holidays and began to think the worst. I knew it couldn't get much worse than renting a car and driving the from LA to Salem.

Yesterday afternoon, when I first suspected my flight might be cancelled, I called Alaska Air. It was busy. Today, I called them over 10 times with the same result. I called Orbitz (since I'd booked through them) and they couldn't help much either. While I was musing over how much fun my evening was going to be, a co-worker suggested I call American Express Travel. I'd used my Amex to buy my ticket, so it seemed like it might work.

Not only was Amex Travel extremely nice, but they were actually able to help me. The guy who helped me was named Tim and he said they had connections to a travel-agent-only line for Alaska. He said he'd call Alaska to find out what my situation was. He took my cell number and called me back in less than an hour. Unfortunately, I was in an important meeting and couldn't answer his call.

I didn't get a chance to call Tim back until I was on the way to the airport. This time I talked with Wendy from Marathon Travel. She had talked to Tim and while we were talking, she 1) booked me on the later flight at 8:40 and 2) sent me an e-mail with my confirmation number. She noted in her e-mail that it might not work:

If they give you any trouble or want to make you pay for the ticket, you may have to resort to your last option of renting a car and driving. I hope they cooperate and everything works out well for you. In any case have a safe journey and Happy Holidays.

Thanks to Wendy and especially Amex Travel for being so helpful. I never realized they had such good customer service. I'm very impressed.

The good news is everything did work out. Or at least it has so far. There's still quite a journey that has to take place. My sister drove from Chelan, WA to Salem, OR earlier today and it took her 3.5 hours to get from Portland to Salem (a 40 mile drive). Apparently, 6 inches of ice on the freeway can mess up traffic a bit.

I just got off the phone with my Dad where I gave him the good news (I'm coming) and bad news (please pick me up). There was no hesitation on his part and I'm hopeful that my bad-ass family won't let a little snow and ice get in their way. Now let's hope Alaska Air cooperates and holds up their end of the bargain.

Update: The rest of the trip was completed without a hitch. It took 3 hours for my sister and dad to drive to PDX and another 2 hours to get home. 6 inches of unplowed ice on I-5 was very interesting. We saw several rigs spin off the road in front of us. We made it safe and sound to Salem just after 3 AM.

Posted in General at Dec 23 2008, 08:18:49 PM MST 1 Comment

AppFuse Light converted to Maven modules, upgraded to Tapestry 5 and Stripes 1.5

This past week, I stayed up a couple of late nights to do some of the AppFuse Light work I wrote about in October. I converted all web frameworks to Maven modules, as well as made them inherit from the appfuse-web project. Below is what the new module structure looks like:

New AppFuse Light Modules

At this point, the project is ready to import into AppFuse's SVN project. Here's a list of other changes I made:

  • Modules now depend on AppFuse's backend and allow you to use Hibernate, JPA or iBATIS as the persistence framework. Implementations for Spring JDBC, OJB and JDO have been removed.
  • Upgraded to JWebUnit 2.1, which now uses HtmlUnit under the hood and has much better JavaScript support. It also has Selenium support, but I've yet to try it.
  • Ajaxified Body integrated into all frameworks. You can easily turn it off by modifying the global.js file.
  • Prototype and Scriptaculous loaded from Google's Ajax Libraries CDN.
  • Upgraded to Tapestry 5. Mad props to Serge Eby and his tapestry5-appfuse project for showing me how to do this. Serge became a committer on AppFuse recently, so hopefully we'll continue to see great things from the Tapestry 5 support. I really like the clean URLs and minimum configuration required in Tapestry 5. It's testing framework is nice too, but I believe it could be improved.
  • Upgraded to Stripes 1.5. This was easy and painless. I'm definitely a fan of Stripes and look forward to reading the Stripes book on my bookshelf.
  • Dropped support for: Struts 1.x, WebWork, Spring MVC + Velocity.

If you want to try any of these applications, you can create archetypes using the following commands:

svn co https://appfuse-light.dev.java.net/svn/appfuse-light/trunk appfuse-light
cd appfuse-light/preferred-web-framework
mvn archetype:create-from-project
cd target/generated-sources/archetype
mvn install
cd ~/dev
mvn archetype:generate # The new archetype should show up as an option

Next steps include figuring out a way to flatten the inherited dependencies and plugins so archetype:create-from-project can create truly standalone projects. Please let me know if you have any questions.

Posted in Java at Dec 20 2008, 06:42:03 PM MST 9 Comments

Dojo/Comet support in Java Web Frameworks

Dojo Logo This week I'm doing a research project for a client. The main purpose of the project is to find out which Java-based web framework works best with Dojo and Comet. Here's the key requirement from the client:

It's all about Comet, we want Comet everywhere we can put it, but we want to isolate the icky bits of fiddling with pages with JavaScript. We're kind of wed to the Dojo implementation of the client-side bit, so we may as well use more of the Dojo widgets for a richer UI. For us, "works best with" needs to pay a certain amount of consideration to "fits naturally with", if you understand what I mean. I know that any framework that lets you spit out raw HTML will let you hand code in your Dojo / Comet, but that's certain to become very tiresome very quickly.

The candidate frameworks they asked me to look at are Wicket and Tapestry 5. They're willing to upgrade to Struts 2 since they're already using Struts 1. However, they don't feel that action-based frameworks naturally lead to rich UIs, so they'd prefer a component-based framework. They're currently using Seam for an administration-type application and feel it's too heavy for their customer-facing application.

Here's what I've found so far in my research. Please let me know if anything is incorrect.

  • Tapestry 5 doesn't have Dojo or Comet support (Prototype and Scriptaculous are the baked-in Ajax frameworks).
  • Struts 2 has old (version 0.4.3) and somewhat deprecated Dojo support. The developers seem to be in favor of removing it and promoting people hand-code Dojo instead. Struts 2 doesn't have support for Comet.
  • Wicket has support for Dojo 1.1 that includes Comet support. This was written by Stefan Fußenegger and posted to the mailing list last month. I e-mailed Stefan and asked him about documentation. His response: "I lost my ambition to document it properly since I didn't receive any feedback on the mailing list. :)"

At this point, it seems that if the client really wants to use Dojo, they should use Wicket, and possibly pay Stefan to document it properly. However, they're willing to consider other options, as long as they have Comet support.

One option I thought of is to use DWR and its Reverse Ajax/Comet support. Another option would be to add better Dojo support to Tapestry 5. However, I don't think this is possible since the Prototype/Scriptaculous code is generated by the framework and would likely require a changes to switch it to Dojo.

Are there any other Java-based web frameworks that support easily creating Dojo widgets and working with Comet? Keith Donald tweeted that Spring MVC has Dojo support. However, I believe it's only for widgets and it still requires you to write JavaScript. If your framework doesn't have Dojo/Comet support, how hard would it be to add it?

Update: I also posted this question on LinkedIn. Make sure and check my question for additional thoughts from folks.

Posted in Java at Dec 18 2008, 03:58:37 PM MST 19 Comments

Abbie is a Blue Skier!

On Friday afternoon, the kids and I headed up to Winter Park for a night at Zephyr Lodge. The drive up was great (no traffic) and it started snowing as soon as we got off I-70. 45 minutes later and the kids were on the slopes for the last few runs of the day. There was a few inches of snow that turned out to be great - it slowed them down enough that they didn't have to turn or worry about "pizza".

On Saturday, we put Jack in Ski School and Abbie and I had a "Daddy + Daughter" day on the mountain. She didn't want to hit the magic carpet and instead opted for the lift right away. We skied a couple greens and w/in an hour she was ready to try a blue. She did quite well on the blue and even skied a few bumps on the side. Yes, she did fall a few times, but she got up by herself and always had a smile on her face. I was extremely proud. Below are a few pictures and a video from our weekend.

Riding the Magic Carpet Snowball Fight! Pizza

I'm glad I took the kids skiing yesterday. It's been dumping with cold temperatures ever since we left. It's currently -15°F in Denver (a new record) and it's snowed 2 feet at some resorts. Now I just need to figure out a way to make it up a couple of times this week. ;-)

Posted in General at Dec 14 2008, 09:55:44 PM MST 1 Comment

How I recovered data from my failed Linux box

Yesterday, I decided to quit procrastinating and finish up my 2007 taxes once and for all. When I booted up QuickBooks on my XP box, it said it couldn't connect to drive Q. Drive Q is on my Linux box, which I discovered wasn't on. When I booted it, the screen showed an "Error 18" after the GRUB loading message. The resulted in several hours of grub-install and many other commands to no avail.

Since I hadn't messed with the box in almost a year, I didn't even know if it had Fedora or Suse installed on it. I had both disks lying around, so I tried the good ol' linux rescue with my Fedora disks. I was able to access the data, but had no luck in getting network connectivity or copying files to a USB drive.

Today I hoped for a different route: Live CDs. Yesterday, I discovered I was running Suse 10, so I downloaded a Suse 11 Live CD, burned it and booted. It worked, but I didn't have access to my hard drives and wasn't able to mount anything. Next up, I tried Knoppix, which allowed me to boot and access my hard drives. Unfortunately, I still didn't have any network access and my 2GB thumb drive didn't hold enough data.

Next, I pulled out a 250GB USB drive I had lying around. Knoppix recognized it, but was unable to format it for some reason. I plugged it into my XP box, used fat32format to format the drive as FAT32, and plugged it back into my Linux box. Success! I was able to copy all the data I needed and now I have the USB drive plugged into my Airport Extreme.

Hopefully if someone else runs into similar issues, they can use this post to find their path to success.

Posted in Open Source at Dec 11 2008, 02:02:29 PM MST 6 Comments

Costa Rica was Awesome!

After entering The Golden Period almost two weeks ago, I boarded a flight bound for Costa Rica early on the morning of Thanksgiving. I knew Costa Rica was going to be a great time since good friends (the bride and groom, Autumn and Clint) and my parents were going.

My Room at Villa Pacande On Thursday night, I had a room booked at Villa Pacande. As they suggested on their website, I took an Orange cab (for $4, not $22 like the driver tried to tell me) to my hotel. 30 minutes later I ended up at the Hotel Pacande and quickly negotiated for another cab to the Villa Pacande. 30 minutes later, I was swinging in a hammock on my room's balcony. As you can see from the picture on the right, it was a pretty nice room. I enjoyed the sunset, tipped back a few cold ones and waited for my friends to arrive at 11. After they arrived, we stayed up until the wee hours of the morning and had a fun time sharing old memories.

On Friday, we boarded a private bus that transported us from the Villa to Hotel Esperanza. It was pretty nerve-racking watching our driver navigate the narrow roads at high speed for 5 hours. We safely arrived in Playa Carrillo on Friday afternoon and soon after walked 10 minutes to the local beach. As we were walking there, my parents showed up in their rental car (they'd been in Panama for the week). Soon after, we saw some monkeys in trees then ran for the beach and splashed around in the waves of the Pacific. We entered darkness to a beautiful sunset that evening.

Monkeys Playa Carrillo Mom and Dad in Costa Rica

Sunset in Playa Carrillo Sunset in Playa Carrillo Sunset in Playa Carrillo

On Saturday, I woke up early (6:30), went on a run with my mom (very hot when the wind disappeared), had a dip in the pool and enjoyed a delicious breakfast from Dennis, the host of Hotel Esperanza. I should probably talk about the hotel a bit since that was one of the best parts. Hotel Esperanza is owned by an American (Dennis) from Florida and he and his right-hand man (Erwin) provided some of the best service I've ever seen at a hotel. The hotel had 7 rooms, and our wedding party took up 6 of them. The bride and groom occupied one, I had one, the maid of honor (Angie) had one and the other 3 were occupied by parents (mine + parents of the bride and groom). We had the place all to ourselves and it was simply magnificent.

After breakfast, we headed down to Jesse's Gym for some surfing lessons. We were told to come back at 2:30 when the tide was good. We walked down the beach to Samara and had some lunch while we waited. After lunch, 5 of us got surfing lessons and had a blast. I'm definitely hooked on surfing now and hope to get some more practice in when I make trips out to LA this winter.

Happy Fellas Beach like Glass Beautiful Beach near Samara

Wipeout! Nice Ride! No Comment

Sunday was the wedding day and we started things off by taking a horseback ride in the pouring rain. It was a warm rain, so the ride itself wasn't bad. The lack of views at the top of the mountain wasn't too great though.

Giddyup! Riding in the Rain Autumn and Clint in Costa Rica

For the wedding ceremony, all the guys traveled down to the local beach and built an altar. The ceremony was a couple hours later and we had a ball toasting, eating and dancing the night away. At the end of the night, after everyone else had crashed, Angie and I walked down to the beach with a bottle of wine and enjoyed a spectacular site: 15-20 boats that were glowing in the distance off the shore. Sure, it could've been the booze, but I'm pretty sure it wasn't. ;-)

Happy Wife You May Kiss the Bride! Goofy

On Monday morning, people started to head their different directions. Clint's parents were staying another week, so they rented a car and headed north. Clint and Autumn jumped on a bus to enjoy their honeymoon in many different parts of Costa Rica. Autumn's parents hopped on a shuttle to San Jose to catch a flight back home. The rest of us (my parents, Angie and I) stayed at Hotel Esparanza for one more night. Angie and I got massages, napped by the pool and enjoyed one last walk on the beach. Tuesday was spent driving back to San Jose. We dropped Angie off at Hotel Pacande and boarded a plane for Panama City.

After arriving in Panama City, we rented a car and drove to Ivan's Bed and Breakfast (highly recommended) for the night. On Wednesday morning, we toured the Miraflores Locks (part of the Panama Canal) and drove to our friends' house in El Valle. In El Valle, we talked, read, relaxed and watched it rain. A lot. It was a nice way to wind down the trip before flying back last Friday.

Ivan's in Panama Ivan's Bed and Breakfast Panama

Mom and Dad at Miraflores Locks At The Panama Canal Big Cargo Ship

My favorite part of this vacation was enjoying the beautiful beaches with really cool people. Good friends are always fun to party with, especially when they bring along other good friends. I love destination weddings and I'm pumped to enjoy two more in 2009: one in West Palm Beach and one in Cancun.

It's a strange feeling being back in the snow after surfing last week. Hopefully I'll get over it soon. Skiing last weekend was good therapy. 5 more days before the end of the year and I should be fully recovered.

For more pictures from this trip, see my Costa Rica 2008 set on Flickr.

Posted in General at Dec 10 2008, 12:39:24 AM MST 3 Comments