Caffeinated Simpleton

Healthcare as a Moral Imperative

In any political debate, there is rhetoric used by both sides to imply how obviously correct their position is. The current healthcare debate is no different, with “healthcare is a right” being a favorite phrase of those on the left. Those that use the phrase take it to mean that every person deserves some form of healthcare. However, this is not what a “right” is. Rights are those properties of a human being that are granted to us because, and only because, we are human. They are granted a priori, and cannot be denied us except through force and submission. Healthcare does not fall into this category. Healthcare is something that is consumed, and is therefore granted by those that have it to those that do not (usually in exchange for some other good, mostly cold, hard cash these days). Nothing that falls in this category can be a basic human right, as the providers themselves have the right to determine who they provide to.

Whether or not healthcare is a right, however, is not the debate. Rather, it’s a tactic used by one side to make an argument in a sentence instead of in a carefully constructed thesis. What those in favor of healthcare reform are trying to push for is the idea that we, as a society, have some moral imperative to force the provider’s hand and provide some level of healthcare to all, whether providing such care is beneficial to the provider or not. This is an argument for a restriction of rights, which, paradoxically, is something goverments have been granted the right to do by their citizens.

The question then is how much we are morally obligated to restrict the freedoms of healthcare providers in order bring the general health to some acceptable level. This is a very difficult question, made more difficult by the fact that the value of healthcare changes with time and economic prosperity. This is a terrific example of imperfect duty, a duty which is never complete but which we are morally bound to strive to make progress on. We have made great progress too. Healthcare as it exists today is better than at any previous point in history and available to more people. It does seem to be the case, however, that society feels that too many of its members are in a situation where they do not have access to the kinds of care that should be available to all. This probably doesn’t include very expensive experimental treatments, but does include expensive but common procedures and treatments like those used to fight cancer, heart disease, and other widespread diseases.

The current legislation is too large for me to really know what’s in it, but the goals are fairly clear. The bill is meant to require health insurance for almost all Americans, require coverage for those with preexisting conditions, make selecting insurance options more transparent, facilitate keeping your insurance between jobs, and providing some form of publicly funded insurance. These components really try to kill two (or perhaps 3 or 4) birds with one stone. In addition to the much touted coverage for those that are currently without, a large portion of the bill is designed to make health coverage more manageable by individuals. That sounds great to those of us that have healthcare that we really don’t even know how to use, but doesn’t really take steps towards fulfilling our society’s imperfect duty. Perhaps that’s why we don’t hear a whole lot about that part of the bill.

Whatever ends up in the final bill, it seems to me that it will not fulfill any of its goals. The less talked about goal, that of making health insurance more manageable by its own customers, is not something governments are particularly good at. It’s difficult to regulate complexity. The best way to achieve this goal is competition. This would require insurance companies to market straight to consumers instead of their employers. You can be sure that insurance companies will become more transparent in a hurry when they have to convince you that they are actually better than the next guy rather than your company’s HR department. Auto insurance, for instance, is substantially simpler than its healthcare counterparts.

Where government is probably not the best answer for reducing the complexity of the healthcare system, government has become the preferred vessel for carrying out society’s obligations to itself. In the current debate, this has translated to “we must provide insurance to the uninsured”. This seems noble enough, except that the insurance model itself is deeply flawed. Those of us that already have insurance can see this quite obviously. We do not know the cost of healthcare, nor do we care. Co-pays are minimal, so we take what healthcare we need and bill the insurance company. For those of us with insurance, healthcare is near free and limitless. It stands to reason, then, that by providing insurance to those without, they will also have unlimited, near free healthcare.

The question then becomes, is unlimited, free healthcare the fulfillment of our moral obligation? I believe that it is not. Society should not be asked to cover the costs of keeping the elderly around longer than is prudent, nor should we be asked to bear the burdens of an individual’s poor decisions. Society should provide the level of healthcare that most of us enjoy to as many as possible, but we should not give a blank check.

Many are disgusted by the idea of trying to figure out who should get what healthcare. It does not seem ethical to have “death panels” or enforce that your bypass will only be covered if you didn’t eat bacon for a year. Should we provide orthodontics, which seem like a luxury until you look at the importance of good teeth in the white collar world? Again, this is one of those things that government does a poor job of regulating, and again, these decisions should be left up to the individual. How we do this is something that the current legislation doesn’t touch, and I believe is absolutely necessary for true healthcare reform.

Structuring the system to provide individual responsibility while still providing healthcare to those that cannot afford it seems fairly straightforward to me. Offering insurance policies with very high deductibles and supplementing them with health savings accounts ensures that an individual can determine their own regular healthcare needs while still being protected from unexpected disasters. Both the policies and the savings accounts can be subsidized or provided by the government, with the expectation that the individual contributes what they can. This simple combination seems to be the best bet for minimizing government’s interference in an individuals healthcare while still providing them with the level of care the rest of society enjoys.

There is a serious caveat to this seemingly simple solution. That caveat is that all health services, not just disasters, are obscenely expensive and getting pricier. I believe this is a direct result of the structure of the current private insurance industry. Since nobody except for the insurance companies care what the cost of health services is, and the insurance companies are buying in bulk, there is a strong incentive for the hospitals to reduce the costs of those services that the insurance companies will object to while increasing the costs of those services that are cheap by comparison. Added to the burden is the cost of patients that are unable to pay. The effect of the hospitals “making up” money by increasing costs of routine services is that all healthcare services are more expensive, without any incentive for them being made cheaper.

The current proposal for dealing with the cost problem is for the government to provide a public option to “compete” with the private insurers. I don’t understand this reasoning in the least, but it hasn’t been well explained by its proponents, so I could be missing something. Regardless of its ability to provide competition in an already highly competitive market place, the public option is fundamentally flawed since its structured like a traditional insurance company. It will have similar incentives, none of which will encourage lowering the costs of routine healthcare.

A better method for controlling costs is to make sure individuals are aware of them. If people are asked to pay for routine health services, they will pay much closer attention to the costs of these services. The best way to get individuals to pay for routine services is the same method by which we should cover those without insurance: through health savings accounts combined with high deductible insurance policies.

If those that can afford insurance are on a plan similarly structured to those that can’t, then we have a system in which the market can drive down the costs of things that should be cheap while insuring that those things that are not affordable are available to those that really need them. This seems to be the easiest and least error prone method of reforming healthcare.

There are a number of ways to fulfill the nebulous goal of providing healthcare to everybody in America. One way is to buy into the current system and ask society to pay for it. Another is to restructure the system in a way that benefits everyone and only then ask society to provide those minimal services it has deemed morally necessary to provide to its citizens. The latter seems like the more prudent, more moral, and simpler way to make this generation’s contribution to that imperfect duty that is healthcare.

An Introduction to JavaScript’s “this”

JavaScript is an amazing little language, but it’s got some quirks that turn a lot of people off. One of those quirks is this, and how it’s not necessarily what you expect it to be. this isn’t that complicated, but there are very few explanations of how it works on the internet. I find myself constantly re-explaining the concept to those who are new to JavaScript development. This article is an attempt to explain how this works and how to use it properly.

What is this?!

this is the current object. People that are used to object oriented languages use objects constantly, and this is how you access your object in JavaScript. This differs from Java and C++. This is best demonstrated by example, so let’s take a look.

class HotDog {
public:
     string getCondiments();
private:
     string condiments;
}
 
string HotDog::getCondiments() {
    return condiments; // The compiler knows to find "condiments" in the current HotDog instance
}

Ruby and Python don’t work this way. Instead, you must say “look for this variable in the current instance”

class HotDog:
    condiments
    def getCondiments(self):
         return self.condiments # "self" is a reference to the current instance of HotDog.
  class HotDog
         @condiments
         def getCondiments
              return @condiments # @condiments is an instance variable of an instance of HotDog
         end
    end

JavaScript has more in common with Ruby and Python than with Java and C++. The same thing in JavaScript is:

function HotDog() {
    this.condiments = "mustard, ketchup";
    this.getCondiments = function() {
         return this.condiments; //this is expected to be a reference to the current instance
    }
}

That’s what this is expected to be, anyway. It’s expected to be a reference to the current instance of whatever object it’s defined within.

this Gets Tricky

However, let’s say we wanted to find out what condiments were on our hotdog in 30 seconds. Assuming the HotDog class from above, that code might look like this:

var myHotDog = new HotDog();
// Call the getCondiments function in 3 seconds
setTimeout(myHotDog.getCondiments, 3000);

Many JavaScript beginners are surprised to learn that this code won’t work. It’ll give an error saying that this doesn’t have a member called condiments, even though it clearly does. What happened?!

As it turns out, this in the getCondiments function is set to the global object, window. This is because there is no binding of functions to instances in JavaScript. Whenever the instance isn’t explicitly stated, then this becomes window (at least in the browser). Writing this as myHotDog.getCondiments() indicates that you want this to be myHotDog, so it works correctly. The setTimeout function, however, just has a reference to that function. When it calls it, it’s not aware of myHotDog, so JavaScript sets this to window

“Fixing” this

There are several ways of forcing this to be what you want, and many of them touch on some of the more interesting features available in JavaScript. The first is apply. apply is a member of every function. It says “call this function with this object as this and these arguments. An example might help.

// These two are equivalent
myHotDog.getCondiments();
myHotDog.getCondiments.apply(myHotDog);
 
// You could also do this
var yourHotDog = new HotDog();
myHotDog.getCondiments.apply(yourHotDog);
 
// The above line does the same thing as:
yourHotDog.getCondiments();
 
// The above two calls will return the condiments off of your hot dog, not mine.

That doesn’t solve our setTimeout problem, however. apply actually calls the function, and we just want a reference to the function that uses the correct this. Luckily this is easily done, but let’s talk about some background first.

Lexical Scoping

In many languages (all the good ones, if you ask me), lexical scoping is supported. Lexical scoping basically allows you to access local variables in a parent function. If a function is defined within another function, it can access its own local variables as well as those of the function it was defined within. Time for another example.

function drinkBeer() {
    var beer = "Big Daddy IPA";
    function pour() {
         var glass = "Pint Glass";
         return "Poured " + beer + " into a " + glass;
   }
   function drink() {
         beer = null;
         return "Beer is all gone";
   }
   pour();
   drink();
}
drinkBeer();

This works just fine. drinkBeer cannot access glass, but pour and drink can access beer.

Lexical scoping is extremely powerful. If this small example doesn’t explain it, I encourage you to look around other examples on the internet until it’s more clear. While writing JavaScript, look out for ways this can make your life easier. Once you’re looking, they’re all over the place.

Solving our setTimeout Problem

With lexical scoping, we can easily solve our setTimeout problem.

var myHotDog = new HotDog();
setTimeout(function() {
    myHotDog.getCondiments();
}, 3000);

See what we did there? We created a new function that we passed to setTimeout. Our new function can access myHotDog, so it just applies it to the getCondiments function. Pretty slick.

Defending against this abuse

As somebody writing the HotDog class, it might be upsetting to you that people constantly need to keep this in mind when accessing your class. It would be nicer if there was a way to make your class work all the time. Fortunately, there is!

function HotDog() {
    var self = this; // self references the current this, which is correct.
    self.condiments = "mustard, ketchup";
    self.getCondiments = function() {
         return self.condiments; // self is guaranteed to be a reference to the original "this"
    }
}

HotDog is a constructor. You instantiate a new instance of HotDog by writing “new HotDog()“. In constructors, this is always your instance. So we created a new variable, my, that references the HotDog instance. This allows you to always refer to the HotDog instance, no matter how the getCondiments function is called.

Bind

Another method of “fixing” this is adding a bind attribute to every function. This allows you to pass in an object that will be your this. Many JavaScript libraries, such as Prototype, do this.

var boundFunction = myHotDog.getCondiments.bind(myHotDog);

Now boundFunction will always call getCondiments with this set to myHotDog. If you’ve been paying attention, it should be fairly obvious how bind is written.

function bind(thisObject) {
    var self = this; // this is the function here
    return function() {
        self.apply(thisObject, arguments); // (arguments is a keyword that refers to the passed in arguments)
    }
}

Cobra

My own class library, cobra, solves the this problem in a different way. It passes a reference to the original this to every function, which allows you to use some fancy features like prototypal inheritance while still not worrying about binding and the like. If you’re interested, you can find the code on github..

Whew

That’s pretty much all you need to know about this.

  • this will be window whenever your function is indirectly called.
  • Use apply to force this to be what you want
  • You can use lexical scoping to make sure this behaves in a predictable manner

I hope that’s clear, comment if it’s not!

Meetup.com webOS Client Part 1: Services

Palm’s Mojo SDK has just been released to the public this past week. I thought I would take the opportunity to show off some of the awesome things the SDK can do. The Mojo SDK is exceptionally good at tying your life together with the web services you use every day, so my first series will be on building a simple Meetup.com client. At first, we’ll just sync down meetups using the api key that’s associated with every individual account. Another day, we’ll add OAuth authentication to make it generally useful for anybody.

This article assumes that you have some knowledge of how to create an app, new scenes, and how to debug. If you aren’t somewhat comfortable with the SDK yet, check out the Hello World tutorial.

Setup

At first, we’ll just create a big button that puts all our meetups into the calendar. Nothing fancy. To create the scene, run:

$ palm-generate -t new_scene -p "name=sync"

Then in the stage-assistant.js file, put:

this.controller.pushScene("sync");

Creating a Calendar

The first thing that we will do is create a new calender for Meetup.com. This calendar will appear in the calendar app right next to your Google Calendar or Exchange calendar using the Palm Synergy APIs. This is great because it allows you to deliver new data to your users without having to write yet another way of presenting it. All contacts and calendars can be plugged straight into the core webOS applications.

To create a calendar, you first need to make an account:

self.accountServiceId = "palm://com.palm.accounts/crud/";
 
 /* Retrieves account if it exists, otherwise creates it */
setupAccount: function(self, k) {
    self.controller.serviceRequest(self.accountServiceId, {
        method: 'listAccounts',
        parameters: {},
        onSuccess: function(list) {
            Mojo.Log.info("Got account list: %j", list);
            if (list.list && list.list.length > 0) {
                self.account = list.list[0];
                k();
            }
            else {
                self.account = {
                    username: "justin",
                    domain: "meetup.com",
                    displayName: "Meetup.com",
                    dataTypes: ["CALENDAR"],
                    isDataReadOnly: true,
                    icons: {largeIcon: '', smallIcon: ''}
                };
                self.controller.serviceRequest(self.accountServiceId, {
                    method: 'createAccount',
                    parameters: self.account,
                    onSuccess: function(response) {
                        Mojo.Log.info("Got %j for %j", response, self.account);
                        self.account.accountId = response.accountId;
                        k();
                    }
                });
            }
        },
        onFailure: function() {
            Mojo.Controller.errorDialog("Failed to create account");
        },
        onError: function(error) {
            Mojo.Controller.errorDialog("Error creating account");
        }
    })
},

You’ll notice a few different things about this code, the odd things which are just my style. Using self instead of this is an idiom from Cobra, a JavaScript class library I wrote. k is a continuation, or the function that should be called after the account is created. k I believe is an idiom for Continuation Passing Style in Scheme.

Beyond that, this is very standard Mojo code. Services are identified as “palm://com.palm.” and all methods support onSuccess, onFailure, and onError callbacks. This code checks to see if there is already an account associated with this appId, and if there is, calls its continuation. If there is not, it creates the account and calls its continuation.

After the account is created, we can create the calendar.

self.calendarServiceId = "palm://com.palm.calendar/crud/";
 
/* Retrieves calendar if it exists, otherwise creates it */
setupCalendar: function(self, k) {
    self.controller.serviceRequest(self.calendarServiceId, {
        method: 'listCalendars',
        parameters: {
            accountId: self.account.accountId
        },
        onSuccess: function(calList) {
            Mojo.Log.info("Got calendar list");
            if (calList.calendars.length > 0) {
                self.calendar = calList.calendars[0];
                k();
            }
            else {
                self.calendar = {
                    name: "Meetup.com"
                }
                self.controller.serviceRequest(self.calendarServiceId, {
                    method: 'createCalendar',
                    parameters: {
                        accountId: self.account.accountId,
                        calendar: self.calendar
                    },
                    onSuccess: function(response) {
                        self.calendar.calendarId = response.calendarId
                        k();
                    },
                    onFailure: function(error) {
                        Mojo.Log.error("Creating calendar failed: %j", error);
                        Mojo.Controller.errorDialog("Failed to create calendar");
                    },
                    onError: function(error) {
                        Mojo.Log.error("Creating calendar failed: %j", error);
                        Mojo.Controller.errorDialog("Error creating calendar");
                    }
                });
            }
        },
        onFailure: function() {
            Mojo.Controller.errorDialog("Failed to create calendar");
        },
        onError: function(error) {
            Mojo.Controller.errorDialog("Error creating calendar");
        }
    });
},

This is almost identical to the account creation code, except it’s creating a calendar.

Now calling these functions is easy:

self.setupAccount(function() {
    self.setupCalendar(function() {
        self.buttonModel.disabled = false;
        self.controller.modelChanged(self.buttonModel)
    });
});

Pulling down events

To get the events that are associated with the account, I am using the Meetup.com JavaScript client. The client requires jQuery, but since it only requires jQuery to do JSONP, we replace that line with a Mojo call. There is no reason that we couldn’t use jQuery, but jQuery is overkill for just doing JSONP.

jQuery.getJSON(urlprefix + call_type + url, params, function(json){callback(json)})

Becomes:

var query = $H(params).toQueryString();
url = urlprefix + call_type + url + query;
Mojo.loadScriptWithCallback(url, Mojo.doNothing);

After we have the Meetup client library, getting the events is easy, but a little indirect. It takes three API calls, one to get the member id, one to get every group associated with the member id, and one to get every event in all those groups. You can see the details on Meetup’s API page.

self.client = new MeetupApiClient(Meet.Auth.apiKey);
syncCalendar: function(self) {
    // Gets my member id
    Mojo.Log.info("Syncing calendar");
    self.client.get_members({
        relation: "self"
    }, self._getGroups);
},
 
_getGroups: function(self, members) {
    Mojo.Log.info("Got members");
    var memberId = members.results[0].id;
    self.client.get_groups({
        member_id: memberId
    }, self._getEvents);
},
 
_getEvents: function(self, groups) {
    Mojo.Log.info("Got events");
    groups = groups.results;
    var groupString = groups[0].id;
    var today = new Date();
    for (var i = 1; i < groups.length; i++) {
        groupString += "," + groups[i].id;
    }
    self.client.get_events({
        group_id: groupString,
        after: today.getMonth() + today.getDay() + today.getFullYear()
    }, self._saveEvents);
},

Now self._saveEvents will receive a list of events that are coming up after today. All we need to do is loop over the list, format them as Palm calendar events, and pass them to the calendar service.

_saveEvents: function(self, events) {
    Mojo.Log.info("Saving events");
 
    self.numEventsProcessed = 0;
    self.events = events;
 
    events.results.each(function(meetupEvent) {
        var time = new Date(meetupEvent.time).getTime();
        if (meetupEvent.myrsvp != "no") {
            self.controller.serviceRequest(self.calendarServiceId, {
                method: 'createEvent',
                parameters: {
                    calendarId: self.calendar.calendarId,
                    event: {
                        eventId: meetupEvent.id,
                        subject: meetupEvent.name,
                        startTimestamp: time,
                        endTimestamp: time + 3600000, // 1 hour in ms
                        allDay: false,
                        note: self._formatNote(meetupEvent),
                        location: meetupEvent.lat + ", " + meetupEvent.lon,
                        alarm: 'none',
                    }
                },
                onSuccess: self._createdEvent,
                onError: self._errorCreatingEvent,
                onFailure: self._failureCreatingEvent
            });
        }
    });
},
 
_createdEvent: function(self, response) {
    self._checkIfSyncFinished();
},
 
_errorCreatingEvent: function(self, response) {
    Mojo.Log.error("Could not create event: %j", response);
    self._checkIfSyncFinished();
},
 
_failureCreatingEvent: function(self, response) {
    Mojo.Log.error("Failed to create event: %d, %j", self._eventsReturned, response);
    self._checkIfSyncFinished();
},
 
_checkIfSyncFinished: function(self) {
    self.numEventsProcessed++;
    if (self.numEventsProcessed == self.events.meta.count) {
 
        if (self.events.meta.next) {
            Mojo.Log.info("Fetching the next page of results...");
            self.client.nextPage(self._saveEvents);
        }
        else {
            Mojo.Log.info("Fetched all the events");
            self.buttonModel.disabled = false;
            self.controller.modelChanged(self.buttonModel);
            self.controller.get("sync-button").mojo.deactivate();
        }
    }
},

And that’s basically it! With the code above, all your Meetup.com events can be inserted into your webOS calendar. All you need is an event handler for your button.

self.buttonModel = {
    buttonLabel: 'Sync',
    disabled: true
};
 
self.controller.setupWidget('sync-button', {
    type: Mojo.Widget.activityButton
}, self.buttonModel);
 
Mojo.Event.listen($('sync-button'), Mojo.Event.tap, function() {
    self.buttonModel.disabled = true;
    self.controller.modelChanged(self.buttonModel)
    self.controller.get("sync-button").mojo.activate();
    self.syncCalendar();
});

This works assuming a view containing:

<div x-mojo-element="Button" id="sync-button"></div>

Debugging Tips

Creating a file called framework_config.json allows you to change the logging level. That will permit JavaScript messages to be output into /var/log/messages on the device. This is especially valuable if you’re working on a 64-bit linux machine where the inspector is currently not supported.

{
    "logLevel": 99 // 0 means no logging, 99 will max it out
}

Removing /var/luna/data/dbdata/PalmDatabase.db3 removes all data you may have inserted. This allows you to start over fresh, but I wouldn’t recommend doing this on your actual device. You’ll lose all your data!

Todo

This program isn’t really complete, but it’s a good start. A couple of things we still have to do are:

  • Add Authentication with OAuth
  • Keep track of already inserted appointments so we don’t insert duplicates
  • Add automatic synchronization in the background
  • Add push updates (this is impossible without server side support)
  • Make things look nice

Stay tuned for articles on some or all of these exciting new features! Until then, the code is available on github.

Java, please stop ruining my fun.

I don’t like Java. I haven’t learned Java well because I don’t enjoy using it. I don’t enjoy using it because it’s verbose, for one, but mostly because it’s constantly making things hard for me to do. I know there are ways to do what I want, after all, millions of people use Java successfully every day, but I don’t know what they are. Furthermore, finding out what they are is excruciatingly painful.

I recently did a series of articles on a project I was doing to learn Clojure. It kind of petered out for a number of reasons, but one constant annoyance in learning Clojure was dealing with the Java-isms. Java has given Clojure a vast library of high quality software essentially for free, but it’s also brought on a lot of the pain, much of which I think needs to be fixed before Clojure can have the nice feel of my favorite dynamic languages.

Installing Clojure

The first thing one has to do is install Clojure. It’s not a package in Ubuntu yet, but it’s young, so that’s ok cause we’re veterans and don’t need no stinking packages. To compile, we just download the source and type “ant”.

And that’s it. There’s no install process that makes a nice pretty “clojure” command that takes us to the REPL or executes scripts that are passed to it. To run clojure, you need to run it using Java:

$ java -cp clojure.jar clojure.lang.Repl

That is a lot to type just to get a Repl, and getting a usable command line is even harder. After installing JLine ConsoleRunner, you need to get the library into your classpath (a rant on which is upcoming) and then run

$ java -cp jline-0.9.91.jar:clojure.jar jline.ConsoleRunner clojure.lang.Repl

Not exactly intuitive, but whatever. We put it in a bash script, put it in our path, and head off to the races. After a while, we have a few lines of a quality script we would like to save and run. How do we do that?

Obviously, it’s:

$ java -cp clojure.jar clojure.lang.Script my-script.clj

This assumes that clojure.jar is in the same directory as the script you want to run. If you don’t have clojure.jar there, you must provide a specific path to the jar file. There is no idea of a default directory where Java will look for jar files. You must provide every single jar file to Java at runtime.

Contrast this with the Python install process:

$ sudo apt-get install python
$ python
... Have fun in the interpreter
... Write a script
$ python my_script.py

Simple.

The Classpath

First of all, I’m no expert on the classpath, but it seems like an unholy abomination thrust upon us by invisible powers that must be extinguished at all costs. It would appear, and again, I am no expert, but it would appear that every single dependency of a program must be explicitly passed to Java at the time you run your program. I wrote a bash script to automate the process, but viewing the command line for running my simple Compojure-based webapp is apalling:

java -Djava.library.path=/usr/local/lib -cp :/mnt/data/Users/justin/bin/compojure/compojure.jar:/mnt/data/Users/justin/bin/compojure/deps/clojure-contrib.jar:/mnt/data/Users/justin/bin/compojure/deps/clojure.jar:/mnt/data/Users/justin/bin/compojure/deps/fact.jar:/mnt/data/Users/justin/bin/compojure/deps/jetty-6.1.14.jar:/mnt/data/Users/justin/bin/compojure/deps/jetty-util-6.1.14.jar:/mnt/data/Users/justin/bin/compojure/deps/re-rand.jar:/mnt/data/Users/justin/bin/compojure/deps/servlet-api-2.5-6.1.14.jar:/mnt/data/Users/justin/lib/clj-http-client.jar:/mnt/data/Users/justin/lib/clojure-contrib.jar:/mnt/data/Users/justin/lib/clojure.jar:/mnt/data/Users/justin/lib/commons-codec-1.3.jar:/mnt/data/Users/justin/lib/commons-httpclient-3.1.jar:/mnt/data/Users/justin/lib/commons-io-1.4-javadoc.jar:/mnt/data/Users/justin/lib/commons-io-1.4-sources.jar:/mnt/data/Users/justin/lib/commons-io-1.4.jar:/mnt/data/Users/justin/lib/commons-logging-1.1.1-javadoc.jar:/mnt/data/Users/justin/lib/commons-logging-1.1.1-sources.jar:/mnt/data/Users/justin/lib/commons-logging-1.1.1.jar:/mnt/data/Users/justin/lib/commons-logging-adapters-1.1.1.jar:/mnt/data/Users/justin/lib/commons-logging-api-1.1.1.jar:/mnt/data/Users/justin/lib/commons-logging-tests.jar:/mnt/data/Users/justin/lib/compojure.jar:/mnt/data/Users/justin/lib/jline-0.9.94.jar:/mnt/data/Users/justin/lib/tokyo-cabinet-clj.jar:/mnt/data/Users/justin/lib/tokyo-cabinet.jar:/mnt/data/Users/justin/lib/tokyocabinet.jar:/mnt/data/Users/justin/lib/tokyotyrant-0.6.jar clojure.lang.Script index.clj

That is bad. That is not correct, that is not how software should be designed, I object. Every other language I can think of off the top of my head (except JavaScript) has some structured way of finding its dependencies, and most have a way of adding additional rules to that search should the defaults not be adequate. While this can lead to “DLL hell”, I do not see how the Java situation is any better when everybody just ends up with scripts to automate the process and then those scripts pick up the wrong things and you can’t figure out why.

The classpath makes me very upset. If Clojure can find a way to mask it, I would appreciate it very much.

Maven

First of all, what the hell is Maven? A quick trip to their site reveals a huge chunk of text with hundreds of links and an initial sentence that describes it as:

Maven, a Yiddish word meaning accumulator of knowledge, was originally started as an attempt to simplify the build processes in the Jakarta Turbine project.

I went to the site with some hope that it would provide some relief to my dependency issues (All I want is “pip install”, or “gem install”), and I get greeted with a dense paragraph of history combined with some mumbo-jumbo about “best practices”.

After reading a bit I find that Maven downloads and builds dependencies and installs them in a local repository, along with the library you are trying to compile. Perfect! Sounds like exactly what I want. However, it doesn’t mention anything about the classpath. Am I still responsible for dealing with all that muck, even though it’s tucking my libraries in a hidden directory (implying that it’s responsible for managing them)?

To answer that question I need to wade through dozens of other pages that alternately describe how to accomplish basic tasks and lecture me on software engineering. Finally I come to the conclusion that while Maven does indeed find dependencies for you, it does not actually help you execute programs with those dependencies in place. This means you either need a script that automatically passes your entire maven local repository to Java, or you need to know the dependencies that Maven was conveniently supposed to hide from you. To top it off, it doesn’t play well with Clojure. Completely useless.

(For the record, there is a Maven extension that does exactly this.)

The Last Word

Dependency management is a hard problem that all languages must learn to deal with. Higher level languages have an even harder time in that they must not only deal with whatever dependencies they have written in their own language, but also with extensions written in other languages. Clojure, which is still very young, suffers tremendously from the godawful environment that Java has ensconsed itself in. I am largely a veteran of the *nix world, which seems quite different from the world Java developers have built around themselves. They have their own tools, their own build systems, their own set of “best practices”, and the Apache foundation. What I have seen in my brief saunter over the wall has appalled me. It has appalled me far more than similar saunters into the somewhat exciting world of Microsoft and .NET. It strikes me very much as a world in need of fixing, and I hope that Clojure (or Scala) can do it. Heck, I may even do my part to help.

But probably I’ll just run back to Python.

The New GOP

Speculating about the future of the Republican party has become a popular conversation amongst the political pundits. The most popular discussions revolve around who will be the face of the rebranded GOP that will inevitably come about. That isn’t a very interesting topic. In all probability, the big names now will fade and a fresh, charismatic politician will emerge onto the scene and carry the new platform forward.  The more important issue is deciding what that platform will look like. There are a few things that must be in that platform to be successful.

Renounce the Religious Right

The religious right is the worst thing to happen to the GOP. There is nothing wrong with their beliefs, I am a Christian myself, but their desire to impose those beliefs on the rest of the country gets them nothing but resentment and a reputation for narrow-minded ignorance. It is vitally important that the influence of this group is greatly reduced or removed entirely. Their needs can be met by the party without their face being on it.

Make Peace with the Gay Community

While it’s true that gay rights don’t have popular support, the active opposition of them by the Republican party makes them look, for lack of a better word, mean. To undo this damage, Republicans should start vehemently defending personal rights from intrusion by the government. This goes along with the principles of small government that Republicans are supposedly for. Government intrusion into peoples lives should be kept to a minimum, and when it is unclear whether a person has a right to do something, err in favor of the right. A Republican that can defend the rights of every citizen, gay or not, will come across as much more principled than somebody writing anti-gay marriage bills just because they know it will pass.

Take Back National Security

The Republican dominance of national security issues took a big hit during the Bush administration. Whether or not Bush’s strategies are vindicated, the Republican party still needs to repair the immediate damage to their reputation. One way to draw a clear line between the two parties is free trade. The democratic caucus is too diversified to take a strong position on free trade, and Republicans would be well advised to exploit the clear links between trade and security.

Get a Pragmatic Energy Policy

Republicans don’t have anything to say about energy. They need to find something. Whether they align themselves with the Democrats or strike out and find something new, the “drill at home” argument isn’t going to cut it. An underrepresented energy policy that the Republicans could take up is one oriented around nuclear power. By simultaneously pushing for nuclear power plants and for more electic motors, their policy would be easy to understand and very green.

Win Back the Latino Vote

The Republicans should have the Latino vote. Their small business support and smart economic policies should speak to Latinos. However, the immigration debate has aliented large numbers of them. The Republicans should come out with a sensible immigration bill that puts amnesty at the top. A party oriented around less goverment interference in people’s lives should apply those principles to any person who wants to be an American.

Find a Good Tone

One of the biggest differences between Democrats and Republicans is that Democrats tend to regulate and Repulicans tend to incentivize. This is a point that works well for Republicans. If they can show that they are trying to acheive the same goals as the rest of the country but want to leave choice in the equation, they can almost always win the debate against somebody trying to achieve those goals through force. People do not like to be forced into things, and the Republicans won’t do it. They’ll just charge you a bit.

Stop Being Corrupt

Every Republican that gets caught in some corruption scheme or affair reflects poorly on the entire party. Democrats have this problem too, but since they are in power, it will probably be happening more often to them for a while. If the Republicans can have a few scandal free years, they can emerge as the honest brokers for the people. Trust is probably the most important thing you can have in politics, and the Republicans have some time to earn theirs back.

If the Republicans can do these few things, as well as define clear and workable alternative plans for hot issues like education and health care reform, they will be able to compete again. Where the Republican party is currently associated with hate, foolish wars, closed borders, guns, and rednecks, a few smart changes could position them as the party defending the people from government encroachment, accepting of every person, and ready to do what it takes to keep Americans safe and prosperous. That’s a party people can vote for, and one that we haven’t had in a very long time. Perhaps losing power was the best thing to ever happen to the GOP.