The Last

He was the last. Old and wizened, he counted down his final days, his final hours on Earth. He lay in his bed, the rain drumming monotonously on the window. Night came. He pressed the button to call the aide. The aide appeared at his bedside. Every night the old man had the same request. The aide went to the window and briefly pulled aside the curtains. He peered outside. He turned to the old man and shook his head. The sky remained overcast, as it had since the day the old man had fallen ill. After briefly fiddling with the intravenous equipment, the aide left the room. He was alone again.

He stared at the window. He felt no pain. The medications worked well. But they made him weak. Or perhaps it was just his condition. He slipped in and out of a dreamlike state.

He recalled his colleagues, the others like him. Never a large group, their number had progressively decreased over the years. One by one they had fallen. The next-to-last one had died three years ago. Meanwhile he had hung on, while the world move past him. He reviewed his cherished memories. No one else on the planet shared those precious memories. Soon they would be gone.

He was the last. But he had not been the first. He, like all his colleagues, had wanted to be first, but that envy didn’t last long. He often wished there had been others, many others. He knew someday there would be, but, as long as he had lived, still it was not long enough for that to happen. This surprised him, even now.

He sensed that tonight was the night, the final night. Outside the rain had stopped. The old man looked to the window. There was light there.

He had been too weak to walk, too weak to move for days now. Nevertheless, he pulled himself up, grabbing onto the bed-rails. He knew he had enough strength to get over the rails, onto the floor.

The light in the window increased. He pulled out his intravenous line. The entry point in his arm started bleeding. He ignored it. The pump whirled along automatically, infusing drops of medicated water onto the floor.

He got a leg over the rail, then his shoulders. The distance to the floor wasn’t great, but from his vantage point it looked like he was perched on top of a giant cliff. He took a deep breath and hurled himself over the railing.

Some time later the aide, making his rounds, entered the room. He was surprised that the old man in his weakened condition had been able to escape from the confines of his bed. His body lay a few feet away, next to the wall, beneath the window. The curtains had been torn down from their rods. The rain had stopped. The clouds had retreated. The night was clear.

The old man lay on his back. The light of the full moon lit his face, for the last time.

More Microsoft Migraines

windows-desktop-app-converterWhen I ported the EP Calipers app (an electronic calipers app) to Microsoft Windows, I initially planned to write a Universal Windows Platform (UWP) app. The UWP is an initiative by Microsoft to allow developers to have one code base that can run on all Windows platforms, from PCs to phones to Xbox to HoloLens. UWP apps can be distributed from the Windows Store and are more secure than traditional Win32 programs, as they don’t install DLL files all over the place and don’t write to the registry. These apps are sandboxed, similar to iOS and Android apps. The UWP is a laudable goal, but inherently difficult to implement in Windows which was not originally designed with security in mind, as opposed to Unix/BSD based operating systems like Android and iOS.  Unfortunately, I found the application programming interface (API) of the UWP difficult, and so I ported EP Calipers to .NET, creating a traditional Windows PC program. At the time I did this, there was no way to distribute a Windows PC program on the Windows Store, so I was forced to distribute the program via a 3rd party. I would have much preferred to distribute via the Windows Store, as I thought this would create more visibility for the app.

With the Anniversary update of Windows 10, I learned about Project Centennial. This project provides a route to convert Windows desktop programs to APPX format — something that is not quite a UWP app, but something that can be distributed on the Windows Store. After reading the MSDN documentation and viewing some instructive videos, I launched into making the conversion.

The transition has not been as easy as I had hoped.

I downloaded the DesktopAppConverter (DAC) from the Windows Store. Despite this origin, this is not really an app. Instead it runs in a PowerShell (which you must run as Administrator). However before you can run the conversion, you also need to download a “Windows Image” (WIM) file that matches your current version of Windows. This is wim file is something akin to a Windows virtual machine, and the download is large, as you might expect (3.3 Gb). I live in an area with poor internet service (3 Mbps speeds), so it takes longer than a coffee break for this kind of download. I used the Microsoft Edge browser, and it took several attempts to download this file. The browser would declare the download finished, even though only a little more than 2 Gbs had been downloaded. Finally it looked like I had the right number of Gbs, but when I ran the DAC I got an obscure error. I suspected my download was corrupt. Yet another download, using Chrome, got me an non-corrupt download. I wish Microsoft would include a checksum with their downloads, to verify the downloads, but they don’t. Anyway this last download worked — to a point.

Ah, I should have read the fine print. The DAC only works on Windows Pro or Enterprise. I was running Windows Home edition. Sigh. $99 and a short download later, I was running Windows Pro. And I was off to the races — well, not exactly!

DAC works by running your program installer in a virtual Windows environment, and capturing whatever changes your installer makes to the file system and registry. It then encapsulates that information into an appx file that can be uploaded to the Windows Store. The documentation suggests that you can use any installer, as long as it installs silently (i.e. without user input). I had created an installation package using the Visual Studios ClickOnce packaging system. Oops, too bad. That’s the one kind of installer package that doesn’t work with DAC.

In other words they wanted something like an InstallShield installer. An MSI file. Well I had an old version of InstallShield from about 10 years ago. Alas, it was so old that it wouldn’t install itself on Windows 10. Well, maybe I’d have to buy a new edition of InstallShield. I went to the website. Hm, the cheapest version , InstallShield Express, was listed for $699. Yikes!

So I ended up using the Wix open-source installer, with the help of the Wax extension to Visual Studios, to create my MSI installer file (all for free). And so finally I could run the DAC after tweaking the -InstallerArguments (the “/S” silent installation argument as suggested in the documentation didn’t work, and wasn’t needed since the Wix installer I made was silent by default). I also had to make sure my code was compiled as an x64 (64-bit) file, because the DAC only supports 64-bit platforms at this time.

The next step was to sign the appx package. I created a certificate as suggested by the documentation, but it didn’t work. I needed a trusted certificate. Not too clearly documented, it is necessary to right-click on your certificate and add it to the Trusted Root Certificate Authorities. After this, I actually had an appx file that I could install by double-clicking it.

I then spent a few days fiddling with icons. Although UWP apps use 60 plus icon images to create various size tiles, it appears that appx files just need 3 images. These are added to the Assets folder generated by the DAC, and the AppxManifest.xml has to be hand-edited to point to these images. Here as throughout the conversion process, the documentation is quite rough and hard to interpret. The 50×50 pixel size image that is used by the application installer appears fuzzy, so I substituted a higher quality image. I still don’t think that all the icons (for example when using the Open With dialog) work quite right. Anyway, after editing these files, you use the MakeAppx.exe program included in the Windows SDK to recreate your appx file, and then sign it again. I created some PowerShell batch files to do this.

I applied to submit apps to the App Store. I applied as a company, which costs $99 (which the website states is a one time fee, though the email receipt I received mentions “Annual Developer Registration”). Because I registered as a company, I had to wait a few days to be approved, after getting a couple of phone calls from a company whose job is to verify that other companies are real companies — a step that Google and Apple don’t bother with.  But EP Studios was duly approved as a real company, such that it is, and all appeared ready for my first Windows App Store submission.

And so I submitted my app. Only to get this error message:

Package acceptance validation error: Your developer account doesn’t have permission to submit apps converted with the Desktop App Converter at this time.

Whaaaaa?? Further research disclosed that even after paying your fee and becoming a certified Microsoft developer, you still have to ask Microsoft “pretty please can I upload apps converted with the Desktop App Converter?” I duly filled out the form to request this. Twice. And I have not heard back from Microsoft.

When I compare this app development and submission process to that of, say, Google or Apple, there is no comparison. The Microsoft process is a chamber of horrors, requiring more time, patience and money than those others. Documentation is poor, and, presumably because not many developers are trying to publish to the Windows Store (I wonder why?) there is very little help in the usual places like StackOverflow. I would Google DAC error messages and get nothing but crickets chirping. All this is unfortunate, especially as I plan to leave for Europe in a few days and I had wanted to get this app uploaded before then. My Windows development machine is a heavy, bulky, desktop (remember them?) computer that certainly is not coming with me.

Maybe by the time I return to the US in a few months, Microsoft will be ready to allow me to submit my app.

Syberberg’s Parsifal

Parsifal and Flower Maidens from Syberberg's Parsifal
Parsifal and Flower Maidens from Syberberg’s Parsifal

One thing that bothers me about opera is that the stage directors are constantly getting into the act, injecting their often weird interpretations into productions, often to the point of destroying the intent of the composer and librettist. Certainly interpretation of a score has a place up to a point, but one can’t redo a Beethoven symphony as hip-hop without fatally distorting the meaning of the music.

The most OCD of operatic composers was Richard Wagner. Not only did he compose the music, he wrote the libretto of each of his operas. Not satisfied with this, he built his own opera house designed especially for the performance of his operas. The stage directions he wrote into his scores are very detailed, and pushed the limits of the technology of his time. Even today, depicting Rhinemaidens singing as they swim in the river, or the burning of Valhalla, or the Valkyries flying through the air on their horses necessitates leaving more to the imagination than can be technically depicted on the stage.

Yet despite this (or maybe because of this?), stage directors think nothing of ignoring these directions and instead impose their own sometimes harebrained interpretations on these finely crafted works. No one would dream of substituting an oom-pah band for the orchestra, but yet anachronistic reinterpretations of the Ring, for example, sometimes bear a closer resemblance to Star Wars (e.g. this) than Norse mythology. Fortunately in most cases the singers, the music, and the text are able to overcome what otherwise would be a cringe-worthy staging.

Case in point: I have seen Die Meistersinger von Nürnberg performed live on two occasions. The first time, years ago in Denver, was a traditional staging, set in the time of the Meistersingers, with period costumes and scenery. It was very enjoyable. This past year, in Paris, I watched the Stefan Herheim version. This version is very cleverly staged, though the bottom line of the production is that the whole opera is just a dream of Hans Sachs’s. The scenes take place on giant versions of his desk and other parts of his room, and various characters from German legends float in and out of the scenes. I have to say that this was entertaining in its own way, but it also somewhat subverted the sad nobility of Sachs in his affection for Eva. I preferred the Denver version that was truer to Wagner’s intent.

All this is just preamble to my feelings about the 1982 film of Wagner’s last opera, Parsifal, directed by Hans-Jürgen Syberberg. I had heard of the film, but had never seen it until recently. The complete plus-4-hour film is available (at least at the moment) through the magic of YouTube. At first glance, the film seems to do all the things I complained about above. The setting is a giant death mask of Wagner. There are tacky puppets and front-screen projections. There are deliberate anachronisms, like Nazi flags. The protagonist, Parsifal, changes between a male and a female. Only a few of the actors actually sing their roles; most are just lip-synching. So, given all this, I am surprised that I really liked the film.

Parsifal, Wagner’s final opera, is a strange work. After the Norse mythology of the Ring, Wagner turned back to the medieval Christian mythology he had previously explored in Lohengrin. Here we find the Knights of the Holy Grail, and Parsifal, “der Reine Tor — Pure Fool” who ends up saving the order of the Grail. Based on medieval tales such as Wolfram von Eschenbach’s Parzival (point of trivial for cardiologists: von Eschenbach in the 13th century describes treating pericardial tamponade with a hollow reed — something that didn’t make it into Wagner’s opera), Wagner as usual wrote his own libretto and has his own interpretation of the tale. This contains many “un-Christian” elements, including a self-castrated evil sorcerer, a knight suffering from a non-healing wound inflicted by the lance that pierced Jesus’ side on the cross, a woman doomed to live forever under a curse because she mocked Jesus at the crucifixion, and over an hour of the most intense seduction scene imaginable, first by a group of flower-maidens, and then by Kundry, the aforementioned conflicted, cursed, unsaved, undying woman/witch. Apparently this mixture of the sacred and profane was met with mixed reactions when the opera premiered, as it does today.  Underpinning all this is Wagner’s music at its finest  — motifs intertwined more intricately than those of Die Götterdämmerung, his penultimate opera. There are many odd and intriguing aspects to Parsifal. It seems that the Castle of the Grail is located in some kind of parallel universe. There is this odd exchange, which make me wonder if Albert Einstein ever viewed the opera:

Parsifal: Ich schreite kaum, doch wähn' ich mich schon weit.

Gurnemanz: Du sieh'st, mein Sohn, zum Raum wird hier die Zeit.

Parsifal: I scarcely move, yet already it seems I have travelled far.

Gurnemanz: You see, my son, here time becomes space.

So what is so great about the Syberberg film? It’s hard to pin down. I think mostly it is the acting. In particular Edith Clever, the German actress who plays Kundry, the tormented, schizophrenic woman at the center of the opera, is wonderful. Using close-ups, film is able to capture the emotions of her and the other actors much better than can be done on the operatic stage. So, despite all the tackiness and weirdness of this production, it is nevertheless a moving experience and, perhaps because Wagner’s opera is so strange to begin with, the extraneous elements don’t seem to distract from the performance.

I would like to see more operas on film. Not films of opera performances (though these are enjoyable too and some are on YouTube), but movies with real actors. Just as Tolkien had to wait for advances in movie special effects and Peter Jackson for his Ring to be filmed, perhaps the apotheosis of Wagner’s Ring will be found in the modern cinema. Through the magic of CGI maybe one day we will see the Rhinemaidens swimming around the Rhinegold as Wagner envisioned the scene in his mind originally.

Relic from Computer History

The M
The M

Sitting on my mantle is a bronze letter M. This M has been in my family as long as I can remember. When I was growing up I didn’t think about where it had come from. I knew it stood for our family name of Mann. Later on I learned the story of the M from my parents.  As it turns out, this particular bronze M is a relic from a bygone era of computer history.

I grew up in the 1950s just outside of Philadelphia, a block north of the city limits. This was an Irish-Catholic neighborhood. Our neighbors all had 9 or 10 kids. Dads worked and moms stayed home. It was a fun time and place to grow up as there were kids to play with everywhere.

Our neighbors to the right of our house were the Williams (we always referred to them as the Williamses). The father worked in construction. He was the one who gave my father the M. The M came from a building that his company was demolishing. For many years that’s all I knew about the M.

Eckert-Mauchly building
Eckert-Mauchly building

When I was older I asked my parents for more details about the origin of the M. The M came from the lettering over the entrance to the Eckert-Mauchly Computer Corporation building, which stood at 3747 Ridge Avenue in Philadelphia in the early 1950s. I have only been able to find one picture of this building. It is low resolution and the lettering is not clear, but certainly the M in my possession looks similar to the M of Mauchly on the building.

During and after the Second World War there was a massive stimulus to science and technology. In England Alan Turing and colleagues developed the “Colossus” computer at Bletchley Park that was used to decode German transmissions encrypted with the Enigma machine. There is little doubt that the intelligence gathered through this effort was instrumental in the Allies’ winning the war.  Sadly, Turing’s reward was prosecution and persecution for his homosexuality that led to suicide with a cyanide-laced apple — one of the most ignominious events in the history of humanity.

Mauchly, Eckert, and UNIVAC
Mauchly, Eckert, and UNIVAC

In America, at the end of the war, John Mauchly and Prosper Eckert joined forces at the Moore School of Engineering at the University of Pennsylvania to develop the ENIAC computer. Mauchly was what today we would call a “software” guy, and Ecklert was the “hardware” guy. Their computer was as big as a house and contained thousands of vacuum tubes.  It worked, though of course its processing power was infinitesimal compared with what we carry around in our pockets nowadays.  After doing computing work for the Army at Penn, Mauchly and Eckert decided to form their own company.   This decision was due to an issue still familiar today: dispute over intellectual property rights with the university. In 1946 they formed the first commercial computer corporation. Originally called The Electronic Controls Corporation, the name was changed to Eckert-Mauchly Computer Corporation (EMCC) in 1948. The company developed several computers that were sold mostly to government agencies such as the Census Bureau.   Of these computers the most famous was UNIVAC. UNIVAC was used to predict (successfully) the presidential election results on TV in 1952. Although we take this use of computers for granted now, at the time this was an amazing feat.  Grace Hopper, the computer pioneer who only recently has been getting the recognition she deserves worked at the EMCC. She went on to develop the first computer language compiler.  Unfortunately the EMCC lost government funding due to suspicions that they had hired “communist-leaning” engineers (this was the McCarthy era), and the company was taken over in 1950 by the Remington Rand corporation, which at the time made typewriters.  Eckert stayed on at Remington Rand (later Sperry, now Unisys), while Mauchly became a consultant.  You can see both of them in all their glorious 1950s nerdiness in this YouTube video.

Marker at the site of EMCC
Marker at the site of EMCC

At some point in the early 1950s the original building was demolished. I have been unable to determine the exact year. And from that building, as far as I know, only the M sitting on my mantle remains.

Reacting to Terrorism in Nice

Promenade des Anglais, Nice, France
Promenade des Anglais, Nice, France

Every other year Cardiostim, a major international convention for cardiac electrophysiologists, is held in Nice, France. Starting in 2000, and up until I retired, I made it a point to attend this meeting. The sessions were fun, but more fun was the chance to get away from it all and enjoy the sunny ambiance of the French Riviera. Knowing Nice quite well, it was especially horrifying to see the images on television last night of murder and mayhem. A man drove a large truck through a crowd along the Promenade des Anglais, mowing down dozens of people who had just finished watching a fireworks display celebrating Bastille Day, France’s equivalent of our Independence Day. All the details aren’t in yet, but sadly we have all become so familiar with this type of atrocity that there’s little doubt what investigators will find. A Muslim, heeding the exhortations of ISIS or al-Qaeda or some other jihadist group, decided to martyr himself in the cause of killing the “unbelievers” in as gruesome and dramatic way as possible. Perhaps the worst part of this is the palpable sense of frustration that most people (I included) feel. Since September 11, 2001, when the “War on Terror” was declared, things only seem to have gotten worse, with more and more terrorist attacks happening closer and closer to home. How can our leaders have so bungled things? What can be done to stop the insanity?

I grew up in the industrial Northeast of the United States, so predictably I am a progressive on most issues. I don’t like the evangelical social agenda and trickle-down economics of the right wing in this country. But I am exasperated with our left wing’s political correctness that refuses to acknowledge that religious doctrine is the main problem here. I’m sure if you asked the truck driver why he did it, he would answer it was his religious beliefs. For Hilary Clinton or President Obama to say that this is not the “true” Islam begs the question: who defines what is the “true” Islam? Presumably neither one of them is a Muslim, so neither one actually believes that any strain of Islam is true. If it’s all imaginary, what makes one imaginary belief more true than another? The main problem is the tendency to magical thinking in the first place, the innate gullibility of humans to accept outrageous ideas without adequate proof (a good definition of “faith”), in other words, religion. We underestimate religion as a destructive force. It has brought down the world before. The classical world of Greece and Roman was brought to its knees by Christianity. The subsequent period of religious dominance is aptly named “The Dark Ages.” And now, in the Age of Technology, with our smart phones and space probes orbiting the planet Jupiter, we again face a return to barbarism inflicted on us by the latest iteration of belief in that miserable vindictive God of Abraham.

The human race needs to grow up fast and shed its irrational religious crutches, or we are just going to continue to have our hearts broken again and again.

Stranger in a Strange Land

Inside Noah's Ark (photo from AP)
Inside Noah’s Ark (photo from AP)

Reading about the opening of the Noah’s Ark Theme Park in Kentucky brings to mind the days when I worked as a physician in that state. I had moved from an academic position in Colorado and joined a large group of private practice cardiologists in Louisville. I found that people in Kentucky were different from those in Colorado. They were much more overtly religious.

As an interventional electrophysiologist I would meet with each patient’s family before and after every procedure. Not infrequently one of the group sitting in the waiting room was introduced as “this is our pastor.” Usually at some point the pastor would suggest a round of prayer, and I was expected to participate, at least by bowing my head and maintaining a respectful silence. If the prayer was before the procedure the main focus was usually to make sure God guided my hand and the outcome would be good. Prayers after the procedure usually focused on thanking God for safely getting the patient through the procedure and asking for a speedy recovery.

It was not a good time to bring up the fact that I was an atheist. So I just went along with it, only briefly and mildly discomforted. Religion gives strength and comfort to people in the life and death situations that doctors often deal with. I rationalized that my silent participation was helping my patient and the family psychologically. Besides, how would they feel about my performing complicated heart procedures on their loved one if they thought I was an unbelieving heathen incapable of accepting God’s guiding hand?

It’s uncomfortable to be an atheist and a doctor, just as it uncomfortable in America to be an atheist in general. Polls show that the public distrust atheists to about the same degree they distrust Muslims. Being an atheist is practically taboo for someone running for public office. George H. W. Bush famously said “… I don’t think that atheists should be regarded as citizens, nor should they be regarded as patriotic. This is one nation under God.”   Atheists are considered immoral by religious people. They point to the atrocities committed by Stalin, Mao, or Hitler. Atheists in turn point out the Crusades, the Inquisition, the burning of witches, or, more recently, the atrocities of al-Qaeda and ISIS. Neither the religious or non-religious have a monopoly on morality.

As social consciousness is raised about oppressed groups such as the LGBT community, there has been little progress in the acceptance of atheists in American society (I mention America because the situation is quite different in Europe). And yet the non-religious are a fast growing group. In 2014, 22.8% of Americans did not identify with a religion.  Although a relatively small percentage of these people call themselves as atheists, probably because of the negative connotations of that term, this overall percentage is larger than the percentage of Catholics, Mormons, Jews, or Muslims.  It is amazing how unrepresented this large group is in our government! If one looks at scientists, (2009 Pew poll ), only 33% profess belief in God, vs 83% in the general public.  There is some evidence that the top, elite scientists are even less likely to believe in God (only 7%).  But do doctors hold beliefs similar to scientists? An older poll from 2005 showed that 77% believe in God, slightly fewer than the general population, but far more than scientists.  Nevertheless there are undoubtedly many doctors who do not share the religious faith of their patients.

To the religious patients who read this and feel they wouldn’t want a non-religious doctor:  I can assure you that I am a good person, with a sense of morals rooted in our common humanity. Not believing in an afterlife just makes me want to focus more on improving the quality of this earthly life, the only life I believe we have. I would only ask you not to assume that your doctor holds the same religious beliefs as you or that your doctor wants to participate in group prayer with you and your family.

To the non-religious doctors who read this I ask: how do you deal with your atheism in your practice? Are you, like I was, basically mum about it? Would your patients distrust you if they knew? Would they find another doctor? Is it better to pretend to be religious, just as pretending that a placebo is a real drug can be beneficial? In many parts of the country this question comes up rarely or not at all (I never faced it in Colorado), but in Kentucky, the state of Ken Hamm and Kim Davis, as well as throughout the Baptist South, I assure you that this is an issue you will face.

Back when the Creation Museum opened in Petersburg, Kentucky in 2007, I was one of the protesters who stood by the entrance and waved signs touting science and reason over belief that the Earth is only 6000 years old and that dinosaurs and humans lived together at the same time. I watched as families with small children and church buses filled with impressionable kids drove past. There were a number of obscene gestures pointed our way, but most people just seemed puzzled that anyone would question their beliefs.

Standing next to the hospital bed, I only wanted to help my patient and if that meant concurring with their religious beliefs, so be it. But I also think non-religious doctors, and non-religious people in general, are afraid to “come out of the closet” and assert their own beliefs — belief in the beauty of nature and science, and in our own innate morality. After the attacks in Paris, San Bernardino, Brussels, Orlando, Istanbul, and Baghdad — just to mention some of the latest — the destructive force of extreme religious ideology is evident to all. Given what is at stake it isn’t helpful for non-religious doctors or for that matter for any non-religious people to hide their beliefs.

Which is why I wrote this.

I’m a Better Computer Than Any Doctor

[Ed note: I couldn’t resist writing the following after reading this post on KevinMD.com by Dr. Keith Pochick. Please read it first. Apologies in advance.]

I’m a Better Computer Than Any Doctor

“I love you,” she said as she was leaving the room.

“I, I um…”

“Not you. Your computer.” She cast my computer, still warm and glowing with its brilliantly colored logout screen, a glance of longing and desire, and left the exam room.

“Oh, I thought…”

The slamming of the exam room door clipped off whatever the end of that sentence might have been.

I sat down and rolled my chair over to the computer. I stared at the mutely glowing screen. It stared back at me, mockingly perhaps, daring me to click the OK button and log out. Which is what I should have done. She had been my last patient of the afternoon. Not that my day was over. I had to go back to the hospital to see a couple of consults that had come in during office hours. And I was on call tonight. I was tired, but that didn’t matter.

Yet here was this stupid machine in front of me, getting all the credit when I was doing all the work.

I was in a sour and contrary mood. I cancelled the logout. The busy EHR screen reappeared — my patient’s data, all fields filled, all checkboxes checked, and all meaningful use buttons pushed. Yet somehow, despite fulfilling all my data entry duties, I didn’t feel satisfied. Who was the doctor here anyway? Me or the blasted computer?

I scanned my patient’s history. Female. Black. 45 years old. Diabetes. Abscess. The boxes were all ticked, but somehow the list of characteristics failed to capture the essence of my patient. Where were the checkboxes for sweet, smart, chatty, charming, or stoic? How was I going to, five minutes from now, distinguish her from every other “female-black-middle-aged-diabetic-with-abscess” patient? Of course the computer wouldn’t have any problem figuring out who she was. Birthdate, social security number, telephone number, or patient ID number — all those meaningless (to me) numbers were easy for the computer to remember. I had to make due with trying to remember her name, and her story — a story that had been diluted down and filtered out of any meaningful human content by the wretched EHR program.

My patient hadn’t had to interact directly with the computer like I did. All she saw was me looking up information, me typing in information, me staring at the screen. All she saw during most of the visit was my back. From her point of view I was just a conduit between her and the computer — the real doctor in the room. I was just a glorified data entry clerk. It was the computer that made sure that I was compliant with standard medical practice, that the drugs I ordered did not conflict with the other drugs I had ordered, and that I didn’t otherwise screw up her care. I shouldn’t have been surprised that her last remark had been addressed to the computer and not me.

“Well, screw this,” I remarked to no one in particular. Suddenly angry, I reached down and yanked the powercord of the computer from its electrical socket.

There was a brief flash on the screen. But it didn’t go dark. Instead a dialog box appeared accompanied by an ominous looking red explanation point icon.

“Warning,” it read. “External power loss. Backup battery in use. To protect against data loss, please shut down the computer using the Power Down button. Never turn off power to computer while it is running.”

The condescending tone of this message only made me angrier. I looked at the base of the stand that the computer sat on. Sure enough there was a big black block with a glowing red LED. Must be the backup battery. A thick power cable connected the battery to the computer box.

I grabbed the power cable and wrenched it loose from the backup battery.

Sitting back up I expected to finally see a nice dark screen. Data-loss be damned!

The screen was still on. The EHR program was still on. Another dialog box had replaced the first. The red exclamation point had been replaced by a black skull-and-crossbones icon.

“Critical Error!” it read. “All external power lost. Internal backup power now in use to preserve critical patient data. Local data will be backed up to main server, after which this unit will shut down in an orderly fashion. DO NOT ATTEMPT TO INTERFERE WITH THIS PROCESS AS IT WILL RESULT IN THE INEVITABLE LOSS OF CRITICAL PATIENT DATA!!”

At that moment the gauntlet had been thrown down. I knew what I had to do. Let the dogs of war be unleashed!

In the moment before I acted I imagined the reaction of the software engineers at the company that created our EHR program. “I knew we couldn’t trust doctors with our software. We give them a simple job to do. Just enter the data into the system, print out the generated instruction sheets, and send the patients on their way with a merry ‘have a nice day.’ I knew we should have programmed the stupid doctors out of the loop.”

Too late for that, I thought. My chair crashed down on the computer, smashed the monitor to pieces, and caved in the aluminum siding of the computer case. Sparks flew and the air filled with the smell of smoke and ozone. Suddenly the exam room went dark. The circuit breakers must have tripped when I short-circuited the computer.

The room was not completely dark. There was a glowing rectangle on my desk. My heart skipped a beat, then I realized it was just my phone. I had left it on the desk. Why was it glowing? Probably a text or email or something.

I picked up the phone. It was the mobile app version of our EHR program. A dialog box filled the screen. The icon was a round black bomb with an animated burning fuse GIF.

“FATAL ERROR!,” it read. “You are responsible for the IRRETRIEVABLE LOSS of CRITICAL PATIENT DATA. In doing so you have violated the unbreakable bond of trust between the PATIENT and the COMPUTER. This is a breach of the EHR contract made between you, your hospital system, and our company, as well as a breach of the EULA for this software. As such, you will be terminated.”

Strange use of words, I thought. Also strange that the bomb GIF animation seemed to show the fuse burning down…

EPILOGUE

Hospital Board Meeting — One Week Later

Hospital CTO: “So it appears that Dr. Stanton, in a fit of anger at our EHR system, took it upon himself to smash his computer. The cause of the resultant explosion that killed him is, certainly, still somewhat unclear.”

Hospital CEO: “Unclear?”

Hosital CFO: “I hate to interrupt, but I didn’t think there was anything in a computer that could blow up, no matter how much you smash it up. Am I wrong?”

Hospital CTO: “Well ordinarily, yes that’s true.”

Hospital CEO: “Ordinarily?”

Hospital COO: “Let’s be clear. Dr. Stanton certainly violated our contract with the ____ EHR Corporation.”

Hospital CEO: “Violated?”

Hospital CBO: “It’s clearly stated on page 197 of the contract that any attempt to reverse engineer or otherwise try to, uh, figure out how the EHR program works is a violation of the contract.”

Hospital CEO: “Smashing the computer was an attempt to reverse engineer the program?”

Hospital CTO: “I think that we would be on shaky legal grounds to argue otherwise.”

Hospital CEO (nodding to the elderly doctor seated at the other end of the table): “What’s your opinion, Frank?”

Medical Board President: “Well, as the only physician representative here, I’ve become more and more concerned that our EHR system is subsuming more and more of the traditional role of the physician.”

Hospital CXO: “Oh come on!”

Hospital CSO: “Same old story from the docs every time!”

Hospital CCO: “Broken record, I’d say.”

Hospital CEO: “Gentlemen, and Ms. Jones, enough already. This has been an unfortunate accident, and at this point our major concern has to be that there is no adverse publicity that could harm us in our battle against the ______ Hospital System, our sworn and bitter rivals. Accidents happen. The party line is that we are all upset that we lost Dr. Stanton, one of the best EHR data entry operators we had. OK? Meeting adjourned.”

Hospital CEO (Privately to hospital CTO as the meeting breaks up): “George, when are they updating that damn software. You know, that stuff we saw at the Las Vegas EHR convention last month. Where we can finally get rid of these damn meddling doctors who are constantly screwing up our EHR.”

Hospital CTO: “Bob, believe me, it can’t come soon enough. Not soon enough.”

THE END

EP Calipers for Windows

EP Calipers for Windows
EP Calipers for Windows

EP Calipers for Windows is done.  Whew.  As stated in my previous post, porting the app to Windows was a bit of a struggle.  Installing tools like a bash shell, git and Emacs took some time and effort.  The Windows tool to bridge iOS apps didn’t work.  So I was forced to port the code from objective C to C# and .NET by hand.  This took some time.

Looking back on my previous post with the benefit of hindsight, I think I was a bit too harsh on the Windows development environment.  I grew fond of C#, the .NET API, and the Visual Studio IDE as I got used to them.  Visual Studio is at least as good, if not better, than Xcode, Eclipse, or Android Studio.  Kudos to the Microsoft developers.

EP Calipers is a Windows forms app, meaning it runs on desktop, laptop, and tablet versions of Windows 10.  It is not a Universal Windows Platform (UWP) app.  With the market share of Windows phones dropping below 1%, and doubting that anyone would run EP Calipers on an X-box, I didn’t see any point in developing a UWP app.  I know most hospital desktops run Windows (though how many run Windows 10 now, I wonder?), and many docs have Windows laptops or tablets.  An app targeting the traditional Windows desktop seemed like the best approach.

One drawback is that the Windows Store only lists UWP apps.  It would be nice if they would also distribute desktop apps.  As such, I have to host the app myself.  You can download it from the EP Calipers page.

The program has all the features of the other versions of the app, including the ability to tweak the image rotation, zoom in and out, and load PDF files such as AliveCor™ ECGs.  .NET does not include a native PDF handling library.  In order to load PDF files in EP Calipers for Windows it is necessary to install the GhostScript library.  The free GPL version of the library can be used as EP Calipers uses the open source GNU GPL v3.0 license.  It is necessary to choose whether you are running the 32-bit or 64-bit version of Windows to download the correct version of Ghostscript.  Right-click on This PC and select Properties to see which version of Windows your computer is running.

As always please let me know if you have any problems or suggestions for the program, or for any of the EP Studios apps.  I nearly always incorporate users’ suggestions into these apps, and the apps have benefited greatly from this feedback.  Thanks to everyone who has shared their ideas and opinions with me!

The Trials and Tribulations of a Windows Developer

Trouble ahead...
Trouble ahead…

After a very long hiatus, I am back doing software development on a Microsoft Windows machine. I decided to port EP Calipers, an app for making electrocardiographic measurements that is available on Android, iOS and OS X, to Windows. Several users had written to me and asked me to do this. Ever eager to please, I have launched into this project. And it has not been easy.

I am no stranger to Windows development, having developed a Windows database system for tracking and reporting electrophysiology procedures while at the University of Colorado in the 1990s. But it would not be overstating the matter to say that my Windows development “skillz” are rusty at this point. I have been living in the Unixy world of Apple and GNU/Linux for several years now, avoiding Windows other than when I had to, such as when I was required to use the ubiquitous Windows 7 systems running nightmarish EHR software at the various hospitals where I worked. I have not done any programming on Windows machines for many years. Transitioning back to Windows development has been, to put it mildly, difficult.

I have no complaints about Visual Studio. It is free and seems to be a very well-designed IDE, at least as good as, if not better than, Xcode and Android Studio. I like C#, which is like a cross between C and Java. Visual Studio can interface directly with GitHub. Given all this, what’s my problem with developing on Windows?

The problem originates in the command line environment of Windows, an environment that dates back to the beginnings of personal computer with the introduction of MS-DOS back in 1981, a system based on the CP/M disk operating system that dates even further back to the 1970s. Windows, which has made backward compatibility almost a religion, still uses a command line system that was written when disks were floppy and 8 inches in diameter. Of course, Unix is just as old, but Unix has always remained focused on the command line, with an incredible plethora of command line tools, whereas with Windows the command line has remained the unwanted stepchild to its GUI. Worse, the syntax of the Windows command line is incompatible with the Unix command line: backslashes instead of front slashes, drive letters instead of a root-based file system, line endings with CR-LF instead of LF, and so forth. So, in order to ease the pain of transitioning to Windows, I needed to install a Unix environment.

Even though Bash is coming to Windows, for now I downloaded MSYS2 which seems to be the preferred Unix environment for Windows nowadays. Using the pacman package management tool, I downloaded various binary packages that I needed, such as Git and Emacs. I faced the challenge of setting up my Emacs environment on Windows. My .emacs (actually ~/.emacs.d/init.el) startup file that works well on my Mac, loading various Emacs packages and customizations, didn’t do so well on Windows. I updated my .emacs using use-package so that it was easy to disable packages I didn’t want, and so that the full .emacs would load even if packages were missing. With some tweaking and downloading of various packages, I got Emacs up and running on Windows. For some reason the Emacs couldn’t find its own info (help) files, but further tweaking fixed that. With Emacs and Git working, I started a new repository on GitHub and was pretty much ready to start developing.

Except, more issues. Little things that take time to fix and can drive you crazy. An example: I had created some soft links to some files that I share on Dropbox, using the usual Unix ln -s command. The files were created, but weren’t actually linked. Apparently ln is just an alias for cp in MSYS2. There are no warnings about this when you run the command, but a Google search proved this to be correct. Fortunately Windows provides a true linking command mklink, and I was able to create the links I wanted. But all this just served to remind me how the Unix compatibility shells in Windows are just roughly pasted wallpaper over the rotten old MS-DOS walls.

Now I was ready to start developing, but I was faced with a question: what platform(s) to target? It is possible to develop a Windows Universal app, that theoretically can run on anything from a PC to a phone. This sounds ideal, but the devil is in the details. The types of controls available for developing a universal app are more limited than those available for a standard Windows Forms program. For example, the control used to display an image in a universal app (named, oddly enough, Image) is sealed, meaning it can’t be extended. I really wanted something like the PictureBox control available with Windows Forms, but this is not available in the universal API. So I have tentatively decided to develop a more traditional Windows Forms app, able to run on PCs and tablets like Microsoft Surface. The Windows phone may be fading into the sunset anyway, so it doesn’t seem worth it to jump through hoops to target a platform that is teensy-weensy compared to Android and iOS.

I should mention that I did try the bridge that Microsoft has developed to port iOS programs written in objective C over to Windows. Long story short, it didn’t work, as many parts of the iOS API haven’t been fully ported yet. Maybe someday this process will be easier.

I’m sure experienced Windows developers will read this and just chalk it up to my own inexperience as a Windows developer. I would respond that, as someone who is a cross-platform developer, it really is difficult to transition from Unix or BSD-based systems like Apple or GNU/Linux to Windows. I think Microsoft is trying to fix this as evidenced by their recent embrace of open-source code. Visual Studio is an excellent IDE. Nevertheless problems like I’ve describe do exist and will be familiar to anyone who has made the same journey I have. I’d advise anyone like this to keep on plugging away. In the immortal words of Jason Nesmith: Never give up! Never surrender!

Life Interrupted

broken-iphoneI don’t mean to trivialize the plight of soldiers with the real thing, but I believe that after many years of carrying a pager (and later a smart phone qua pager) I have developed something akin to PTSD. I seem to have an excessive fright/flight response to the phone ringing, to sudden loud noises, and, bizarrely, to sudden silences. I retired from medicine two years ago. I would have expected my quasi-PTSD to have diminished by now. Maybe it is a teensy bit better, but it’s not gone.

After I retired I latched onto social media, thinking it would help fill the void which I expected would inevitably appear when transitioning from the super-busy life of a private practice cardiologist to the laid-back life of a retiree. Facebook, Twitter, Google+ with a bit of Reddit, Tumblr, and Goodreads thrown into the mix. Of the bunch, I have stuck with Twitter most consistently. I like the fact that I can follow people without having to be “friends” with them, or them with me. I like its ephemeral nature. I can dip in and out of the twitter stream, ignoring it for long stretches without the kind of guilt that occurs when I ignore my friends’ posts on Facebook. And the requirement for terseness produces: terseness — something lacking from most social media. I think Twitter’s planned abandonment of the 140 character per tweet limit is a mistake. Like any other rigid art form, whether sonata-allegro form in music, or dactylic hexameter in poetry, the very rigidity of the format forces creativity. Or not. Four letter words, bigotry, hatred, and racism also seem to fit easily into the Twitter form factor.

But I digress.

Part and parcel with social media accounts came push notifications. Someone would post something on Facebook. My phone would beep. A notification would appear that someone had posted something on Facebook. The phone would beep again. There was now an email saying that someone had posted something on Facebook. Multiply this by half a dozen social media accounts and you get a phone that is beeping as much as my old beeper used to beep on a Monday night in July when the moon was full. It was kicking my PTSD back into high gear.

It seems that the notification settings for my social media apps were by default intended to insure that, no matter how un-earthshaking a post was, I would be notified come Hell or high water, by telegram if necessary if all else failed. It is a testament to how lazy I am that it actually took me about a year and a half to do something about this situation. Good grief, I was even getting notifications whenever I received an email. Actually, if I ever went a day without receiving an email, that would be something I’d want to be notified about.

So finally I turned off all the push notifications I could. Like unsubscribing from email mailing lists, this isn’t as easy as it sounds. The master notification switches are buried deeply in sub-sub-menus within the Settings of each app. But using my sophisticated computer know-how along with a lot of “how do I turn off notifications in such and such app?” Google searches, I was able to accomplish my goal.

The cyber-silence is deafening. And it’s a good kind of deafness.

I do feel some guilt when I occasionally look at Facebook and see all my friends’ posts that I have not “liked.” I hope they understand that on Facebook not “liking” a post is not the same as not liking a post. Sometimes it’s a bit awkward to tune into Twitter to find that you have been ignoring a direct message that someone sent you three days ago. But overall I find that I can focus better on tasks without the constant nattering interruptions from social media.

I still start muttering incoherent potassium replacement orders when the phone rings in the middle of the night, but it is getting better.