Friday, December 21, 2007

Ruby on Rails Stuff

I've found a few interesting resources for Ruby on Rails stuff and I figure I'll link 'em up here.

First up,; a collection of video screencasts on various small Rails tricks.

Next, a presentation from Dave Thomas at QCon about meta-programming in Ruby.
MetaProgramming - Extending Ruby for Fun and Profit

Rails 2.0 just came out, here's a post from DHH about some of the new features.
Rails 2.0: Preview Release

Also, if you don't own a Mac and therefore don't have that sexy Textmate editor, you might consider NetBeans 6.0. Netbeans used to be a joke of an IDE for Java but it's really come along nicely for Java and has really excelled in it's support for Ruby and Ruby on rails.
NetBeans: Ruby Developer's New Best Friend (Part 1)
NetBeans: Ruby Developer's New Best Friend (Part 2)

Saturday, December 15, 2007

A Brief Introduction to REST

InfoQ posted a very good article introducting the concepts of REST. If you've heard the buzz and are looking for a practical explanation, this looks like a good place to start.

A Brief Introduction to REST

Tuesday, November 20, 2007

Spring Framework 2.5 Released

The latest version of Spring is released, and it has tons of new features. I can't wait to get them going in some of my projects. I'm especially excited about using the @Resource annotation support.

The good folks at InfoQ have posted the first of a series of articles about Spring 2.5. Have a look...

Thursday, November 15, 2007

NBC Pulls their Youtube Channel

I just noticed today that NBC pulled down their YouTube channel. This is a tragedy. I loved watching the stuff they put up. I was generally impressed with NBC and the amount of content they were putting out on YouTube. Hell, I am still impressed that you could watch past episodes of their shows on their site.

Unfortunately, I shouldn't have to be impressed by this. How hard is that? You lace some commercials in for revenue and you put the stuff online to watch. How different is that from TV right now?

Good bye, thanks for breaking all the links on my SNL Digital Shorts post...

Tuesday, October 30, 2007

Introduction to the Spring Framework 2.5

Rod Johnson updated his "Introduction to the Spring Framework" article to include the Spring 2.5 updates.

I've always forwarded this article on to folks that are new to Spring to get a footing.


Friday, October 19, 2007

Securing Java Applications with Acegi

Consutlant Bilal Siddiqui wrote a series of articles at IBM developerWorks around Acegi. Definitely worth a read if you're trying to understand Acegi. Our reference guide is good, but it's a bit over the top for most folks.

The first article was released in March 2007. The third part was released on September 25 2007. I've fallen behind on my feed reading a bit :P

Thursday, October 18, 2007

IntelliJ IDEA 7.0 Released

IntelliJ IDEA 7.0 was released three days ago. I just got it up and running here, so I'll be feeling out the new features.

The folks at IntelliJ were kind enough to provide the developers of the Acegi Security (aka Spring Security) framework an Open Source license for use in the Acegi Security project. In the past I had to contact them when new major releases came out. This time they were on the ball. A new license key was mailed out the next day. So, if you work on an open source project and would like to try out IntelliJ you can apply for an Open Source license.

Now a quick list, for my own reference really, of the features I'm most interested in...

These are just the new or improved features. I already believe that IDEA is simply the best Java IDE out there. Period. Lots of folks complain that it's not free. Well, it is free to Open Source projects, and the individual license is pretty respectable at US$249.

I think I'll try out the new features and build a sample project around my DAO articles and upload it here...

Friday, October 12, 2007

Video: Rolling out Web Services the Right Way with Spring-WS

Posted two days ago at, a video about the Spring Web Services project. The video is a recording of Arjen Poutsma of Interface21 at the Spring Experience conference in December 2006.

We have chosen Spring-WS for a project my team is starting at work. We will definitely sit down and watch this. I have no idea if the video is good or not, I haven't watched it yet. Arjen is a really smart dude, so I'd imagine there's some good information here.

Friday, October 05, 2007

Saturday Night Live: Digital Shorts

At lunch today someone mentioned that they don't watch SNL any more. They asked if it was still funny. Honestly, they can't all be gems, but yeah it's definitely still funny from time to time. When people think about SNL, they only remember what they want to remember. Most folks tend to remember the "Land Shark", the "Samurai Tailor", and most stuff Dana Carvey did. You know what was in between all those memorable skits? Stuff that wasn't funny.

So, like I said, they can't all be gems. SNL has been on a roll with creating these "Digital Shorts" the last view years. Most of them are hysterical. I've already embedded a few of them here in the past. Today, in response to the lunch conversation, I've compiled a list...

“Lazy Sunday”

“Special Christmas Box”

“United Way” (Peyton Manning isn’t the nice guy you think he is)

“Maraka” (If your kids watch Dora)

“Apacalypto Recut” (A shot at Mel Gibson, who was um in the news at the time)

“I Ran”

“Natalie Portman” (Her Gangsta Lifestyle...)

You'll notice most of these are actually published by NBC, which is very cool. You'll also see that they almost all contain a shaggy haired kid named Andy Samberg. I think Andy is one of their big up-and-coming stars right now.

Andy is also a member of "The Lonely Island" writing group. It turns out that they wrote most of the really good digital shorts. Have a look :)

Wednesday, September 26, 2007

Adding Generics to the AbstractHibernateDao

In my previous post, "The Best AbstractHibernateDao Ever", I made a passing reference to the generics being a problem.

So now, in slight contradiction to my "The Best Generic Dao Interface Ever" article, I am going to add Generics to the "AbstractHibernateDao".

If you don't know what Generics are, and you're a Java developer, you obviously aren't keeping up-to-date with your chosen trade. In fact, you should stop reading my blather and go study. Start here "New Features and Enhancements J2SE 5.0". Be sure to read the "Generics Tutorial"

Alrighty then. Why do we want generics on our DAO? Let's look back at our UserDao example, and have a look specifically at our "findAll" method...

public List<User> findAll() {
return all();

The problem with this method is in it's definition on the AbstractHibernateDao. The "all()" method comes from the AbstractHibernateDao and is defined like...

protected List all() {
return criteria().list();

Why are generics a problem here? Well the Hibernate critria returns a "List". It is a list of "Object"s, nothing more. Our AbstractHibernateDao respects that and returns a "List". This "List" is a "List<Object>" (a "List of objects"). Our UserDao on the other hand returns a "List<User>" (a "List of Users").

Well now we have a mismatch, a "List of Objects" is not a "List of Users", we are implying specifics that aren't enforced. Unfortunately there isn't much we can do about it. Hibernate doesn't have generics, so we have to have some faith that when we ask Hibernate for Users, it's going to give Users, not Toast. The easy fix for that is to mark our "UserDaoImpl.findAll()" method with the SuppressWarnings Annotation...

//fixin it the lazy way
public List findAll() {
return all();

That fixed it right? Wrong. This sucks. This sucks because I'll need to put this @SuppressWarnings annotation all over the place. I need it on each on all of the methods that return lists. I'll need it on most of the methods in every Dao I create. So like I said, this sucks.

OH! And don't forget about all the downcasting we're doing...

public User findByUsername(String username) {
return (User) criteria().add(
Restrictions.eq("username", username)

Here, we are downcasting the "Object" returned from "uniqueResult()" to the "User" instance we asked for. Generics can help with all this.

My goal is for the DaoImpls to be "downcast" and "SuppressWarnings" free. In order to accomplish this I need to push the "dirty" stuff up into the AbstractHibernateDao. So I'll add a few wrapper methods that handle the downcasting and untyped collections...

public abstract class AbstractHibernateDao<E> {

private final Class<E> entityClass;
private final SessionFactory sessionFactory;

public AbstractHibernateDao(
Class<E> entityClass,
SessionFactory sessionFactory) {

"entityClass must not be null");
"sessionFactory must not be null");

this.entityClass = entityClass;
this.sessionFactory = sessionFactory;

protected Criteria criteria() {
return currentSession().createCriteria(entityClass);

protected Query query(String hql) {
return currentSession().createQuery(hql);

protected Session currentSession() {
return sessionFactory.getCurrentSession();

protected List<E> all() {
return list(criteria());

public Class<E> getEntityClass() {
return entityClass;


protected List<E> list(Criteria criteria) {
return criteria.list();

protected List<E> list(Query query) {
return query.list();

protected E uniqueResult(Criteria criteria) {
return (E) criteria.uniqueResult();

protected E uniqueResult(Query query) {
return (E) query.uniqueResult();

protected E get(Serializable id) {
return (E) currentSession().get(entityClass, id);

So, now, I've added generics to the AbstractHibernateDao. I've changed the class declaration to...
public abstract class AbstractHibernateDao<E>

Let's just jump right into the changes this makes to our UserDaoImpl...

public class UserDaoImpl extends AbstractHibernateDao<User> implements UserDao {

public UserDaoImpl(SessionFactory sessionFactory) {
super(User.class, sessionFactory);

public User findById(Long id) {
return get(id);

public User findByUsername(String username) {
return uniqueResult(criteria().add(
Restrictions.eq("username", username)

public List<User> findByEmail(String email) {
return list(query("from User u where = :email")
.setParameter("email", email)

public List<User> findAll() {
return all();

public void save(User user) {

public void delete(User user) {

By employing Generics on the AbstractHibernateDao and isolating all downcasting and warning suppression to AbstractHibernateDao we can have a much cleaner DaoImpl. What I did was add wrapper methods to the AbstractHibernateDao for list(Criteria), list(Query), uniqueResult(Criteria), and uniqueResult(Query).

Using these new wrapper methods you see that the UserDaoImpl no longer calls query.list() it calls list(query) to get back a typed list. Also, the UserDaoImpl no longer calls criteria.uniqueResult(), it calls uniqueResult(criteria).

The isolation gives us one place to hide our dirty laundry (the AbstractHibernateDao). Maybe, some day, Hibernate will support Generics. That day is probably very, very far away. I would have thought the new JPA EntityManager API would support generics. Apparently it does not either, how unfortunate.

Monday, September 24, 2007

The Best AbstractHibernateDao Ever

(Follow up to "The Best Generic DAO Interface Ever")

I love the 3rd grade title theme I got going on here. Anyway...

I've seen so many incarnations of an AbstractHibernateDao out there; some are good, some are bad. Myself, I've always gone the AbstractHibernateDao extends HibernateDaoSupport route myself. I'm a huge fan of Spring for the amount of helpful stuff it provides in all areas of "Enterprisey Software Development".

I've done some re-thinking of the Spring Dao concept lately. See, according to Alef Arendsen of Interface21, "start using the Session and/or EntityManager API directly". In other words, stop using the HibernateTemplate, it isn't really useful.

As it turns out in Spring 2.x in combination with Hibernate 3.x (I'd go with no less than 3.2.1), you don't need the HibernateTemplate. If you are using the Spring LocalSessionFactoryBean to configure your Hibernate SessionFactory, the HibernateTemplate just isn't needed. The reason is that the LocalSessionFactoryBean creates a proxy SessionFactory that implements the SessionFactory.getCurrentSession() method appropriately for Spring intercepted classes.

So if you're using Spring Transaction management (via annotations, declarative xml, or what-have-you), you don't need the HibernateTemplate. Now, the one area that the HibernateTemplate does help with is the Exception translation. Hibernate 2.x just threw HibernateException for everything, you were left guessing really what the true problem was. The Spring HibernateTemplate would translate these 'bad' HiberatenExceptions into Spring's DataAccessException hierarchy. This meant that you could easily handle DataIntegrityViolationException vs. IncorrectResultSizeDataAccessException. Well, Hibernate 3.x has it's own exception hierarchy. So you can handle ConstraintViolationException vs. NonUniqueObjectException.

If you want that exception translation, there's some voodoo you can do with an annotation called "@Repository" (There's that repository word I mentioned in my last post). This annotation wraps your Dao (or Repository) with a proxy that will convert the HibernateExceptions to DataAccessExceptions. I don't think it's really that useful to do, so I don't do it...

So, now, if we combine Spring's Handling of the Session for us, with the Hibernate SessionFactory.getCurrentSession() we get a very simple, very clean AbstractHibernateDao to base our Dao's from...

public abstract class AbstractHibernateDao {

private final Class entityClass;
private final SessionFactory sessionFactory;

public AbstractHibernateDao(
Class entityClass,
SessionFactory sessionFactory) {

"entityClass must not be null");
"sessionFactory must not be null");

this.entityClass = entityClass;
this.sessionFactory = sessionFactory;

protected Criteria criteria() {
return currentSession().createCriteria(entityClass);

protected Query query(String hql) {
return currentSession().createQuery(hql);

protected Session currentSession() {
return sessionFactory.getCurrentSession();

protected List all() {
return criteria().list();

protected Object get(Serializable id) {
return currentSession().get(entityClass, id);

public Class getEntityClass() {
return entityClass;

The purpose of the AbstractHibernateDao above is to take away any work the sub-class Dao might have to do regarding the "Persistent Class" it's responsible for. Meaning that subclasses don't have to pass the Class all the time.

What does it look like in use? Well, let's pretend we have a User entity and a UserDao.

First, our "User" entity...

public class User {
private Long id;
private String username;
private String email;

//getters and setters omitted

And now the User Dao or Repository...

public interface UserDao extends Dao {

User findById(Long id);

User findByUsername(String username);

List findByEmail(String email);

List findAll();

void save(User user);

void delete(User user);

Now let's implement that UserDao using our AbstractHibernateDao...

public class UserDaoImpl extends AbstractHibernateDao implements UserDao {

public UserDaoImpl(SessionFactory sessionFactory) {
super(User.class, sessionFactory);

public User findById(Long id) {
return (User) get(id);

public User findByUsername(String username) {
return (User) criteria().add(
Restrictions.eq("username", username)

public List findByEmail(String email) {
return query("from User u where = :email")
.setParameter("email", email)

public List findAll() {
return all();

public void save(User user) {

public void delete(User user) {

If you're curious about what the "Dao" interface here looks like, see my previous post "The Best Generic Dao Interface Ever". Or you can skip it and just know that the Dao interface is simply a Marker, there isn't a single method on it.

Understanding this Dao infrastructure has a very low barrier to entry. You don't need to know how the Spring HibernateTemplate interacts with the Hibernate Session to use this. You only need to know how to use the Hibernate Session. There is very little noise in this Dao, it is all directly related to querying Hibernate, as it should be.

This implementation relies on the Hibernate SessionFactory.getCurrentSession() method. When you combine Spring with Hibernate here you get a very elegant solution with no stuff about transactions or any weird abstraction layer in the way. There are whole books around using the Hibernate Session. The Spring HibernateTemplate only gets a few pages dedicated to it in any Spring book. That right there means you spend less time explaining it to people, tell them to "Read the freakin' manual".

Disclaimer: You might notice that there are some generics used in here that will cause "unchecked" warnings. I didn't bother with a lot of generics and the @SuppressWarnings("unchecked") stuff in this example because they can be distracting. To see the generics cleaned up, read "Adding Generics to the AbstractHibernateDao"

Wednesday, September 12, 2007

The Best Generic Dao Interface Ever

If you Google the phrase "Generic Dao" or "Generified Dao", you'll find several hits all over the internet. They all look like this...

* This sucks, keep reading...
public interface Dao<I extends Serializable, E> {
List<E> loadAll();
E findById(I id);
void save(E entity);
void remove(E entity);

Now, the code above might not even compile, I just slapped it in. The purpose of this interface, and all the examples on the internet, is to define the overall structure of all Daos in the application. This generic Dao interface defines the following contract...
* All Daos will have a loadAll() that returns a list of entity instances.
* All Daos will have a findById method to find an entity with a given "id".
* All Daos will have a save and remove method that takes an entity.

Well isn't this just grand, we now know these four facts about all our Daos. Life is good and we'll all be paid huge for knowing this, right? Not really, the thing with this interface is that you've painted yourself into quite the corner. As your application grows you may not 'need' these methods. Even worse, you might come across cases where you simply shouldn't have these methods. Next thing you know you're trying to split things up into a "ReadOnlyDao" and a "WriteableDao" or some such garbage.

This is the case I found myself in. What did I do on my next project, after learning my lesson?

Try to keep up, this is going to be complex and probably way of the top in the 'voodoo' department. Are you ready?
Ok, here it is...

public interface Dao {

Look out ma! It's a marker interface! You may say, "But Ray, won't chaos ensue? We haven't defined the contrat that all our Daos should follow." Calm down. Do you really think you know how every Entity in your application should be accessed now? I mean if you're writing the "Dao" interface, you're probably pretty early in the project. You really have no idea what all the data access requirements are going to be.

In many systems every Entity has a Repository. Repository is a term gaining popularity over the Dao acronym. Repository is a nice word I guess, but we all call them Daos; so let's just go with it. Each Entity has a Dao. Let the Entity drive the Dao design. Let your domain drive the Dao design. For god's sakes though, don't get on a high horse and try to define it for them with some junk you found on the internet.

Now, the generified version does give you the ability to say that all our methods that destroy Entity instances should be called remove and not destroy on some Daos and delete on others. This rigid construct ends up in place when you may not want a remove method at all. Use something like CheckStyle, or at least have people on your team competent enough to follow the conventions set forth in your project.

Next, we'll talk about "The Best AbstractHibernateDao Ever".

Thursday, August 09, 2007

Mavenize your development

Great blog; chocked full of tips for using Maven2.

Thursday, July 12, 2007

iPhones at Twitter

From the Twitter Blog:

As you might imagine, there are lots of expenses associated with employees--salary, health insurance, etc. In the grand scheme of things, buying 10 employees a fancy new iPhone is not a gigantic expense. However, arriving at the office on a normal weekday and discovering a brand new iPhone waiting for you feels like an extra fancy perk.

They bought each of their employees an iPhone. Granted, they only have 10, but come on, how cool is that?

Now granted; Orbitz gave me a BlackBerry, but that isn't nearly as cool is it? The BlackBerry is nothing more than a digital leash...

Monday, July 09, 2007

Top 25 Worst Tech Products of All Time

PC World's "The 25 Worst Tech Products of All Time" has the 3Com Audrey on their "(Dis)honorable mention" list. She didn't make the Top 25 at least.

I worked on Audrey at 3Com back in 1999. I saw where it and the company were going and got the hell out of there. There was no hope for it, and nobody was listening :(

Monday, July 02, 2007

Groovy Views in Spring MVC

I thought it might be fun to try and implement Groovy as a View technology in Spring MVC. Most people that use Spring MVC are familiar with the JstlView for Jsps, or the VelocityView for Velocity templates, and the far superior FreemarkerView for FreeMarker templates.

So, let's think about what we'd have to do to use Groovy to render views...
We'd need to be able to load a resource as a groovy script, bind some stuff to it (the request, response.getWriter as out), and evaluate it.

Well, it turns out it wasn't fun at all. In all of about 10 minutes I got it working and it was really boring...
Keep in mind that the code here is totally rudimentary, there's no caching or anything like that. Anyway, check it out...

public class GroovyView extends AbstractTemplateView {

private static final Logger log = Logger.getLogger(GroovyView.class);

protected void renderMergedTemplateModel(Map model, HttpServletRequest request, HttpServletResponse response)
throws Exception {

Binding binding = createBinding(model, request, response);

GroovyShell shell = createGroovyShell(binding, request, response);

Resource resource = loadViewResource(request, response);

if (log.isDebugEnabled()) {
log.debug("resource: [" + resource + "]");

evaluateViewResource(shell, resource);

protected Binding createBinding(Map model, HttpServletRequest request, HttpServletResponse response)
throws IOException {
Binding binding = new Binding(model);
binding.setVariable("request", request);
binding.setVariable("out", response.getWriter());

return binding;

protected GroovyShell createGroovyShell(Binding binding, HttpServletRequest request, HttpServletResponse response) {
return new GroovyShell(binding);

protected void evaluateViewResource(GroovyShell shell, Resource resource)
throws IOException {

protected Resource loadViewResource(HttpServletRequest request, HttpServletResponse response) {
return getApplicationContext().getResource(getUrl());

OK, there's the implementation, how would you use it in Spring? Well you can combine it with a UrlBasedViewResolver.

<bean id="groovyViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="prefix" value="WEB-INF/views/">
<property name="suffix" value=".groovy"/>
<property name="viewClass" value="raykrueger.GroovyView"/>

Really just follow any Spring MVC 101 example you can find on the internet and use the GroovyView here. Then you can create groovy scripts to use as views that look like...

builder = new groovy.xml.MarkupBuilder(out)

builder.html {
head {
title "Hi there"
body {
p "Hello from the GroovyView"
p "Neat Huh?"
a(href:'', "Ray Krueger's Blog")

Then you have all the power of Groovy at your fingertips to build views for your models. Accessing fields and looping iterators is a boatload easier in Groovy than in jstl. Though, honestly, you can do a lot of this stuff with Freemarker...

Now, I'm sure you can clean this up a bit and optimize the crap out of it (view caching and such). Really I just slapped this together as a thought.

Here's the source

OpenId updates to Acegi

I've promoted my first wave of changes to the Acegi OpenId support in the sandbox.
  • Added support for OpenId4java
  • Added OpenIdAuthenticationProcessingFilter to replace current Servlet+Filter approach
I'll remove the existing Janrain and servlet stuff once I've had a chance to try and build a sample using the new code.

Sunday, July 01, 2007

South African Chenin Blanc

This weekend my wife and I opened a bottle of "2005 Man Vintners Chenin Blanc" from South Africa. This rocked our socks off. We really enjoyed it. The wine was off-dry and very fruity, a fantastic summertime wine.

We had gotten into a rut of bad Rieslings and Pinot Grigios recently. I was feeling pretty down on the whole white wine thing again. Then we tried this Chenin Blanc; it really opened my eyes. We're definitely going to try a few more Chenin Blancs from South Africa (though nobody really has a huge selection of them). We might even try it's French cousin Vouvray. Vouvray is Chenin blanc from the Vouvray region in France. Rule number one for Chenin Blanc though, Don't by the crap we make in the US...

Thursday, June 21, 2007

Microsoft Surface: Part II

I blogged previously about Microsoft creating the coolesting thing ever. Well here's a video showing the world what it's all about...

Netflix: "Watch Now"

Netflix introduced a new service that allows you to watch movies online. You have to use Internet Explorer and Windows Media Player to watch them, but whatever; it works.

It is an interesting model they've set up. For each dollar you're paying in to your Netflix subscription, you get an hour of movie watching. So if you're paying $19.99, you have 20 hours of movies you can watch online. The movies you watch, or the time you spend watching them, do not effect your queue or your per-month limits. Not a bad deal.

Now, unfortunately, they are only available as an online stream. You cannot watch them offline. Myself, I like watching movies on my 40 minute, twice a day, train ride. So this doesn't work for me there. Well, maybe they'll come around.

Monday, June 11, 2007

Mark Buehrle: 100 Career Victories

It took eight tries, but Mark Buehrle finally got his 100th victory this weekend. Granted, this not as exciting as his no-hitter this year. But congratulations Mark, not that you'll ever see this :P

Wednesday, May 30, 2007

Microsoft Creates the Coolest Thing Ever

From, Microsoft has introduced their "Surface Computing" system. This has got to be one of the coolest things on the planet...

Wednesday, May 23, 2007

Big Day for Soccer Fans

Today is the UEFA Champion's League Final. AC Milan will play Liverpool in what's sure to be...
...oh who cares.

I'm an ignorant American and I don't give a damn about Soccer. I've been listening to sports radio and poking around on the internet a bit. I can appreciate the magnitude of it to the individual fan, this is their SuperBowl, their World Series. Here's the thing though, the rest of the world doesn't give a damn about those two events either. A large portion of our planet will be watching this event, think about that.

It's amazing that Soccer is such a worldwide phenomenon and still, as of yet, hasn't taken hold here in the states. I don't know anything about Soccer, and I'll never play it (too much damn running around on a field the size of Luxembourg).

My (almost) 5 year old daughter is going to be doing a little Soccer with the Park District this year. Maybe she'll get hooked? Maybe I'll get hooked? Somehow I doubt it...

What do you wanna bet that this will be my only post with the tag "Soccer"?

Sunday, May 20, 2007

One App, Multiple Architectures

I've got my eye on a few different technologies these days. I figure it might be fun to write one application in each of them and see how it goes. I intend to write a basic wine cellar application (gotta scratch my itch) using a few different technology stacks.

First, I'll go with my usual set. Java with Spring 2.0, Spring MVC, Spring Webflow, and Hibernate. I may not finish this as it will probably bore me, but we'll see. Maybe I'll do this as a 100% Webflow app; who knows.

Second, I'll play with something I've been dying to try for a bit now. This round will be Java with Wicket, Spring 2.0 and Hibernate. Spring and Hibernate are like peanut butter and jelly to me, they are just meant for eachother. Writing a java app without them these days is just masochism. I'm dying to try out Wicket for the MVC layer, I love the vision they've come up with.

The third iteration will be Ruby on Rails of course. This will probably take me like 2 hours to do what the previous two iterations will take me 2 days to do. Really, it will take me longer as I'm not as fluent in Ruby as I am in Java. I love the database conventions set forth in RoR and will be following those throughout this little exercise.

I may or may not make a pass at Seam. I'm on the fence as to whether or not I like it. I can't pass judgment yet as I haven't spent enough time looking into it.

I figure this will be an interesting thing to do. It gives me something to do with these technologies. I've always said that programming is like painting. You can't just paint something, you need inspiration. Same with programming, you can't just "write an app". You have to have a purpose. Hell, I may never get past the first app with all the stuff I got going on right now anyway (still gotta work on that OpenId support for Acegi).

We'll see how it goes, and I'll post little tidbits of what I find along the way. Maybe I'll throw all the code up at googlecode when I'm done, who knows.

Saturday, May 19, 2007

F*cking Logan...

Boon Logan gave up a Pinch Hit Grand Slam to Derek Lee off the bench to put today's Sox Cubs matchup out of reach.
And now back to drowning my sorrows...

Friday, May 18, 2007

Sox @ Cubs

It's interleague play time this weekend for Major League Baseball. I am a White Sox fan as everyone born on the Southside of Chicago should be. Really, as everyone in Chicago should be. The Sox-Cubs series is always a good time around Chicago. I love watching all the cubs fans wear their cute little red, white and blue jerseys, and then look away in shame when a Sox fan comes along.

I am not a huge fan of the interleague games outside of the rivalries; Sox-Cubs, Mets-Yankess, Giants-A's. Other than that I really don't care to see the Sox play the Pirates. Anyway, this isn't the "real" interleague play period yet, that's in June when it goes on for two whole weeks. The Sox-Cubs series is always fun though.

Wednesday, May 16, 2007

Update: Acegi and OpenID

I was going full-tilt into refactoring the OpenID support in Acegi. Unfortunately I got held up with home and work (gotta have your priorities in order). There are few central points that I'm focusing on right now...
  1. Replace the JanRain support with OpenId4Java.
  2. Replace the Servlet that is in there with an AuthenticationProcessingFilter based approach.
  3. Try and get some form of integration into the contacts sample.
The JanRain library is all but deceased, and it doesn't seem to support redirects anway. The OpenId4Java library seems to be the most active, and properly supports redirects and discovery. The Servlet that is in there now is well intended but doesn't mesh with the overall architecture in Acegi.

I'm going to try and get this stuff ramped up pretty quickly. Since Ben Alex is starting rumors he's going to be talking about it at Spring One.

Monday, May 14, 2007


Nope, that's not a typo in the title...

Buildr is a new java application build tool. The fun part is that it's written in Ruby and based on Rake. Rake is an extremely powerful build tool for Ruby applications. There have been a few attempts at adapting it to building Java applications. Most of those attempts were based on the idea of pretending that Java app is really a Ruby app. That principal packs the tool full of workarounds and hacks. Buildr isn't like that at all.

Buildr ties together a few components to build java applications; knowing full well they are java applications. It embraces all of the good ideas behind Maven, without the main bad part: Maven itself. Maven can be very powerful, but that is overridden by Maven being amazingly difficult and unpredictable. The good parts of Maven are the conventions and guidelines around the project directory structures and dependency management via repositories.

I originally discovered buildr through a post at Tim Bray's Ongoing blog. In that post he links to an article by Assaf Arkin. Assaf is one of the folks behind Buildr. Assaf describes his pain with Maven and how they solved it with buildr.

Buildr is still very limited in scope (that's a good thing right now). It doesn't appear to have means of running cobertura for unit test coverage yet. Buildr also lacks an idea task for building Intellij IDEA module files, though it does have an eclipse task. You can see were Assaf's loyalties lie on that one! I'm toying around with writing the idea task myself, but I've got a lot of learning to do in the Rake department. Buildr also doesn't do any of the site generation stuff that Maven can do. This can easily be fixed with a few rhtml templates and ERB.

I toyed with Buildr this weekend for a little bit and was able to get the code for Fizzle (more on that later) to build and publish very easily. You can build multi-component projects with only a single RakeFile at the head of the project. Maven requires a pom.xml in every module. Each repeating various inter-module dependency names and versions all over (bleh). Multi-component stuff is much imporved in Maven2 vs. Maven1, but still hard to approach.

Right off the bat I fell in love with Buildr over Maven for one very simple trick.
The following tests failed:

Come on Maven, how hard is that? I really don't want to scroll back through 1000+ lines of unit (in Acegi's case) test output to see which one says FAILED. That's ridiculous. I was so inspired by this I stopped everything I was doing to mention it to the buildr folks.

As I said above, Buildr is very light right now. I think overall it has a chance to really be great if it gets enough love. I wonder if we can move Acegi to it, that might be fun :P

Check out Buildr, and discuss it on their google-group.

Thursday, May 10, 2007

President Feed: Widgets and Politics

I've added the fancy-schmancy flash widget from to the right hand side of the blog. If you haven't checked out, you should! Sign up and vote!

It's fun to watch the approval ratings shift after casting your approvals and disapprovals. For example, after watching the Republican Presidential Debate on NBC. They asked McCain if he believed in evolution, he said yes. Then they asked for a show of hands of those that do NOT believe in evolution. Brownback, Huckabee, Tancredo all raised their hands. Well, that gets a 'disapprove' vote from me any day. Come on guys, wake up. Also, really, do we want "President Huckabee" hanging over us for 4yrs? That sounds ridiculous.

After watching the Democratic debate I cast some votes too. I dissed Kucinich, because he seemed to squirmy for my tastes. And I dissed Gravel because he came off as "the crazy old man in the corner".

Wednesday, May 09, 2007

Twitters from Java One

Tim O'Brien is out at javaone and twittering out some updates. From what I hear, JavaFX ain't too shabby. Check out Tim's Twitter page and 'follow' him for updates.

Tuesday, May 08, 2007

Playing with Twitter

Following Gary Vaynerchuk's lead, I joined Twitter. If you'd like to join with me I registered as NewbNamedRay. NewbNamedRay is my wine-related alter ego :P

Friday, May 04, 2007

Tim O'Brien interiviews Tim Bray

Interview with Tim Bray: Atom, JRuby, and the Ecumenical Sun

Tim O'Brien, O'Reilly author and overall smart guy, got a chance to sit down with Tim Bray for a chat. Most folks who know of Tim Bray know him as the "father of xml". Bray is also a big proponent of Ruby, Atom (which you'll see all over any blogspot blog, look below), and many other current technologies. Bray has a blog at where he'll post on a very wide variety of subjects. Unfortunately he'll also post nothing but pictures of flowers for a week if he feels like it too. It was Bray's blog that got me looking closer at OpenID actually.

Way too smart

My friend Andy Cirillo just informed me he setup his "Homepage". Homepage. I love it. Andy is a brilliant dude that I learned a ton from while I was working with him back in the good old days at Spririan.

I started looking over his blog posts this morning. Unfortunately I think they're all in Italian or something because they make no sense to me. :)
Welcome to the internet Andy!

Tuesday, May 01, 2007

The Landlord

I should have posted this a while ago...

The Landlord

Monday, April 30, 2007

White & Nerdy

If you are reading my blog you may or may not be white, but you are probably nerdy.
Admit it.
Don't be shy...

I promise to post something worthwhile soon :)

Wednesday, April 25, 2007

Meson Sabika - Naperville

My wife and I just celebrated our 8th anniversary. We had Grandma come over to watch the kids so we could get out for dinner. We went to Meson Sabika in Naperville. This was one of the best dining experiences I've ever had. It is a Spanish Tapas restaurant serving only authentic Spanish offerings.

The food was amazing. I had never been to a Tapas restaurant, and had no idea what it was. Essentially the entire menu is appetizer sized portions of traditional Spanish dishes. They are relatively small portions meant for sharing. The prices are mostly in the $5 and $6 dollar range. You can go up from there of course. Everything we ordered was from the "Hot Tapas" menu if you're following along. First we had "Pincho de Solomillo", "Champinones Rellenos", and an "Empanada de Buey". My wife ordered a glass of white Sangria and I (of course) ordered a glass of Spanish red wine from Rioja. The name of the wine I had was Azabache, it was fantastic. Unfortunately I don't know more about the wine than that (I'm going to give them a call later).

Our server was fantastic. We had finished off our first three dishes and were going to order another. We ordered a dish that involved artichoke hearts, spinach, and a Spanish cheese. Unfortunately I don't see that dish on the menu right now. The cheese was fantastic, and the dish overall was very good. Back to the server, he told us that we absolutely had to try the "Datiles Con Tocino". This dish, as the menu reads, is "Baked dates wrapped in bacon served with a red bell pepper sauce". Sounds strange right, dates wrapped in Bacon? It was one of the most amazing dishes I've ever had. I commented to the server that it was excellent and sounded completely strange. He said everyone says that, but when they come back it's the first dish they order. I'm thinking that will be the case for my wife and I as well.

Next it was time for dessert! Again, our server takes over to ensure success. We asked him what the Flan of the day was. I'm going to try and reproduce his response in writing as best I can. He said, "The flan of the day is cinnamon... Do you like chocolate?" My wife and I laughed, at this point we trust him, so we said "absolutely". He recommended the "Crema de Chocolate". The dish is like a Crème brulée made with heavy creme on a bed of chocolate. It was mind blowing. Our server told me that I had to try it with a glass of Port. I had said that my wife put her foot down on that idea already. He said I was really missing out, and went on his way. He came back shortly afterwards with a small taste of Port and said, "This is on me my friend, you have to try it. If you like it maybe you buy a glass next time". This guy kicks ass right? Man, he was right, absolute heaven.

I realize this is my longest blog post ever. Simply put, if you are ever in the Naperville IL area and looking for a fantastic meal stop into Meson Sabika.

Sunday, April 22, 2007

Friday, April 20, 2007

OpenID support in Acegi Security acegisecurity-developer

Acegi security now has a first-draft of OpenID support as provided by Robin Bramley of Opsera Limited. We'll definitely need to get some documentation and samples going. It's a great start though.

More info on OpenId...

Thursday, April 19, 2007

Congratulations Mark Buehrle!

Last night, a rare and very special thing happened on the south side of Chicago. Mark Buehrle, long-time ace pitcher for the Chicago White Sox, pitched a complete game no-hitter.

This is special for many reasons. This day and age a complete game itself is less and less common. Managers like to bring in middle relievers and closers, because everyone worries about pitch count. Most of the time, if your pitcher gets to 100 pitches, they get yanked. There are a few horses left out there that will go the complete game, Mark Buehrle is one of them.

A no-hitter (or in baseball slang, the no-no), is a game where the offense fails to get a single hit during the entire game. You can have a no-hitter, while still switching pitchers, but that's no fun. What's important is to see one pitcher go all the way without allowing a single hit. Not one. There is also the concept of the "Perfect Game". A perfect game is one where the pitcher does not allow any hits or walks for the duration of the game. Mark did walk Sammy Sosa in the fifth inning, but he promptly picked him off at first base.

Here's some perspective on the no-hitter accomplishment. Mark is only the 16th pitcher in White Sox history to throw a no-hitter. The White Sox have been around since 1900, so think about that a second. Here's a list of all the pitchers in history who have accomplished the no-no.

Wednesday, April 18, 2007

Here's something fun that I should have blogged about earlier. Have a look at Here's the deal. Monday through Friday at 1pm EST a new wine will be offered with free shipping. One wine, one day, free shipping. What sort of wine will it be? Well that's up to Gary Vaynerchuk and friends.

Overall the wines are usually intriguing ideas from various places around the world. For example, here's a recent entry from Greece. (note that the old links are not valid for free shipping) Is it good? Who knows. Usually the community will leave comments on the wine if they've had it or not. You gotta be quick though if you see something you like. The wine will sell out pretty quickly. Then you'll see the comments go from Wine to Whine in a hurry.

Here's a tip I posted on one of the quick-sellouts recently...
I setup a “Scheduled Task” in Windows to open a browser to at 12:05 (CST). That way I never forget to check it.

This is a great service where you can really find some steals if you pay attention. Don't miss out on something you think you might like by second guessing it. Get off the fence and ring it up!

For more information you can read the "About" tab.

Wednesday, April 11, 2007

Learning Flex

I'm having a little fun on the side learning about Adobe Flex 2. I don't have Flex Builder 2, as it is incredibly expensive. I'm just using vi and the mxmlc compiler from the free Flex 2 SDK download. I have also downloaded the Flex Builder 2 Trial from the site, but haven't installed it yet.

Right now I'm following the "Live Docs" available online from Adobe. They're not bad, most of the examples have the Flex Builder part first and then show you the mxml source output on the next page. I've gotten along pretty well by just skipping the "Set up your project" pages.

So far, it's fun and interesting. I don't know if I'll invest in a book just yet, just to see how far I get without one.

Tuesday, April 10, 2007

Pandora: Internet Radio

It's seems Vinay and I are playing blog-tag. My friend Vinay posted an article about Pandora, an internet audio site. This is too cool. You type in an artist or song and it navigates you through music with similar styles. Like I said, too cool.

Another thing I noticed about the site is the advertising. I know it sounds odd, but I like their approach. There is a somewhat obtrusive advertisement in the top right corner, but it isn't overwhelming. The interesting thing is that the site is basically skinned to the advertisement. Each track change brings with it a new add, and a new skin to the site. The current BP campaign involves these cartoony looking babies driving in a car. The Pandora page gets re-skinned with the colors and background image of the babies in the ad. A very interesting approach.

Monday, April 09, 2007

Event Stream Processing

I recently read an article at OnJava: "Esper: Event Stream Processing and Correlation". Event Stream Processing is a very cool technology that allows real-time reaction to events in your business. It can be used effectively in network monitoring and business intelligence.

Rather than reacting to receiving a single event, which doesn't scale well from a network monitoring perspective, you react to an aggregated view of those events. If one request to your database is slow, that isn't significant in a large application. If you look at the request times over a 1 minute period, and see that the latency is increasing; that's very significant. Stream processing allows you to process these sort of events.

I'm not a business guy, so any example I come up with for that is going to be totally contrived and lame. I'm sure there are some great ones though :P

Have a look at Wikipedia for more explanation.

Back to the article...
The article focuses on using an open-source tool caled Esper, which is avaialable from Codehaus. I haven't set the application up yet, but I will on one of my two 40 minute train rides. We use a similar product where I work. It is not open source, and is not available to me here. Politics :)

Sunday, April 08, 2007

President Feed: Update

Tim O'Brien and friends have made some nice updates to PresidentFeed. I see you can remove your vote, without having to cast a new one now. The UI is cleaned up, it looks a little more - I dunno - serious I guess. The new widgets that show approval percentages, and vote charts. Very nice.

One thing that was removed, that I think is unfortunate, is the links to the candidate sites. I'd love to see the site aggregate news info about the candidates. Having one site that gets news updates for all the candidates in one friendly place; that'd be extremely cool. Hell, even if it's just links to a search.

What do you think Tim? :P

Tuesday, April 03, 2007

Back from Vacation

My family and I drove down to Florida for a week long vacation. I live in Chicago, so it takes like two days to get there with three kids in the car. The vacation was nice, though not very relaxing with so many things to do and see.

The most amazing part of the vacation was taking my 4 year old daughter to Disney World. She loved it, she was so excited for almost every part of it, it was fantastic. Seeing your daughter talking with Snow White, Cinderella and Belle is enough to get any Father choked up.

And now, it's back to work ugh :P

Wednesday, March 14, 2007

Happy pi day!

My friend, Alex Wolfe, gets the credit for hitting me with this first.

But happy pi day! (3.14), get it? Unfortunately he didn't contact me at 1:59 though...

Tuesday, March 13, 2007

Google Guice 1.0 Released

Guice 1.0 has been released. Guice, as you'll see all over the internet at this point, is a Dependency Injection framework from the folks at Google.

That being said, there are plenty of lemmings out there who'll go running off the cliff for this; because it's from Google. So, guess what, I'm going to jump to, but I'm bringing a parachute.

I started trying to port over some simple code I have on my laptop from Spring to Guice this morning. The very first thing I noticed; is that there is no feasible way to inject an existing Pojo class (that is annotation-free) without writing a Provider class for every Pojo. So if you're using Spring framework classes (without the XML), such as JmsTemplate, HibernateTemplate, and JdbcTemplate, you better get used to writing Provider classes.
Read more here...

There is an alternative approach that involves building a Spring ApplicationContext from XML, and then bringing it into Guice using there SpringIntegration code. But once you've done that, what's the point?

I'm betting someone will come up with a good solution for this. It really is a nice framework, but the Pojo thing is very limiting.

Here's some links for more information... Guice 1.0
Guice at googlecode
My googlegroups post on the pojos

Tuesday, March 06, 2007

Ernest Gallo

Ernest Gallo past away today at age 97, at his home in Modesto California. Even if you don't know wine, you recognize the name E&J Gallo. Ernest Gallo is the father of the American wine industry.
Learn more...

Friday, March 02, 2007

IDEs for Ruby

A nice comparison sheet of the various Ruby posted over at O'Reilly Ruby.

This sheet is actually from another blog: "The Nameless One"

It is funny, to me at least, is that the O'Reilly post is written by Curt Hibbs. Curt is one of the principle developers on the FreeRIDE Ruby IDE; he mentions that in his post. The interesting part is that the comparison did not include FreeRIDE. This is for a good reason. FreeRIDE is a joke. FreeRIDE really stands to make Ruby look bad to people being introduced to it for the first time. FreeRIDE is unstable at best, bordering on unusable.

A first timer on a Windows box is probably going to download the one-click installer to install Ruby. This installer comes with FreeRIDE and will put shortcuts out for it. The afore mentioned first-timer will launch it and try to play with it. It will be slow, clunky and featureless; then it will crash. With an immediate "wow, well screw that" from the newbie.

It sort of reminds me of much of the worlds view of Java due to all the shitty Applets and Swing/Awt apps out there.

If you're looking for a good 'free' rails IDE check out RadRails, if you're a Java guy with IntelliJ installed, definitely check out the Rails plugin.

Tuesday, February 27, 2007


I was reading Tim Bray's post on OpenID this morning. It's interesting to start looking at something new, when you begin with someone pointing out the flaws. After watching Simon Willison's screencast on OpenID I decided this seemed pretty cool.

OpenID is essentially a decentralized single-sign-on system. I can sign in to any site that supports OpenID using my new OpenID from this blog. My new OpenID is That's right, it's just the URL for this blog.

This is why I think OpenID is cool. My 'REAL' OpenID is, I set it up at verisignlabs because they are the only provider that uses TLS by default. In Tim's post he points out that a lack of TLS/SSL in this scenario is sketchy at best, and I agree. Encryption is a must.

Ok, so Versign provides the OpenID authentication, but when I log into sites that support OpenId, I tell them my OpenId is When they come here to my blog they'll find a simple bit of html in the page that tells them where to go for the real authentication provider. Have a look; right click this page and 'view source', you'll see two tags in the head section of the page that look like this:
<link href='' rel='openid.server'/>
<link href='' rel='openid.delegate'/>
This tells the site that I'm logging into that is not the real provider, and that they should go to versignlabs as the server, and use by delegate openid,

Why go through all this trickery? Why not just use versignlabs as my openId directly? Well, if versignlabs (which is beta) gets dropped, or (god forbid) becomes a paid service, I'm not screwed. I can change providers at any time, just by changing the html tags here at blogspot. If you're interested in setting up this up for yourself, have a look at Simon Willison's instructions.

Maybe we'll have to look into adding support into Acegi Security for it. I wonder what Tim O'Brien over at PresidentFeed thinks about using it there?

Saturday, February 24, 2007


In my recent studies of wine, I was reading about Beaujolais. My wife doesn't like most red wines, but I do. We do agree on Pinot Noir, as it is very low on the red wine scale. Well, knowing Dawn's tendency towards whites, and reading about the characteristics of Beaujolais, I picked up a bottle of 2005 "Louis Jadot Beaujolais-Villages". It was a big hit, we both really enjoyed it.

Beaujolais is made from 100% Gamay grapes, and produced in the Burgundy region of France. You can read all about it at Wikipedia: Beaujolais

If you like Pinot Noir, if you're a afraid if 'big' red wines, check out Beaujolais. The Louis Jadot 2005 Villages was very good. Lots of cherry and Dr. pepper flavors, with some good tannins to boot.

Thursday, February 22, 2007

Google Analytics

Some time back I had considered moving to I had thought about doing so I could see statistics and such for the blog. Then I found that I could do it with Google Analytics.

Google Analytics is ridiculously easy to setup. You sign in with your Google account, and tell it the domain you want to watch. Then you paste in a little snippet of javascript at the bottom of each page you want to track.

Using Blogger, this is simply done by choosing to 'customize' your template. You click on the 'edit html' link and scroll down to the bottom. Just before the last </body> tag you paste in the snippet. You're done, every page in your blog is merged with this template and will get tracked automatically.

Watch out though! This is where I ran into trouble...
If you switch templates at all you have to paste that code back in there, or you'll lose all tracking for 2 weeks like I did :(

Tuesday, February 13, 2007

President Feed

My friend Tim O'Brien put together a really cool new site called It is sort of like a live running poll of Presidential candidate approval ratings. You cast your vote for a candidate you like, and you can remove that vote and give it to someone else later if that guy (or gal) does something stupid. On top of that you can also add "thumbs up/thumbs down" ratings to candidates (think Tivo, without the neat sound).

On the tech side it's all ajax web 2.0 style built on Rails. I love the look, I hate the ugly banner add at the top, but hey gotta pay for the hosting somehow.

Tim is also running a blog about it over at Check it out.

Thursday, February 08, 2007

Google Reader

If you haven't checked out Google Reader, you should give it a look. I don't personally have a wealth of experience using other feed readers out there, but I've tried a few. The Google reader is non-intrusive for the most part. Most of the operations you'd want are close at hand and obvious (mark all as read, for example). They use tagging rather than folder structures, though they display your tags as folders. If you tag something as java, you can still tag it as technology; it will show up in both.

If you use Firefox 2.0, and you should, you'll find that they play really nice together. When browsing the web with Firfox you'll see a little 'RSS' box come up in your address bar. That box means that there is a feed for the site your looking at and you can subscribe to it. If you click on that box, Firefox will take you to a page where you chose where to add that subscription. If you choose Google Reader, google will come up and ask you if you'd like to add it to your google homepage (cool in it's own right, but not a good feed reader), or Google Reader. Clicking on Google Reader will take you into Reader, and will show you the new subscription at the bottom of your subscription view on the left (putting new stuff at the top would be better in my opinion). Your new subscription will also be the current view in the reader pane. Up at the top you can choose to label (I was calling it tags earlier, sorry) the current subscription for categorization.

So, if you haven't checked it out before, give it a look, it's pretty nice. Hell, if you don't like it it's not like you have to uninstall it or something :)

Sunday, February 04, 2007

What about next year?

Well, the Bears just lost the SuperBowl. Our defense played like shit. Our offense barely played, but when they did, they played like even worse shit. Then when they try to put the game in the hands of Grossman to, make something happen, he gives it up. Everyone is going to be blaming Grossman for this, and he definitely deserves a big part of the blame, but not all of it. Our offense barely got on the field because our defense couldn't get off. As a whole, beginning to end, the Bears played like shit. Our defense managed to cut off the big play, but gave up first downs like they were on sale. I've never seen the Bears miss so many tackles, it was really sad to watch. At least Hester tried to get things off to a good start by running back the opening kick off for a Touchdown. Now Hester's Touchdown is a mere side-note.

I'd say there's always next year, but we're going to lose a bunch of guys after this year. This was our chance and they blew it. So, what about next year?

Friday, February 02, 2007

Bear Down Chicago Bears

Bear Down, Chicago Bears sung by Lyric Opera's Bryan Griffin
I don't know why he looks like some kind of creepy ogre lumberjack, but hey, he can sing.

The video for this one is really lame, but it's got the 'real' recording of the fight song.

Wednesday, January 31, 2007

This is a great laugh

It takes a little bit to get to the good part, give it time :P

Friday, January 26, 2007

Da Bears!

The Bears are going to the super bowl! They did it in '85, but I was 9 so I don't remember all the details :)

Anyway, check this video out if you're looking to get fired up for the big game!

I got some wine yesterday

I've always been a fan of wine. Though, I've always been one of those guys that was buying stuff because it had a nice label. My wife likes Riesling, I like Cabernet. We both enjoy Pinot Grigio. That being said, we always bought one of those three. Again, based on the label.

In the tech side of my life; if something interests me, I study it. I study it until I know enough about it to use it and explain it to others. Why shouldn't I approach other things that way? I like wine, it interests me, so I started studying it.

In that vein I've been buying up wine over the past few weeks. I have maybe 12 bottles on hand right now. Now, mind you, most of those bottles are actually Cabernet. They are varied a bit more now, one is from Argentina, another from Australia (not Yellow Tail, bleh).

I ordered four bottles from the folks at Wine Library. Here's what I bought:

  • 04 Ravenswood Vintner's Blend Cabernet Sauvignon $7.99

  • 04 San Felipe Cabernet Sauvignon $6.99

  • 04 Rocky Creek Zinfandel $8.99

  • 05 Von Hovel Oberemmeler Hutte Kabinett Riesling $15.99

Why would I buy 3 cheap (one average) bottles of wine online? Well, I am big fan of Gary Vaynerchuck and his daily video blog at Wine Library TV. Each one of the cheap wines I bought was raved about by Gary, and scored well from him. There was also a free shipping sale on wines presented on Wine Library TV :)

Again, they're Cabernet and Riesling. The San Filipe is from Argentina though, so that counts for something. I've got some Shiraz and Pinot Noir in the basement, not to mention the "Louis Jadot Beaujolais Villages" I picked up. I'm excited to try that, I'm hoping to bring Dawn (my wife) to the dark side of red wine with it :)

Wednesday, January 24, 2007

Jboss: "console stream is looping" error

This is incredibly aggrevating. I downloaded JBoss 4.0.4 and JBoss 4.0.5. Both versions fail to startup due to the following error:

ERROR: invalid console appender config detected, console stream is looping

I see postings all over the internet about this. I see postings all over the JBoss forums specifically about this, all with zero replies. It is just ridiculous that a straight off the website download doesn't even startup correctly. It is very sad that the community over at cannot help eachother out with this.

I am attempting to run these versions on my windows laptop for an experiment during my 40 minute train ride. I am betting this has something to do with it, as I haven't seen this problem before on my Linux machines. (Don't even think about blaming windows for this, it is a jboss problem).

Well, anyway, after digging around for 30 minutes I stumbled on a post that claims you shouldn't need the following hack post-jboss-3.2.1. Well, guess what, you need it in 4.0.5 as well apparently.

set JAVA_OPTS=-Dorg.jboss.logging.Log4jService.catchSystemOut=false

Or, do as I did and put it right in your run.bat file:
set JAVA_OPTS=%JAVA_OPTS% -Dorg.jboss.logging.Log4jService.catchSystemOut=false

What a pain.

Tuesday, January 02, 2007

Christmas gift idea

From Justin Timberlake's recent appearence on SNL...