Learning to follow directions

I had a meeting at Beth Israel early this afternoon, and wanted to go to the Harvard Medical School Dean’s Symposium‘s first session, which was at Harvard Business School at 4:30.  That left me with slightly too little time to meaningfully return to the office. Since it was a nice day, Evan and I decided we’d just walk from HMS over to HBS and use it as an opportunity for a walking meeting.

As we walked along the Charles River, we came across the following example of Not Following Instructions:

Not Following Instructions

I wish that I could say this was an example of bad design. But I think I have to go with user error. The close-up is worth sharing:

Need a can-opener?

I’ll talk about the actual Symposium tomorrow. For now, just be glad you’re not that truck driver.

Fed Sponsored, Open Source EHR

Senator Jay Rockefeller (D-WV) has introduced legislation calling for universal adoption of Electronic Health Records. The law would create a “public utility” board within the Office of the National Coordinator for Health IT, and the board would be responsible for coordinating the development of an open source EHR solution. There would also be additional funding (presumably over and above current stimulus dollars) for safety-net providers to cover the full cost of implementation and maintenance for a five year period.

That could be a lot of money. I’m working off the press release here, since I can’t find the text of the proposed legislation online – but I could see that being interpreted as paying for a substantial portion of a provider’s IT budget. There’s no question this would drive adoption for Health IT! It’s unclear that the open source condition would really effect the overall cost of the plan, as software licensing fees, while not trivial, are not the largest component of a hospital or small-office Health IT roll-out. If the goal is an EHR roll-out, why not let the provider pay for Epic with its own budget, and then subsidize the implementation costs (since they’re proposing to do that anyway.) But I digress.

My real question is the efficacy of the “public utility board” for shepherding the open source process. The bill calls for facilitating ongoing communication with the open source community to incorporate improvements and innovations into the “core programs.” I could see this going very badly indeed – I’ve been looking for last night hand haven’t come up with any large scale examples of large-scale government engagement with open source. VistA, the VA EHR system that is often exhibit A when talking about government support for open source, is very much accidental software, as the open source release was the result of a Freedom of Information Act request, and the VA has not exactly taken a leading role in facilitating the VistA open source community.

Open source development “managed” by the federal government sounds like a Bad Thing. A federal grant program for creating and maintaining open source healthcare applications, on the other hand, could be a very good idea – if encouraging an open source alternative to commercial EHRs is a seen as a public good, there’s an opportunity to fund companies to build those open source interoperability components, to support CCHIT certification of open source projects, etc. Many of my reservations about CCHIT would be dramatically reduced if they had a financial incentive to certify as many open source applications as possible – or if the certification of “meaningful use” was contingent on the availability of multiple certified open source alternatives.

The Rockefeller Bill is just a proposal, and if history is any guide it’s not going to move forward, at least in its present form. But this is as good a time as any to start thinking about ways the government can, productively, support the development of open source options for physicians.

(For further reading: Fred Trotter’s really excellent NCVHS testimony on open source EHRs.)

This Twitter Thing

Last Tuesday I attended HealthCamp Boston, a really excellent 1-day “unconference” organized by the extremely energetic Mark Scrimshire.  The unconference format is really fantastic, provided that you get the right people in the room at the right time. In this case, we did, and the user-generated agenda included an excellent discussion on the new HHS rules for PHRs lead by David Harlow of HealthBlawg, a deep dive into design by Claudio Luis Vera, a session on consumer and clinician PHR engagement that John Moore and I put together (with John providing most of the good bits) and a discussion of Twitter’s role in social healthcare media led by Jen McCabe Gorman. It was great to finally meet some people I only knew from online, and I definitely made some new friends (including beers and a fascinating discussion after the meeting with Vivek Garg of TrialX). I definitely recommend these events, and at $25 a person it’s a lot cheaper than normal conference. We’ll be organizing one on software design in healthcare at HMS in the very near future.

I didn’t actually make it to Jen’s presentation on Twitter – I was over with the pharma crowd. But last Tuesday was the day I figured out what Twitter was good for. It’s not that I was a Twitterphobe, but I’d signed up because all the cool kids seemed to be doing it. I followed a bunch of people, and set up this blog to advertise posts as tweets, and that was about it.

The eureka moment came during the first session of the day.  Since attendees were encouraged to tweet about the event, I brought up Twitter on my laptop and started writing tweets that summarized the interesting points of the discussion, using the #hcbos hash tag to identify them to the other conference-goers and interested outsiders.  Then I started following the hash tag in another window, and saw a few other people in the room were also tweeting. And here’s the cool bit – we were generally picking up on the same stuff. Not completely, but with at least 80% overlap. And just like that, Twitter was validated as an information source. I just had to see it in action.

For the rest of the conference I watched the hash tag and picked up some of the key sentiments from the sessions I missed. The next two days I followed the tags for the Health 2.0 conference, which I hadn’t attended. While I certainly missed the details, I definitely picked up the flavor of the event.  And in the week since, it’s been a great way to maintain contact with all the new people I met at #hcbos.

So that’s that – I’m not yet a complete Twitter addict, but I think I get it. Of course, now that I’m here, I’m seeing the dark side as well, as it becomes another vector for spreading swine-flu hysteria. As is often the case , xkcd gets to the heart of it.

Jaunty Jackalope for Java: Writing Java Code on Ubuntu

If you’ve been reading the tech news lately, you have probably noticed that Ubuntu is taking the Linux Desktop world by storm. Aren’t you just a little bit curious about why so many people, like myself, have dropped Windows and never want to look back? If you are, did you know that it’s actually very easy to get a PC, even one long past it’s prime, working in Ubuntu?

This article is designed to show you how you can be get a Java development environment up much faster than you could on Windows or OSX. Unfortunately, for a large part of the Java developer community, Linux remains a dark art. I am writing this article with the hope to reveal the lesser known secrets of Linux and persuade you to give it a try.

Poorly-Kept Secret 1:
What Windows Considers 3rd Party, Linux Includes For Free

Windows has recently gotten better with Vista as far as including useful basic applications, but I still have to download various 3rd-party applications:

  • Drivers: Graphics, Chipset, Sound, Network
  • Firefox: …even if you prefer IE or Chrome, how can you write webapps without Selenium?
  • A text editor that doesn’t suck, like TextPad.
  • File Readers: Acrobat, Flash, etc
  • WinZip and WinRar
  • PuTTY
  • An SCM client: TortoiseSVN
  • Java
  • MySQL
  • Maven
  • Eclipse
  • An Office Suite that can edit Office 2007 file formats.

Many of the entries on the list are non-free. While we all know WinRar won’t shut down if you don’t pay them $29 in 30 days, you are violating their license if you don’t.

In Ubuntu, all of these are available from the Debian repositories, allowing you to install them without a single manual download. Most of common tools are actually part of the default install.

Poorly Kept Secret 2:
Nearly every command in *NIX can be executed via GUI or command line.

If you’re a professional programmer or highly technical person, chances are you have experimented with Linux in the past. A decade ago, Desktop Linux was much more difficult than it is today. While I love Linux’s powerful command-line tools, modern Linux distributions, like Ubuntu, are so advanced, that everything can be configured via a GUI. The command line is optional. I’ll even be bolder and say that configuring Ubuntu is even easier than configuring Windows Vista.

Poorly Kept Secret 3: Debian APT

Configuring a Windows machine is a pain. I have a checklist of URLs of websites for the applications listed above in which I have to visit, download an installer, and install dozens of programs…usually with a few reboots thrown in.

Downloading and installing free software is a foreign concept to Ubuntu users. Everyone who uses a Debian-based Linux distribution is accustomed to using the Advanced Package Tool (APT) to install the bulk of their applications.

Simply type:

sudo apt-get install [package name]

…where “package name” refers to the name of the package on the debian repos and the system will download the package, it’s dependencies, and install them for you. In isolation, typing apt-get install eclipse isn’t a great deal easier than the windows procedure of downloading and unzipping eclipse. However, all the commands needed to build a workstation can be written to a single script for batch execution.

APT is similar to Windows Update, except that it is better in every way:

  1. It actually downloads the right drivers for your hardware, whereas Windows/Microsoft Update doesn’t support many devices.
  2. It supports nearly every free application. Just about every application I use is on the Debian repos
  3. Driver and software updates are available much more quickly than Windows Update.
  4. It has a command line (apt-get) and GUI interface (Synaptics).

Creating your own installer script

To jump-start your Ubuntu experience, I have pasted the script I use to setup an Ubuntu box. For bash, anything to the right of # is a comment. Paste the commands below into a text file with a .sh extension (it’s just a convention on *NIX) and execute:

chmod [your script file name] +x

…to make it executable.

My Build Script

#forces APT to search for new packages instead of relying on its cache.
sudo apt-get update
#upgrade existing components.
sudo apt-get upgrade
#MySQL Server + client
sudo apt-get install mysql-server-5.1 mysql-admin mysql-query-browser
#installs compiler and adds to path
sudo apt-get install sun-java6-jdk
#run applets
sudo apt-get install sun-java6-plugin
#our favorite build tool
sudo apt-get install maven2
#my favorite IDE
sudo apt-get install eclipse
#svn client (and server)
sudo apt-get install subversion
 
#flash plugin
sudo apt-get install flashplugin-nonfree
#allows you to view *.chm files
sudo apt-get install gnochm
#supports stronger RAR compression and newer formats.
sudo apt-get install unrar
 
#C compiler which allows you to build from source
sudo apt-get install build-essential
#ssh daemon for remote access
sudo apt-get install ssh
#My other favorite Mozilla application
sudo apt-get install thunderbird

Remove and add packages as needed.

Once you’re ready, execute the command. Be sure to watch the script for the first few minutes as the MySQL installer will prompt you for your root password and the Java install will require you to accept their terms.
After Java has been installed, go to lunch. On my machine, this downloaded over a gigabyte of packages. On my computer, this script completed in less than 30 minutes.

Immediately after Ubuntu was installed, I was checking out code and coding in Java and MySQL in less than an hour. Can you do that in Windows or OSX?

Advanced Topics:

Install everything with one command:

In the example above, I broke the packages into separate commands to allow commenting.
If you want to speed things up, have APT install all the packages with one command:

sudo apt-get install mysql-server-5.1 mysql-admin mysql-query-browser sun-java6-jdk sun-java6-plugin maven2 eclipse subversion flashplugin-nonfree gnochm  unrar build-essential ssh thunderbird

It’ll run a bit faster and only require a single prompt.

Perform the install remotely:

Install SSH before installing the other packages (sudo apt-get install ssh) and then you can perform the entire procedure remotely. If you’re using Windows, you’ll need to install PuTTY to SSH into your machine.

I personally prefer to perform the installs remotely as it allows me to continue working at full speed on a different machine while APT upgrades and configures my machine.

Test everything out

If you don’t see any errors, everything was successful. Because we’re paranoid, we like to test things out ourself. Try running the following commands:

mvn --version
javac --version

You can start eclipse from the shortcut in the programming menu.

Automating Manual Installs of Java Software

The procedure above is a rapid way to get started writing code in Java. Serious Java developers need more precise control over their JDK and tool versions than the Debian repo offers.

I personally manually install eclipse and maven rather than get them off the repos in the script above because I want to use the latest bleeding-edge version. Even downloads are scriptable:

#download binary
wget http://mirror.sourceshare.org/apache/maven/binaries/apache-maven-2.1.0-bin.tar.gz
#extract binary.
tar -C /tools/ -xvzf apache-maven-2.1.0-bin.tar.gz

The command above will download Maven 2.1 and extract it to /tools/.

Setting PATH

When you install software manually, you have to set the path yourself. To make life easier, I create a script named .environment_variables and include it in .bashrc.

My .environment_variables file:

#Commands written to separate file so that source can be imported by .bashrc for shell and .profile for GNOME and startup.sh
 
export JAVA_OPTS="$JAVA_OPTS -Xms128m -Xmx1024m -XX:MaxPermSize=512m"
 
export ANT_HOME=/tools/apache-ant-1.7.1
#Helps Jetty
export MAVEN_OPTS="-Xms64m -Xmx1024m -XX:MaxPermSize=512m"
export JAVA6_HOME=/usr/lib/jvm/java-6-sun-1.6.0.10
export JAVA5_HOME=/usr/lib/jvm/java-1.5.0-sun-1.5.0.16/
export JAVA_HOME=$JAVA6_HOME
#imported by IntelliJ
export M2_HOME=/tools/apache-maven-2.1.0
export ECLIPSE_HOME=/tools/eclipse
 
#IntelliJ
export JDK_HOME=$JAVA6_HOME
export IDEA_HOME=/tools/idea-9732
 
export CATALINA_HOME=/tools/apache-tomcat-6.0.18
export JBOSS4_HOME=/tools/jboss-4.2.3.GA
export JBOSS5_HOME=/tools/jboss-5.0.0.GA
export JBOSS_HOME=$JBOSS4_HOME
 
#BDB
export LIBDIR=/usr/local/BerkeleyDB.4.7/lib
export LD_LIBRARY_PATH=$LIBDIR:$LD_LIBRARY_PATH:/tools/yourKit/bin/linux-x86-32
 
export PATH=$PATH:$ANT_HOME/bin:$M2_HOME/bin:$ECLIPSE_HOME/:$IDEA_HOME/bin

To import .environment_variables, include the following line in .bashrc, .profile, or any other scripts:

...
source ~/.environment_variables

Conclusion

Ubuntu makes configuring a developer’s Linux workstation incredibly easy. Linux is not only a powerful OS for Java development, but it’s even easier to configure than OSX or Windows. Because nearly everything you need is free and everything is scriptable, system setup can be completely automated, allowing the user to build a useful workstation from a base install from a single script.

Additional Resources

Debian APT Reference
Linux.com’s APT primer

Feedback is appreciated. Please feel free to leave comments.

The Patient is the Platform

Doc Searls invented the Internet. Ok, not really – but he was one of the co-authors of the Cluetrain Manifesto, which did as good a job as anybody, and better than most, at predicting the degree to which the Internet would facilitate conversations, rather than just transactions, companies and their customers.

Anyway, Doc is now a fellow at the Berkman Center at Harvard Law, and for the last year or so has been thinking about healthcare:

Doc Searls Weblog · Getting real about fixing health care.

What he’s done here is coined a really nice, pithy term: “the patient is the platform.” I’ve been trying to say the same thing for a couple of years, usually with a variation on the phrase “the only person who knows where all my healthcare data is hidden is me”. We even ran an entire conference on the PHR as a platform in 2007 (and there’s some great video on the web site). I like Doc’s version better, and I’m going to steal it.

On the subject of pithy one liners, at HealthCamp Boston yesterday, John Moore and I ran a session on Consumer and Clinician engagement in healthcare IT. John did a nice job of keeping the discussion focused on human factors (I only dragged it down one rabbit hole when I decided we really needed to talk about microformats), and in the follow-up conversation we came up with another Internet analogy:

The PHR is a patch.

In other words – the health system is broken. Lack of coordination and information sharing is one part of the system failure. Personally Controlled Health Records promise (they have yet to really deliver) to bring disparate parts of the healthcare system together, via the agency of the one actor who actually touches most of them: the patient. But PHRs, and even EHRs, are not healthcare reform. They’re a bridging measure.

Oracle, Sun and Open Source

The Wall Street Journal ran an article today (registration required) on Oracle’s acquisition of Sun and it’s impact on open source, particularly MySQL. From my perspective, the coolest thing about this article is that I’m quoted in the third to last paragraph. Of course, they took a fifteeen minute conversation and boiled it down to the idea that while many people would likely be willing to pay a small fee for MySQL, if the costs get too high they’ll switch to something free.

I’m not as worked up about this as the general open source community seems to be. The trend towards inexpensive, open-source, commodity databases is here to stay. MySQL happens to be the leader right now, but there are several other options out there, including PostgreSQL (and it’s commercial variant, EnterpriseDB), Apache’s Derby, Oracle own open source BerkleyDB embedded database, and a few others.  Each of these fits very different niches, but it’s not an ecosystem of one. If Oracle was to take extreme measures against MySQL now they might be able to delay the commoditization of the database market by a year or two, but no more than that.

But I don’t think they’ll even do that. Oracle didn’t buy Sun for MySQL – they bought it for Java and, possibly, for the hardware business. They could have had MySQL for a lot less a year ago, and they’ve owned an important MySQL component, InnoDB, for several years with no negative impact on MySQL.  Picking up MySQL was just a bonus, and it could open up some interesting opportunities for Oracle. Not so much at the low end of the market, where they already have products, but as MySQL users find themselves needing some of the very high-end features where Oracle leads the market. One example that’s particularly important in healthcare: Oracle supports a feature called “Transparent Data Encryption”, that allows seamless encryption of database tables on disk. It’s an expensive, enterprise-edition add-on, and MySQL doesn’t have anything like it.  As healthcare organizations gear up to meet the new breach disclosure guidelines from FTC and HHS, that’s going to become an attractive feature.

One small correction to the WSJ article is that I’m not “an IT Director at Children’s Hospital, Boston”. I’m the Director of the Informatics Solutions Group at CHB, which is actually quite different – we’re not part of the IT department at all (we came out of the informatics research world).  We’re still substantial users of both Oracle and MySQL, and the CHB IT department has been very helpful over the years as we’ve juggled various bits of infrastructure for different projects.

Embeddable Image Editing on the Web

Aviary, an online image editing application (which is, in itself, extremely cool) just introduced an API, allowing easy embedding of its editor in a range of other web applications. To my knowledge, this is the first embeddable application of its type, and I’ve already come up with a couple of potential applications in the healthcare environment, despite the entirely unsurprising lack of DICOMM imaging support.

The challenge with relying on an external partner to provide core application functionality. There are HIPAA issues too, since the Aviary web site defaults to some pretty agressive sharing. But there’s nothing there that can’t be resolved, but there are still real concerns about integrating functionality from startups into your own products and services. When the startup sent you a disk (and put the source code in escrow) that was one thing – but when you’re relying on them to provide a service, it’s an entirely different kind of risk. I’ve reached out to them about some of these issues, and I’ll be interested in hearing what, if anything, I hear back.

But still, pretty neat stuff. Here’s a screenshot, and you can play with the application itself on their web site:

Aviary Releases API: Add Image Editing to Your Website – ReadWriteWeb.

Oracle Buys Sun

Tremendous implications for open source:

Oracle Agrees to Acquire Sun Microsystems – WSJ.com. (Login required)

Sun owns MySQL, the leading open-source competitor to Oracle’s relational database system. This is probably not as scary to MySQL users as it might initially seem. Oracle has been supportive of the BekeleyDB open-source embedded database (which they acquired several years ago), and have owned InnoDB for several years as well. InnoDB created a critical piece of core software (a “storage manager”) that is used by most MySQL implementations already. I met with some of the BerkeleyDB for Java people a few months ago, and was pretty impressed with Oracle’s overall commitment. Of course, BDB is a small product – MySQL isn’t.

As for the implications for Java, I think it’s probably a good thing as well. Oracle has been deeply involved in Java’s development for years, and has a major investment in the language. Since Oracle is much healthier, financially, than Sun has been recently, the deal should ensure that the platform is actively developed over the next several years.

How the codes versus clinical story ended up…

The big topic on the Health IT blogosphere was Dave deBronkart’s misleading administrative data in Google Health.  One of the really nice things about Web 2.0 – and responsive organizations – is that learning can be rapid, and lessons quickly applied. Here’s a post by John Halamka, the CIO of Beth Israel Deaconess, Dave’s hospital, outlining the changes they’ve made to their Google Health integration:

Life as a Healthcare CIO: Lessons Learned from e-Patient Dave.

Should some of this stuff have been figured out earlier? Probably yes, but virtually everybody in the PHR industry has been using claims data for years, since it’s all that most organizations have access to. So there’s not much point in singling out Beth Israel for having included it.

The upshot is that there’s been a change in how at least one hospital is dealing with this data, and there’s been some useful discussion about how difficult this whole data liquidity project actually is. More broadly, the use of claims data for consumer-level health records has taken a hit, although not a fatal one. Claims are often very useful for broad, population level analysis – not in the least because inaccuracies and inconsistencies tend to come out in the wash. As various commentators have noted, they were never intended as an instrument to actually provide healthcare.