In San Francisco

I’m in San Francisco for the day. Last night I had a great time with danlyke of Flutterby fame. Since right now is the the Advent Fast, he took me to Café Gratitude, a raw Vegan restaurant where every one of their dishes is an affirmation. I couldn’t help but giggle when they handed me my coconut curry soup as they said the mantra “You are Thankful!” I would imagine that The Secret has done better here than in Lancaster County. “But, Mark,” I can hear you not asking, “What the heck are you doing in San Francisco?” About a month ago, a non-profit here contacted me about a position they’re trying to fill. They need an open-source person to be, essentially, their community liaison for code contributions to their open source project. At the time, I was still working for IntraHealth, so I told them I wasn’t interested. But the following Monday, I found out I was not going to be working at IntraHealth any longer. A new (but smaller) round of funding came through and they just didn’t have room for me in the budget any more. With this new-found freedom from obligations, I called the HR person back and told him, “Guess what? I am interested after all!” In the meantime, this has been one of the more productive periods of transition I’ve ever had. Friends of mine who freelance have tossed a couple of gigs my way and I’ve spent a little more time with my kids. Only once have I glimpsed into abyss of fear and self-doubt that the recently jobless can end up in — the rest of the time I’ve been excited about the opportunities. So, here I am in a San Francisco hotel room early in the morning. My body is still on Eastern time and I can hear the city slowly coming to life around me. I plan on scoping out Berkeley this morning and then, after my interview (during which, in my fantasy, they offer me the job on the spot) I’ll go see how far CalTrain will take me.

Charting Library Shootout

Recently, I had to compare several charting toolkits. Amongst the charting toolkits out there, I found three different ones that suited my needs, so I put them through their paces. They were: JpGraph, OpenFlashChart and RaphealJS. Just to be clear why I left some toolkits out, here is a list of the requirements I used. The toolkit we end up using must be:

  • freely redistributable. This will be incorporated into the GPLed iHRIS Suite so a proprietary license means we can’t ship charting with the software.
  • look good. Who wants ugly charts?
  • work on Internet Explorer 6 and above. There are a few toolkits out there that require <canvas< support and at least one does not support excanvas.
  • currently maintained. Many nice charting projects haven’t been touched in two or more years. I’m willing to fix bugs if I need to, but I’d like to know that I’m not alone.

All three of the charting libraries that I tried fit this criteria. After putting the three toolkits through their paces (source included), which one did we ultimately choose? Right now, we’re going with RaphaelJS — we were using a Flash-based toolkit before and wanted to rid ourselves of that dependency, and, since our primary server target is Ubuntu, JpGraph’s lack of anti-aliasing with Ubuntu’s PHP GD library knocked it out. I’ll try to post an update if I come across anything new.

Patch and directions to build 64bit Google Gears

Ok, it’s been a couple of weeks since I posted the 64bit Linux installer for Google Gears. And some people have asked for the diff or a smaller installer. Fair enough. There they are. The directions for compiling your own are simple enough. Here is a cut-n-paste list of directions:

svn co gears  cd gears  curl | patch -p0  chmod +x third_party/gecko_1.9/linux/gecko_sdk/bin/xpidl  cd gears  make

If you look at the diff, you’ll see there is nothing particularly 64bit-ish about it. Its mostly just fixing warnings and declarations. So the real question I have is: Why doesn’t Google offer 64bit builds? (Now, if only I could come up with an Ubuntu package for this…)

The Universal Health Coverage Bogeyman

Universal Health Coverage is coming! Universal Health Coverage is coming! Get out your guns! There is an enormous amount of fear mongering going on around the issue of Universal Health Coverage (UHC). From the UHC advocates, we hear about scary medical bankruptcies. From the UHC opponents, we hear that this is just a way for the government to run our lives. In fact, that last article was sent to me by an old college friend. “Is this the health care bill you want?” she asked. (Peter Fleckenstein (aka “the fleckman”), the creator of this “analysis”, posted a complete copy on his blog.) Well, if its as bad as the tweet-filled weblog post makes it out to be, no, I don’t want it. A couple of points.

  1. Mr. Fleckenstein and many reactionaries harbor a deep suspicion of bogeymen such as ACORN and illegal aliens. These bogeyman don’t scare me. I will totally ignore those sections of the criticism. I don’t care if the government supplies health care for members of ACORN. And even illegal aliens are people who sometimes need health care. Which part of “Universal” did you not understand?
  2. The bill being referred to, HR 3200 — “America’s Affordable Health Choices Act of 2009” — is over 1000 pages long. I don’t have time or interest to read every page. What I do have time to do is fact-check statements about the bill that I find alarming. Good thing “the fleckman” provides direct pointers.
  3. This is the House bill. The Senate bills up for consideration aren’t finished. One doesn’t include a government-run plan — something that seems to be the biggest sticking point for many of the article’s complaints. I am personally more comfortable with the “co-op” idea of the Senate Finance Committee’s bill — it sounds similar to Germany’s version of UHC.

With that in mind, lets look at a few claims:

  1. There will be a government committee that decides what treatments or benefits you get. (Sec. 123) The actual text says: “Committee to recommend covered benefits and essential, enhanced, and premium plans.” There is a big difference between a recommendation and a decision. As far as I can tell, no one is going to stop you from paying for extra treatment if you want it.
  2. Your health care is rationed!!! (p 29 ln. 4-16) The actual text referenced here has nothing to do with rationing health care, but with how co-payments on the public option will be adjusted.
  3. Government will have “real-time” access to individual finances. (sec 163) This is a modification of the onerous HIPAA regulations. The addendum the bill puts in does, indeed talk about “[enabling] the real-time (or near real-time) determination of an individual’s financial responsibility”. But again, this isn’t mandating access to your individual finances. Instead, it seems to be saying that they want universal standards for determining a co-pay or your liability for a specific treatment or office visit instead of the current system — which involves multiple rounds to the insurance company.
  4. Government will have direct access to bank accounts. (sec 163) The actual text here: “enable electronic funds transfers [for] … health care payment and remittance advice”. This isn’t government access — this is the access for the health care provider. And enable processing isn’t the same as forcing individuals to surrender information.
  5. Government will tell doctors how much they can charge. (sec 225) Just like they set payment levels for Medicare and Medicaid. Doctors are not obligated to accept the government plan. If you want health care from a doctor who doesn’t accept the government option coverage, then you can get it, provided you can find a way to pay for it.
  6. Employers must enroll employees into the public plan. (sec 312(a)) This section is talking about how an employer can meet the government requirements. One of the requirements is “automatic enrollment”. Part (c)(2) of this section explicitly states that an employee may make “an affirmative election to opt out”. And the plan doesn’t have to be the government option. If the employer offers adequate private insurance, then they meet the criteria.
  7. States give up some of their State Sovereignty. The horse is long ago out of the barn. When my friend and I were in college in New Orleans, there were news stories about a drinking age being imposed on the Quarter. Previously, it was illegal to buy alcohol if you were under 18, but not to sell it to anyone under 21. This makes an incredibly hard law to enforce. The federal government, in order to bring Louisiana into compliance with the rest of the country’s drinking laws, threatened to withhold federal money for roads if the laws weren’t changed. You can argue that this infringes on a state’s sovereignty — but no one is forcing the state to take the money. If it wants it, it has to change. If it is willing to fund its own road system entirely, it can leave the laws as is. This is a pattern the federal government has repeatedly followed when dispensing federal money. It has withstood Supreme Court challenges on the basis that it infringes a state’s sovereignty. But the state, if it really wants to be sovereign, can opt-out of the federal money.

The fear-mongering continues, but I’ve got to get to bed. The pattern I see here is that Mr. Fleckenstein is skimming (understandably) the 1000+ pages of regulation looking for alarming phrases and not bothering with the context. He ignores other parts (like the religious conscience exception on p170) completely.

Server setup: forwarding only local email

Often, when setting up email on a server, you want to receive email from local processes (cron jobs, etc) but don’t want email accounts to be abused by spammers. For example, on Ubuntu systems you might have a cron job that runs as www-data that you want to get mail from, but you don’t want spammers sending email to I just had a client ask me to fix this problem for them, so I thought I’d share the solution I came up with. Typically, the /etc/aliases file directs mail from all these extra accounts (like www-data, nobody, etc) to root and you’re expected to set up an forwarder for root (e.g. Instead of directing mail for all these accounts to root, I created a locked out account. The only purpose of this account is to verify that only locally generated email is sent on to the end recipient. No more Viagra spam for! To set up the locked out account:

$ sudo /usr/sbin/useradd localmail  $ sudo /usr/sbin/usermod -L -s /dev/null localmail  $ echo '"|exec /usr/bin/procmail"' | sudo -u localmail tee ~localmail/.forward  $ echo <<EOF | sudo -u localmail tee ~localmail/.procmailrc  # replace with whatever domain locally generated email has  :0:  * !^Return-Path: .*  /dev/null    :0:  !root  EOF

This works with postfix, but I haven’t tried other MTAs.

Bits and pieces from RAGBRAI

Last week was my first RAGBRAI ever. (Poor quality camera-phone RAGBRAI pictures here. They’re only meant to covey concepts, not realistically portray anything.) RAGBRAI and I are the same age and its a real shame that this is the first time I’ve been. We’ve both been around since 1973. Some bits and pieces from my first RAGBRAI, recorded here without too much organization:

  • The first night we got there we found a county-fair-like atmosphere in the small town’s town square. It was as if the whole town had come out, but the town was made up of 10,000 cyclists and their families and, instead of staying in one place, the county fair covered 70 miles of roadside.
  • It rained the first night. Thunder and lightening woke up Jim (my cycling buddy) at 3AM. We both had trouble getting through the night. But we were both up with the tent packed and on the road by 7AM.
  • The first day of my ride (Thursday) included an optional 27 mile loop to bring the day up to a full century (100mi). Jim and I split up and I took the century route. I quickly met a 60 year old contractor and we spent those 27 miles talking about work, family, death, and changing times. It was a great ride. We split up when I decided to take a ride in one of the ultralights that a group of pilots had set up beside the road.
  • I didn’t get my “century patch”. This is kind of disappointing since I learned later that everyone who rode the century route could get the patch. Ride enough RAGBRAI centuries and you get to plaster a jersey with them.
  • By the time I arrived at that night’s campsite, Jim had been there for two hours and had the tent set up. We had a choice of the primitive shower my team (the Road Hogs) put together or a $5 group shower. I was already soaked by the rain that came down during the last half hour of my ride. I chose the makeshift shower instead of paying $5.
  • Pie! Practically every small (and medium) church along the route was selling pie or some sort of food. Pie is an essential part of the mythos of RAGBRAI — so much so that this year’s RAGBRAI poster depicted the ride stages using a pie chart — made up of pictures of a real pie being consumed.
  • As a result of all the pie, as well as home-made ice cream and other heavy food, I actually managed to weigh in a couple pounds heavier at the end of the race. This, despite the 4000+ calories that the ride took each day.
  • The thousands of cyclists riding 450 miles across Iowa were not the insane ones. Well, not the *most* insane ones. There was a woman attempting to run the 70+ mile route each day. I heard that she was admitted to the hospital at least once, possibly twice.
  • The age and size of cyclists ran the gamut. Let no one say they’re too young, too old, or too fat to ride RAGBRAI. I saw men on recumbent who were easily 350lbs+. Fathers and mothers brought their kids on third wheels or tandems. I even saw one young couple on a tandem pulling their 2 year old in a bike trailer. Most of the men on my team were retirement age or older. One father from St. Louis told me that the team he was with was made up of a few different families with at least three different 11 year olds.
  • Jim and I fell into a rhythm: we would ride together in the morning and then make our way to that night’s camp site separately. The third and last day, only 40miles, we split up after grabbing coffee (“Organic, Fair Trade!” the proprietor would repeat at every sale). Feeling relatively awake, I started pumping the pedals. I spent the last 20 miles that day chasing a cyclist from the Air Force cycling team. We blew past everyone at 23mph. In the end, he outlasted me, but it was a blast.
  • Some people treat this rolling town as a big party and stop in every town along the way to drink. Don’t try this at home. It is only possible because of the sheer number of cyclists, the state police, and Ambulance drivers every few miles along the route. The partiers don’t generally arrive until sunset — about 9pm at night.

I plan on doing the entire RAGBRAI next year. I’d love to get a tandem so I could take two of my kids for at least part of the day. Highly recommended, even if you aren’t in that fit or are just a casual cyclist. The chance encounters were a great way to restore my faith in humanity. The party atmosphere and conviviality made the time on the road a ton of fun.

Emacs Hack: mediawiki.el

I’ve gotten some feedback on the mediawiki mode I’ve been working on.  So I’m releasing a new version.  Some highlights:

  • Now works with HTTP Auth (I’ll write a seperate post on how Emacs handles credentials for HTTP Authentication).
  • Introduced tab-completion of sites.  If you have multiple MW sites set up that you work on, this makes switching between sites super-easy.
  • Started working on making it more XEmacs compatible.  As far as I can tell, XEmacs lacks the Unicode support that GNU Emacs has.  The released version of XEmacs also lacks the POSIX character classes for regular expressions and ships with a very out-dated version of url.el.  All these combine to make it very difficult.  But do-able.  I’m surprised there are still XEmacs users, but if it doesn’t cause me too much pain, I’ll help them out.
  • Misc other clean up (including making the url.el wrappers much better).

Google Gears for 64bit Linux Firefox

Since I run 64bit Ubuntu, I couldn’t use use Google Gears. Which was annoying. The Google Gears site says 64bit OSes are not supported. But it is open source. So I grabbed the source code, tweaked a few things here and there and I now have Google Gears up and running on my 64bit OS. It hasn’t crashed and burned yet, but I haven’t really tested it heavily yet, either (suggestions welcome). Anyway, here’s the XPI to install it. I’ll post the source soon. Or maybe just the diffs to the Google Gears list.

Review: Genome

The crude distinction between genes as implacable programmers of a Calvinist predestination and the environment as the home of liberal free will is a fallacy.

This sentence is the sum of what Matt Ridley does so well in Genome. He takes conventional wisdom and turns it on its head. He doesn’t shirk from the most dangerous ideas that can accompany genetic determinism — eugenics, selecting for ability — but he also wraps up his book with a very good argument that free will and determinism are compatible. Yes, you may have a gene that makes it means that likely develop Alzheimers. But that doesn’t have to run your life. And then he flips it around: isn’t it better for you — including your genes — to determine what you become than for someone else — the state, your peers, or even your parents — to proscribe a path for you? I have my own Libertarian tendencies (strongly tempered by communitarian Orthodox Christianity), so I find his reasoning pretty compelling. Matt Ridley is a special kind of journalistic genius. He can wade through volumes of technical arcana and create something like Genome, a very readable, very enjoyable, book. If you want an overview of what we know about genetics (or what we knew 10 years ago, at least) this is a great place to start. But, the book is over 10 years old. A lot has happened. He hints as much when he talks about developments in genetics that happened in the decade leading up to the publication of the book — sometimes dramatic developments. The story wasn’t finished when he wrote it and I am starting to look around for something more up-to-date than this. Like any good author, he has captured me and left me wanting more.