About Adam Young

Once upon a time I was an Army Officer, but that was long ago. Now I work as a Software Engineer. I climb rocks, play saxophone, and spend way too much time in front of a computer.

Move to Red Hat

Sometimes you can’t tell where you are headed. But, after a while, if you look back, you realize that you have been headed in a straight line exactly where you want to go. Such is the case, I find, with my current acceptance of an offer of employment at Red Hat.

Very shortly, I will take a position as a senior software engineer at Red Hat, in Westford , MA. I am on the team responsible for, amongst other things, Red Hat Satellite Server. This pulls together several two trends in my career: Java, Linux, Systems Mangement, and JBoss.  I look forward to posting lessons learned from this new venture.

Duck Typing in C++

One common description of Object orient languages is that they use “Duck Typing.”  The idea is the if it looks lie a duck, walks like a duck, and sounds like a duck, you can treat it like a duck.  Java and C++ typically are set in opposition to Duck Typing:  You must have a complete Symbol match in order to be treated like a duck.

C++ is not Duck typed at run time, but it might be helpful to think in terms of Duck typing at compile time; Template programming is based on the Duck principal.  In C++, this is called the implied interface. A Template only cares that the type passed in as the typename has a member that matches the template.  The major difference here is that in Object Oriented Languages, this distinction is made at Run Time.  In C++, the distinction is made at Build time.

One rule of thumb that I have found useful in understanding the difference in approach between Java and C++ is this: Java assumes that Code will be reused without a recompile.  C++ Assumes that the compiler will be involved in a recompile.  Note that I say C++, and I mean Bjarne Stroustrup and the STL developers.  Not COM, CORBA or many of the Languages build in C++ but on top of the language. I’m not saying I approve or disapprove of this approach, just that it is a valuable way to think about the language.

Using InitialContext for Inversion of Control in Java

If I were to try to apply my approach to IofC in C++ to Java, the logical starting point is the JNDI Context object.  In JNDI, to get an instance of an object, you call InitialContex.doLookup(String name); Which allows you to set a Generic type parameter to make sure that Casting is handled for you.    This is really close to what I want.  Also, When you request an object by name, what you have registered is either an instance of that object (via the InitialCOntext.bind method) or it calls a factory to create the instance, and the Factory gets registered earlier.  So far, we are in the right vicinity.

I’ve been doing some Tomcat work recently, so I’ll use that as a starting point. The JNDI implementation embedded in Tomcat is an apache project with the top level package name of org.apache.naming.  The InitialContext object is actually a participant in a Bridge design pattern.  Specifically, the user creates an InitialContext, and that will call a factory to create an Context object to use internally. Apache Naming creates an instance of org.apache.naming.NamingContext.  The interesting code is here

protected Object lookup(Name name, boolean resolveLinks)
throws NamingException {

// Removing empty parts
while ((!name.isEmpty()) && (name.get(0).length() == 0))
name = name.getSuffix(1);
if (name.isEmpty()) {
// If name is empty, a newly allocated naming context is returned
return new NamingContext(env, this.name, bindings);
}

NamingEntry entry = (NamingEntry) bindings.get(name.get(0));

if (entry == null) {
throw new NameNotFoundException
(sm.getString(“namingContext.nameNotBound”, name.get(0)));
}

We don’t really care what comes after this.  The point is that if the NamingEntry is not in the locally defined set of names, it does not know how to create the instance, and throws and exception.

What would happen if we turn this assumption on its head.  What if the failure to resolve a name just meant that the context factory should delegate it to the next context factory in the chain.  We could restrict this approach to a certain naming scheme.  If the name give falls inside a new scheme, say java:comp/chain/<classname>, use a chain of responsibility to walk the Contexts back up toward to the root to resolve the object.

The concept of lookupLink as  the default way to fetch something is intriguing.  It means that there is some method of chaining available.  Right now the only things that get resolved are the links that are explicitly put into the namespace.  Immediately following the code quoted above is:

if (name.size() > 1) {
// If the size of the name is greater that 1, then we go through a
// number of subcontexts.
if (entry.type != NamingEntry.CONTEXT) {
throw new NamingException
(sm.getString(“namingContext.contextExpected”));
}
return ((Context) entry.value).lookup(name.getSuffix(1));

Beware that there are two trees here.  the  naming tree, and  scopes of resolution.  It makes sense to think of this as a two dimensions rather than one.  The name may be a compound name, and we need to traverse down the tree to find it.  This is the top down thing I was talking about before: JNDI is designed assuming that initial context is the root of the tree, as opposed to the current leaf node.  At least, Tomcat starts there.

The nice thing about lazy resolution (back tracking) is that creating a new context is really quick.  If  most components are  resolved in the request namespace, and only rarely make it all the way up to the global namespace, than there is no performance problem.

In the current Java landscape, there are many APIs for resolving a reference.  Baseline to the language is java.naming.  The Servlet API has explicit ones for looking for objects in the request, session ,and global contexts.  Spring has the the BeanFactory interface.  OSGI has Bundle Context.  Pico container has the pico object.  The fact is that, even with inversion of control, at some point you need to kick of an object creation chain.

For instance, struts maps a segment of an URL to a class that extends the struts Action class, after binding the context to an Action form.  These objects are configured via an XML file.  The Action object is a flyweight, designed to encapsulate business behavior, where as the form object is a minimal request or session scoped object designed to do some validation prior to handover to the action.   All of this is configured by a servlet.  Once the Servlet is deployed, there is no way to change the URL scheme of the application without redeploying the app, making it ill suited to end user defined content such as a Wiki or blog.  Layout is controlled by Tiles, another related project that merged with struts, leading to a hybrid API.  Java server faces has its own object registration and creation API as well.  Since JSF and struts solve similar issues, with similar approaches, what I write about one can be applied fairly easily to the other.

As I look at the these APIs, I am struck once again by the procedural nature of them.  Time and again, we see:  create object, set properties, call execute method.  Most of these take the Class.forName approach to create the objects, and dependencies are injected via setters.  Not my style.

When I last did this full time, I ended up with a common approach where the primary interaction between the parameters and the the java objects was through builders. I was never fonds of the concept of ‘Validators’ or objects who’s sole purpose was to validate a string, and then pass it on as a string.  once I have validated a string, I want to bind it to a class that states the validation is a precondition. For instance, a Social Security number is in the format DDD-DD-DDDD.  Further business objects should not pass around String ssns, but rather instances of class SSN.   If the SSN is part of a Person object, the SSN is then passed in as a Constructor parameters, and bound to a final field, making the end object immutable.  If there is an intermediate stage, perhaps a multe page form to construct the ‘Person,’ intermediate state is held in a PersonBuilder.  The create method of the PersonBuilder enforces the preconditions are met, or returns a collection of errors.  The completed Person object probably then becomes either a Session or Application scoped variable.  Note that all fields would be final and immutable, meaning the end product is thread safe.

Struts, tiles, and so on have an API where a context object is passed around from object to object throughout the hierarchy.  Each of these should be wrapped in an Adapter so that extends java.naming.Context and bound to a well known name via InitialContext.bind().  These objects can then be stacked one after another inside a composite naming context, and called each in turn.  Here’s a first take at the adapter for tile .

public TilesApplicationContextAdapter(
TilesApplicationContex conetxt){
if (context == null) throw new IllegalArgumentException(MESSAGE);
    this.context = context;
    new InitialCOntext.bind("java:/comp/context/"+TilesApplicationContextAdapter.class.getName(),context);
}

public final TilesApplicationContext context;

public void bind(Name arg0, Object arg1) throws NamingException {
...
}
/* now the hard works starts, converting from one API to another. */

Now,  the trick is to encapsulate all of this inside a typesafe API.

import javax.naming.NamingException;

public class GenericResolver<T> {

Class<T> classOf;

GenericFactory(Class<T> c) {
classOf = c;
}

public T fetch(Context context) throws NamingException {
return (T) context.lookup( lookupStrategy(classOf));
}

public T fetch() throws NamingException {
return fetch( new InitialContext());
}

}

I’ll leave on this note:

Base64 Encoding

I needed to initialize a file as part of a unit test. The file conatined binary data. My first thought was UUEncoding, which quickly got upgraded to Base64 encoding. To get it into a format that would then work in Java or C code I used the following line of BASH.

base64 < rui.pfx | sed -e ‘s!\\!\\\\!g’ -e ‘s!\”!\\\”!g’ -e ‘s!$!\\n\”!’ -e ‘s!^!+\”!’

It was for testing a decrypter from using a key generated by SSL.

It is important to double the slashes already existing in the file before you add your own.

Note, I added this as a way to remeber how to put binary Data into code, not as a recommendation for how to mock up for unit test.  The correct solution was to use:

InputStream inputStream = this.getClass().getResourceAsStream(
file.getName());

Subjective

Last week, a friend and I had a discussion regarding the question of whether Quality was subjective. While I subscribe to the position that quality was neither subjective nor objective a-la Robert Pirsig, I found myself unable to defend that position. The argument was disturbing for several reasons. First, when I attempted to show that this was an absurd position, I was accused of changing the subject, or redefining terms, etc.  I have to question whether I was. Perhaps the word “Quality” is, as my opponent in the discussion stated, the very definition of Subjective. If Quality is not Subjective, then nothing is. If a subject is defined by their values, if a person is nothing but values, as Pirsig states, then isn’t the perceived quality purely subjective?  Do to the very enjoyable adversarial nature of this discussion, I shall refer to the other participant as my opponent.

From another point of view, if two people agree that something has quality, it just means that their subjective view of quality aligns.

An example he gave was that “A long law is a bad law.” This is an objective guideline, but accepting it is subjective. One problem with this argument is that I feel fairly certain that he does not, nor does anyone agree to this hard and fast, but most people would agree that the longer a law, and , by implication, the harder it is to understand, the worse a law it is likely to be. This concept could be hammered out to the point of actually providing a guideline for judgment of law quality.

Continue reading

Response to yet another “Atlas is Shrugging” Article

Oh no, not you too.  If I see one more of these “Ayn Rand’s messages are about to come true” articles I am going to…not sure exactly what.  Listen, Rand has a fundamental Flaw in her philosophy.  I ‘ve written about it earlier.  OK, so lets forget the her basic premise is flawed, cuz she still might be right despite that.

Continue reading

Booting into single user mode with grub

I recently had a problem where one of the daemons run at startup would hang.  In order to disable this, I needed to boot into single user mode, and chkconfig the service off.

The key to booting into single user mode is the word ‘single’ on the kernel command line.

Heres the steps:

  1. Reboot the system
  2. At the grub screen, hit esc to stop the default boot sequence
  3. use the arrow keys select the kernel image you wish to boot
  4. type ‘e’ to edit the kernel image startup parameters
  5. on the screen use the arrow keys again to select the line with the startup parameters.  This should be the  the middle line, the one that starts with the word ‘kernel’.
  6. Type ‘e’ to edit this line
  7. append the word ‘single to the end of the line and type enter
  8. type the ‘b’ key to boot the kernel

16 Random Things About Me

1. The mechanism in the brain is that is supposed to disengage the mouth doesn’t always work with me. When I remember an embarrassing episode from earlier in my life, I often yell at my self about it, out loud, usually something like “Stop think so much!” or “Quit it.” I have Programming induced Turrette’s Syndrome.

2. I read incredibly fast. I started reading in kindergarten and have always devoured books. I was reading the full length Alexandre Dumas books in third grade.

3. I wore braces while wrestling in high school. My lips were routinely turned into chopped liver by them.

4. Music has been an incredibly strong force in my life. I was singing before I spoke. I started piano lessons in first grade (Thanks Mrs. Stephanski!). My great Uncle Ben started teaching me Saxophone in second grade. I sing out loud whenever I am in the car alone. I contemplated going to Berklee school of music. As a Junior and Senior at West Point I conducted the Jewish Chapel Choir.

5. I read Zen and the Art of Motorcycle Maintenance while in High School. No other book I’ve read has had more of an effect of how I interpret the world.

6. As a Plebe at West Point, I got into big trouble twice. The first time was because I had a sword for the medieval studies club in my locker in the trunk room. The second time was for drinking. My roommate had snuck a bottle of Jack Daniels into the Barracks. I had to shots, and threw them up.

7. When I was a three years old I made up a Superhero named “Strong Running Man”

8. I was really into Archery when I was in boy scouts. I had a recurve bow. My cousin and I were shooting arrows up into the air in New Hampshire. One got stuck in the trees, and fell to earth right in front of my father, missing him by a few feet. He broke the bow over his knees.

9. My first crush was when I was in nursery school. Her name was Elizabeth Lubin. I still don’t know how to spell her last name.

10. I compose music. I’ve written a few jazz and folk songs. I have written about 70% of the book for “The Princes Bride, the Musical.” It is an Operatta.

11. I spent my first two and a half years as a professional programmer doing Microsoft programming. My focus on Linux and Open Source programming comes from having been burnt by MS too many times.

12. When I was Lieutenant in the Army, I lived in a beach house on the North Shore of Hawaii. On certain days, when I was allowed to do the morning exercises (PT) on my own, I would often go snorkeling right behind my own house.

13. My favorite hobby is Rock Climbing. I have done more damage to my body by climbing with out doing injury prevention exercises than any other way. My favorite type of climbing is climbing cracks by jamming my hands and feet into the wall and camming them.

14. I was incredibly nearsighted as a kid. It killed my depth perception. It is one reason I never liked sports like Baseball or Basketball. I had LASIK about ten years ago, and my eyes have continued to get worse to the point that I need glasses full time again.

15. I have a ridiculous memory for quotes. I can watch a movie or TV show once and pick up a quote that I remember for years.

16. I grew up wandering in the woods. The thing I love most about being back on the East Coast (aside from being near to family) is the woods here. There is something about the deciduous forests and terrain gentle enough to let you walk just about anywhere while out in the woods that I find really recharging. I’ve recently taken up snowshoeing because I love being able to wander through the snow covered woods and walk anywhere.

Cool it with the Ayn Rand comparisons

No, we are not entering the time of Atlas Shrugged.  No, Obama’s plan to deal with the economic melt down is not the same thing as the various acts passed during Atlas Shrugged.  No, we are no about to enter a world dominated by socialism.

If you feel the need to drop out of society and move to a valley in Colorado, please feel free to do so.  I will be understandably jealous.

Continue reading