12 years of blogging .. about medicine, technology and their intersection …

This post from November 26th, 1999 – was the first on this blog.  There were a few months of previous posts, but due to several platform changes back then – these seem to be lost.  

No matter.  12 years is a long time.  My blog is now officially an adolescent.  I wonder what it will be when it grows up!  Long-time readers are of course observant that I've been remarkably quiet for the past few years.  This is due to my evolving work for an HIT vendor and now the Federal Government.  

So I've been operating with this in the background for the past six years:

The opinions expressed on this blog are my own and do not represent the veiws of my employer.

And there is a rough "social media policy" (google docs – you have edit rights .. feel free to steal or enhance … ) that I have in my head as well .. so in general I have done my best to observe and occasionally point to important publicly available information, but take care not to comment too deeply – for fear that others would interpret my commentary as a telegraph of my employer's next steps.  This wouldn't be appropriate for me to share – and increasingly – I am concerned that most of my public thoughts could be interpreted in this way – so I've been holding back from any public commentary.

So for now – here we are. 

I'll push the envelope a teensy bit and comment on some events of the past few months:

Tim HISTalk covered my arrival at ONC in a post about a month ago.    He asked the right questions about the topic at hand – but he didn't get to the one that I am hearing often these days – which is .. "Why did you leave your leadership role at one of the top health IT companies, choose to spend weekdays away from your family, AND (with two kids in college) take a giant pay cut?"  

The answer is easy:   It's the right thing to do.  

Health Care in the United States  is at a turning point.  It is well known that despite great advances – we don't provide the quality of care that we would.   It is also self-evident (to me) that technology – carefully applied – will improve both the quality of care – and the efficiency, sensitivity, and ease with which it is delivered.  Yes – some of those words may not be familiar to you – but why WOULDN'T we want it to be EASY to deliver great care?  Why shouldn't we deliver SENSITIVE care (sensitive to your hopes, religion, fears, preferences) – in addition to efficient, evidence-based and (of course) cost effective) care?

 So I have always tried to focus my work on helping others meet their true potential.   In my first career – as a 16 year old sailing teacher, I helped kids find the freedom and autonomy that a good breeze and a sunfish will provide.   As a teacher of junior high school kids – I witnessed breathtaking intellectual growth in a herd of 12 year olds who were otherwise distracted by adolescence and its daily challenges.  Working with (some say "caring for") patients as a family physician - I found that my most important work was not to take control and "fix" my patients (as some of my mentors had advised in medical school) but to partner with my patients – serving as a resource – without any judgment or critique.  As Bill Miller and James Prochaska have demonstrated (motivational interviewing, transtheoretical model) – people change when they choose to – and no sooner.  Can we facilitate growth in others?  Of course we can.  But "facilitate" and "cause" are inherently different.

As a leader in a large health IT software company – my role was often to help our teams align the software products we were producing with the needs of our customers.  This is not unlike the role of a good physician:  we need to listen carefully and critically so that we understand the needs (which will sometimes differ from the "wants") so that we can facilitate success.

And isn't that the role of government too?   Perhaps that's a political question.  Some would argue that government should get out of the way, while others would argue that there is an important role for government to provide an infrastructure with which success can be facilitated.  Is a healthy happy nation something that is important?  Are there ways that government can facilitate a migration toward these goals? 

I think so.  Keep an eye on my occasional tweets , g+ posts (rss), and posts here on this blog.  It will continue to be sparse here on the blog. 

Sammy Starts a Business …

With some help from Nikita – the offshore development leader, Sam is on the edge of releasing his first website.  While it's not likely to cause him to be the next Sergey Brin – he hopes to make a little bit of money – and provide a valuable service.  Details to follow in a few days when version 0.5 goes live …

Sam needed to create an LLC.  When we created Oncalls.com about a decade ago – we did a quick google search (maybe it was Altavista back then!) and chose a company that could "take care of creating a company for you" for a low-low price.

But the low-low price we paid got us stuff we didn't really need (a special seal, a binder with 10 pages in it, an annual fee for a Registered Agent, etc.

So this time – we used UpstartLegal.   They do what you need (help fill out the forms and file them with your State and with the IRS – and don't do what you don't need.  Most of the companies that you find on the Internet will charge you more for filing with your state – and they generally include registered agent fees.  But if you create your LLC in your home state – you don't need a registered agent.  So even though they may have a low-low price of $99 – when it all comes together – you'll end up paying much more than that .. and more every year thereafter.

The UpstartLegal team is smart, honest and very clear.  It's a nice service that made this part of Sam's new endeavor completely painless and worry-free.  Well done. 

Agile Development

The Agile Manifesto seems like ancient history now.  The concepts of iterative development were not new – but they hadn't been marketed until the manifesto was published and the movement was unleashed.

In  late 1999 or early 2000 I can remember sitting in a meeting room with the Assistant CIO of a large healthcare organization .. describing my preference for using what I then called an iterative development process – where we would define "bite-sized parts" for implementation, exposure, and refinement on a regular basis. 

She had never heard of such a thing – and advocated for the developers on the team: 

"They need to know when it's finished!" 

Me:  "This is software – it's never finished"

"But the customer needs to sign off on a completed project.  How can we know that it will meet the customer need?"

"uuuh … ask them?"

"We ask them during the requirements process – when they define the project"

"And that is successful?  They are always happy with the final product?"

"Well – no – but if they didn't describe their needs appropriately – that isn't our concern.  So long as they have signed off on the spec before the development work begins – we have clarity for the what the requrements are – and if we build it to spec – we've completed the project and we can move on."

..

I stopped trying.  Clearly the goal here was to complete the project "to spec" and move on to the next project. 

There was a problem though – developers were bypassing standard process – and interacting directly with customers (with no management oversight) and were creating solutions collaboratively with customers.

So the Ass(istant) CIO wanted to give the developers a sense of closure .. but the developers wanted to please the customers – and bypassed their managers to do so!

Trouble in them thar hills, too.  With no Human Factors training – and minimal design skill – developers all-too-often gave the customers what they asked for rather than what they needed.  End result: ACIO came down hard on such "renegade" developers.

This reinforced the waterfall mentality.  🙁

Writely Invites, Google Calendar SMS tricks

I noticed that Writely has just increased the number of invitations that current users have available. I'm curious. If you have one availabe .. please send me one (if you have my e-mail address) .. or if you don't have my e-mail address, you can use this form to send me a note and I'll reply with my e-mail address.

And Bruce sent me a link to this post about how to interact with google calendar via SMS. It works!

RFC3219 – for nerds only

The IANA RFC3219 listing shows who the real early adopters are in the SIP namespace.  Dorks who really want to call me will be able to dial my extension (yeh – right – like I'm going to publish that on the weblog!) at phonehost.slingerlands.com.  (No .. it's not really "phonehost" either)

See the ISN cookbook for more on this and how to get your own.

 

 

VOIP, SwitchVox, SSL

We are getting very close to the day that we go live with our new phone system at the office.  Still a few bugs to work through .. but I've had enough random requests for the status – ever since I posted my review of SwitchVox that I do owe a bit of an update.

Here goes

The software is good, and we've been getting help from the tech support staff at FourLoop throughout.  There remain some wrinkles here and there, but updates seem to be coming at a pretty good clip – so I expect things will continue to improve.  

What sort of rough edges?  Well – the features of the software have come along well since the publication of the manual in June – and the help system that is embedded in the software is good.  But the documentation hasn't kept up with the features of the product – and this is sometime frustrating. It takes a while to "get" the best method for creating a really good IVR – and I wish that there were examples of more complex IVRs in the documentation – especially how to use the "option" functions.  Here's how (I think) it works:  Create an IVR.  Have step 1 be "play a sound" such as:  "choose 1 for eggs and 2 for peanut butter."   Now choose "options" and tell SV where to go when the user chooses Option 1 or Option 2:

Yes – it really is easy-as-pie.  And I THINK this is the way I'm supposed to do it .. but nothing in the documentation leads me there.  Some of this makes perfect sense and is very powerful-yet-simple (an awfully challenging combination to create) but the simplicity gets the upper hand in some places of the IVR – especially where it comes to the handling of options – and the handling of conditional clauses.

Having "options" stuck at the bottom of an IVR means that they HAVE to be the last thing that a user encounters.   While it's possible to develop a complex IVR that sends the user right to the end .. and then based on the option chosen – back up to a step above – this gets confusing quickly.  It would be much more intuitive to have the "options" behave like any other IVR action – since they are really just a "case" statement.  

And speaking of logic – the conditional clause is GREAT .. except it's only part of what I'd expect to see in a conditional clause.  I want ELSE and OR and AND and ELSEIF.

Ok.. enough complaining.

Josh and his team built something that I LOVE – and it's easy to use too.  It's a URL that I can put into web applications that causes the system to do something.

Here's the documentation for how it works:

 

What is the Call API?
The Call API provides a web interface for originating calls through the PBX. This is often called click-to-dial, and is done by requesting a specially fomulated url from the pbx.

How does it work?
Below is an example URL and a description of its functionality.

Originating a call Example URL:
https://IP.OF.PBX/api?cmd=call&extension=104&number=918005551212
cmd=call Tells the PBX this command is a call origination command
extension=104 What extension to ring on the PBX system
number=18005551212
When the call is answered by the extension this will be the number it will try to ring

How do my Call API Settings effect the call API?
The Call API settings allow the pbx to modify requested phone numbers so that they correctly match what the system expects. For example, if you request that the API dial 8005551212, the Call API Settings will add a 9 and a 1 to make the number 918005551212, which will then be dialed by your phone.

 
 
 
So if I have a link on a web page of our mini-EMR with a picture of a phone .. and it links to the pbx and tells it to call 5551212 from extension 500 .. then it calls 5551212 AND rings x 500 at the same time. So from the patient's chart – I can click to call the patient instead of dialing.
 
Yeh – you've heard of "click-to-dial" and you are not so excited?  maybe the fingers need a little exercise?
 
Ok .. but … say you need to call 1000 people over 4 days and let them know you have flu shots available and they can choose any of three saturday mornings to come in and get one.  How can you use the API to do THIS – you say?
 
Easy-as-pie:
 
Build a little application (I use coldfusion but you could use anything you like) .. and do the following:
 
  1. Build an IVR that plays a sound:  "Hi – you need a flu shot. If you want one – listen carefully.  You can come in and get one on any of the following days …  Press 1 for November 63rd, press 2 for October 34th and press 3 for December 44th. If you are hearing this message on your answering machine, you may call us back with your choice by calling 111-1111"
    1. Since the IVR will know who is called – it will send the result back to the application with:
      1. Name of person
      2. Date they chose
      3. (or that nothing was chosen – so maybe we got the answering machine .. which is fine.  We'll set up a temporary route on a DID so that when people call back they will get right to the IVR.  No waiting for a human.
  2. Query the database for the people you need to call and their phone numbers
  3. Loop through the query and send the phone numbers to the phone system every 40 seconds or so (evenings .. so we don't clog up the phones during the day).
  4. In the morning – run a report from the application to see who was called – who responded (and how) and how many people we need to schedule for the flu clinic on Saturday.
This works fine and I tested both the IVR and the Coldfusion and it seemed like they would work well – but I didn't (until tonight) try to tie them together.
 
When I did I got a mean error that Coldfusion couldn't connect to the PBX and all I got was a cryptic connection error.
 
So I had to do a little research and finally figured out that I had several problems.
 
  1. Fourloop build SwitchVox to use SSL when you are logged in as the administrator.
  2. To use the call API – you need to use SSL
  3. The SSL certificate is self-signed which is fine since it's OUR server and I think I trust myself. 
    1. But that's a little annoying because the browser complains that it doesn't have that certificate and that the name of the certificate (pbx) isn't the same as the name of the server. 
    2. But it's not so bad because I can click on the little alert .. or take the 29 seconds to install the certificate on my computer.
  4. But Coldfusion can't click the little box so I will have to install the certificate on the coldfusion server to make it happy.  Steven Erat shows us here how to do that.  .. ok .. now that wasn't so hard.  (or was it?)
    1. But it still won't work.  See the comments on Steven's page.  Several people got through step 1 only to learn that step 2 still stopped it from working:  "I was wondering if you know of a workaround for CFHTTP when posting to https:// where the certificate name on the SSL does not match the host name.

      When attempting this, I receive an Error Detail of I/O Exception: Name in certificate `www.domainname.com' does not match host name `xx.xx.xx.xx'"

      Hmm .. looks like I have the same problem.

But I figured out the solution!  Since I know that the certificate is called "pbx" and I now have it installed on the application server (which in this case is the client – SwitchVox is the server) .. still follow? .. I make an entry in the "hosts" file of the application server called pbx and point it to the IP address of SwitchVox.

Now I run my test page and my cell phone rings (every 40 seconds!) and it tells me I need a flu shot and the browser window of the debugging test page says:

Explanation OK
Http_Version HTTP/1.1
Server Apache/2.0.48 (Fedora)
Status_Code 200

 Hooray!

So we have solved the problem of coldfusion having trouble with SSL and reporting a connection error: I/O Exception: Name in certificate.   First, Install the certificate on the Colfusion server.  Next,  make a "hosts" entry to fool cf into thinking that the name of the remote server is the same as the name in the certificate.