What I learned setting up WordPress on cloud.gov

Since around June, I’ve worked on 18F’s cloud.gov product and this week marked my last quarter on the team. We end every quarter with a so-called “innovation and planning” sprint. The product managers do the planning and the team members do the innovating. Innovating in this context means working on parts of the product that will benefit users that aren’t part of the normal business work. I chose to work on improving the WordPress example app we maintain for our users.

If you’re not familiar, cloud.gov is a Platform as a Service built by federal employees and designed around the specific security and regulatory concerns federal agencies need to consider before they’re authorized to launch a web product. No matter how big or small, whether it has open data or national secrets, all information systems operated by the federal government are required to undergo some kind of evaluation against standards published by the National Institute for Standards and Technology (NIST). The result of this process is the granting of what’s called an “Authority to Operate,” or ATO. Basically, an ATO says that the system meets the requirements outlined by NIST and the agency has accepted any risks the system might present. If an agency runs several websites they end up with a lot of repetitive documentation for components that may be the same across each individual app. cloud.gov attempts to solve this problem by standardizing many of those common components so that the agency only has to worry about the parts of the application that serve their mission directly.

It’s a fully open source and based on the Cloud Foundry PaaS project. Compared to how I’ve launched and managed WordPress sites in the past it’s a pretty big shift in how to think about the product. The main shift is finding ways to not rely on the filesystem.

To do that means pushing your uploaded files straight to S3 or another cloud storage service. It also means session information needs to be stored in a cloud service like redis. Most of the example we cribbed from Cloud Foundry’s example WordPress app but due to slight differences in our infrastructure environment, we needed to make a few alterations. The most significant was the recommended plugin for connecting to S3. Cloud Foundry’s example used a more robust AWS plugin but one that required extra effort for us to connect to Amazon’s GovCloud environment. Using that plugin meant installing two plugins from WordPress and then writing and maintaining our own helper plugin to interface with them. Human Made’s plugin was a drop in plugin that already pulled credentials from the environment and was much simpler to configure for cloud.gov.

Getting this up and running reminded me of the work I did at CFPB getting their then-WordPress site — the last major WP site I worked on — into a stable, easily deployable production environment and how much easier that all would have been with cloud.gov at our disposal.

We configured WordPress very similarly to how cloud.gov arranges the pieces. Uploads were synced to S3 and we heavily cached the site — including the local session. The difference is that we spent weeks, maybe even months, writing and maintaining a Fabric project that could install plugins, update the themes, and manage the version of Core we ran in production and then getting our CI server, Jenkins, to automate the deployment of it all. We ended up with a well-functioning DevOps flow for consumerfinance.gov that didn’t require any of us to be physically around whenever someone needed a deployment to happen. All of that was good and important work, don’t get me wrong, we were rightly proud of what we did. The point is that a product like cloud.gov could have saved us a ton of time because a lot of that orchestration is done behind the scenes.

If we’d had a platform like cloud.gov to start from, we could have saved ourselves a lot of that work and focused on other things closer to our mission.

WordPress was the first open source project I ever worked with and the one that taught me how to be a professional developer. cloud.gov has the potential to make government web applications faster, more reliable, and more secure. The two of them together make up a giant stack of open source code. I’m glad I had a chance to bring these passions together.

On trains, health care, and misfiring democracy

When we lived in Hungary we noticed a curious thing about their train network. Our city had about 68,000 people in it yet only had one train per day to the capital city, Budapest. If you couldn’t make the early morning direct train, to take a region train to the much smaller town of Dombovár and transfer to a high speed train the rest of the way. This only added 10 minutes of travel if you caught the right train to Dombovár, but quite a bit of unnecessary hassle.

Today, if you want to get from Kaposvár to Budapest you have three direct trains and five connecting through Dombovár for a total of eight possible trips. Meanwhile, Dombovár has 10 total trips — though some of them are quite long they’re all direct. A fact that would be less strange if there weren’t any direct trains to Budapest at all, but the fact that there are some, and all of them stop in Dombovár, suggests there could be more.

Maybe there’s really more demand for connections to the capital from a town a third the size of Kaposvár, but when I asked my Hungarian co-teacher about it, I was told that Kaposvár used to have many more lines to Budapest but voted for the wrong party in the last election and lost their direct connections. I take most things that particular teach told me with a grain of salt, but assuming it’s true, punishing people because they didn’t vote for the majority seems like an anti pattern for a democratic society.

That’s essentially what the GOP is trying to do to with this most recent health care bill, the so-called Graham-Cassidy Amendment. Numerous analyses of the bill have shown it stands to benefit the states that chose not to expand medicare — giving them more money — at the expense of those that opted for the expansion under the Affordable Care Act. What’s worse is that it appears the leadership — the amendment’s authors especially — are offering deals to exempt Senators whose states will be adversely affected in attempt to sway their vote for the bill. The guise of a policy reason for this is to not over-burden states with low population density:

Beginning on page 95, the bill has a provision that exempts low-density states whose block grants either decrease or stay flat between 2020 and 2026 from the Medicaid per capita cap. Under that scenario, Alaska and Montana would be exempted from the funding cap that applies to all other states during that period.

If only Montana and Alaska are exempted, where are they drawing the line on population density? Let’s look at 13 most sparsely populated states, how they fare, and how they voted in 2016 (source):

  1. Alaska: exempt — R
  2. Wyoming: 2% cut — R
  3. Montana: exempt — R
  4. North Dakota: 8% cut — R
  5. South Dakota: 45% increase — R
  6. New Mexico: 15% cut — D
  7. Idaho: 27% increase — R
  8. Nebraska: 13% cut — R
  9. Nevada: 8% cut — D
  10. Kansas: 61% increase — R
  11. Utah: 30% increase — R
  12. Oregon: 32% cut — D

The line is apparently 10 people per square mile. Except, for some reason, Wyoming. Shutting out those other states with similarly difficult rural healthcare problems. There may be roads to all the towns in these other states but that doesn’t mean their rural communities aren’t hard to reach. They’re in the desert, at elevation, or hundreds of miles from the nearest major city. If the states have to close rural health care facilities because of lost medicare funding, lives are at risk. The population density argument is ruse. It’s not about saving states with disproportionately hard to reach residents, it’s about sparing Republican senators in hard-hit states who are resistant to voting for the amendment.

Democratic governments should govern for the people and by the people. That means our representatives should act in the interest of their constituents for the good of the country — not subject the opposition to vindictive consequences. Furthermore, the 14th Amendment to our Constitution guarantees equal protection under the law. If the law has special provisions for certain sets of people who happen to vote the right way, that’s not equal protection. It’s bad enough this amendment administers benefits so unevenly, to add special protections for senators to get them to vote for it makes it unconstitutional.

Why I’m on the Medicare for All train

2017 has been the year of people visiting us in Colorado. It’s also been the year of health care.

This year we’ve re-established primary care and have been hunting down a strange set of symptoms I’ve been experiencing. None of it is particularly concerning. I don’t have a terminal condition. It’s really just run of the mill going to the doctor stuff. But it is all stuff I probably wouldn’t have done without the great health insurance we get from my employer. We have pretty low premiums in the grand scheme of things and we only pay for part of it. We had the option of choosing a plan with a higher premium but a lower deductible and we hit our out of pocket limit pretty quickly. Since I’m a federal employee, we have a flexible spending account (FSA) we pay into pre-tax which reimburses us for co-insurance, copays, and other fees we still have to pay despite the fact we pay a damn premium every month.

We’re fortunate to be so well taken care of but not everybody is. My term is up at the end of the year and when I research potential future employers, I notice few of them offer as good of health plans. Many only offer a high deductible plan. Many of those plans don’t have out of state coverage, and prohibitive out of network costs. People who aren’t fortunate enough to have a full time job don’t get the privilege of sharing the costs of their healthcare with their employer. More still don’t get access to cost-avoiding tactics like FSAs or Health Savings Accounts (HSAs).

When we had worse health coverage, we coped with the higher costs by avoiding going to the doctor. That doesn’t make any sense!

Employers only offering shitty plans to their employees, and paying a diminishing share of them, is a problem older than the Affordable Care Act. the ACA only made them a little better. Before, even good employer based plans would still leave some basic, preventative measures uncovered or force you to pay an outsized co-insurance or copay for them. If you wanted a flu shot, depression screening, immunizations and vaccines, your insurance company could charge you a copay or force you to share some of the cost.

Health insurance is stupid. You pay hundreds of dollars each month only to have to cough up even more when you go to the doctor. At least with the ACA these basic things that keep people healthy are covered. But it’s still stupid. If you’re on a high deductible plan and need to see a cardiologist about chest pain, you might be on the hook for the whole visit despite the fact you’re paying your premium every month. Let’s say you’re pregnant and think you miscarried, you might have to get blood drawn once every 48 hours until your HCG hormone goes back to 0. Maybe your kid got a concussion playing high school football and needs to see a neurologist. Any myriad of unexpected health problems can happen to even the healthiest people and if it happens to you, your family could be on the hook for up to $13,000! That’s assuming every doctor, hospital, or urgent care is within your health provider’s network and isn’t dropped from that network while you’re still a patient.

Maybe you have an FSA or a health savings account to help you cover these costs. Maybe! But the point is you shouldn’t have to guess about how much of your paycheck you can sequester away every month just to pay your health bills. You shouldn’t have to worry about whether you can afford to take your kid to the neurologist, or whether you can afford to verify you miscarried.

The insane hoops I’ve seen people jump through to get the care that need has led me to only one conclusion: Medicare for all. It’s the only solution I’ve seen that provides coverage for our most vulnerable populations and keeps costs contained. There are plenty of things Medicare doesn’t cover that people will still buy insurance to cover (elective surgeries for example, aren’t covered). Taxes might have to go up to cover it but the people most affected by that tax rise aren’t the people deciding which is preferable going broke going to the doctor or staying sick and getting sicker.

Every doctor with a license to practice medicine should be in network and every person on American soil should be able to access them without going broke. Medicare for All is the best way to get there.

Switching back to WordPress

I’ve been writing this blog as a Jekyll for quite some time now. There’s a lot I really do love about the idea of static sites, but also a lot I’ve cooled on. One of those things was the writing experience.

My first encounter with Jekyll was at CFPB and I briefly switched to Octopress while I was learning how it worked. At 18F, I decided it’d be prudent to eat my own dog food, as it were, and host my blog the same way we hosted the site I was managing, 18f.gsa.gov. It’s been three years on Jekyll now and while I love a lot about Jekyll and the paradigm of static sites, I’ve grown tied of the work I have to do just to publish a new post. I’ve written about this before and won’t repeat myself but I was hopeful that there would be a product, open source or otherwise, that would give all the advantages of static hosting with a writing and publishing experience that was just as simple and powerful. The fact is, there’s not.

And it turns out easy publishing on a trustable platform is all I really want.

Getting here meant I had to write a Jekyll plugin and a page to generate a WordPress eXtended RSS (WRX) file out of the old Jekyll site. Most of the work was done in the liquid page, except for custom fields which were filled in with the plugin. The only problem I’ve noticed so far was about 22 pages with no title that were in the WRX file — these were Jekyll paginator pages and the WRX file itself also generated as HTML 🤷‍♂️.