I’ve had a couple people reach out to me over the past couple weeks, asking about my health, so I thought I’d do another quick update on how that’s going: everything’s fine. 8^)

I’m completely recovered from the surgery, and pretty much settled back into “normal life”, whatever that is. I do have one last follow-up test this week, an IV pyelogram, that’s going to show how much function remains in the half-kidney they left behind. The test itself shouldn’t be any problem, but it requires a day of fasting and ‘bowel prep’ the day before. Not really looking forward to that part of the exercise.

Because 2015 is apparently dead set on being the year of Much Drama, we’ve also been forced into moving a year earlier than we had been hoping for. Our plan had been to sell our Maryland house this fall when the lease was up, then buy a house here in Salem next summer. Our current landlords, however, had other plans: they too wanted to sell their house this fall. This presented us with an issue, being as that’s the house we’ve been renting (and we weren’t really interested in buying it, for a variety of reasons, much to the disappointment of the current landlords).

We threw things into high gear (actually, mostly Laura threw things into high gear, honestly), located a house here, and got the incredibly slow-moving process of house buying kicked off. We sign final loan documents and other stuff tomorrow, then close of escrow and possession is scheduled for Tuesday. Pretty excited at the sweet 1936 former farmhouse we found. We plan to be all moved in before October 1 — and then the years of “projects” start. (Project #1: Getting the detached workshop renovated into my office space.)

We were also able to list our house in Maryland. It sold pretty quickly (although not without its own share of petty drama which isn’t even worth going into). That closing is scheduled for this Friday. Not having that house anymore is really going to feel like the “East Coast” chapter of our life is fully completed. I guess we’re full-on Oregonian now.

Overall, things are incredibly busy and pretty good. Hope you’re the same. <3

(For context, it will probably be useful to read Code blue and Code blue, part two. Otherwise, none of this is going to make a whole lot of sense. Also, unless you’re a Perl programmer, you can probably safely skip this one…)

I decided to go ahead and reply publicly, since this information may also be useful to other people. Also, I’ve submitted a talk proposal for the Pittsburgh Perl Workshop based on the idea of letting people who aren’t super connected to the community know about some of the improvements of the last several years (because I think you’re far from alone in your “WTF is all this shit anyway” reaction), and writing this reply is sort of research for that.

Some parts of your rant I’m just going to bypass — in particular, the stuff about deep dependency chains. This is something that the people maintaining these important distributions think about quite a lot (or at least the ones I hang out with do). I think the trade-offs they’re considering and the trade-offs you’re considering are not very well aligned — you’re looking at installation difficulties; they’re looking at not having to maintain as much code, or at organizing code across modules to maximize code reuse. For better or worse, deep dependency chains and the “I had to install half of CPAN” problem is just a fact of life in the Perl world these days. (IME, it’s generally a fact of life for any higher-level language, but that’s a different topic entirely.)

I know you said that saying “use a package manager” was missing the point of your rant, but … geez, use a package manager already. It will make your life better. You want to use cpanm, which you get by installing App::cpanminus. (The ‘minus’ in the name is because it has a much smaller set of ambitions than the native cpan client, and especially the other alternative client, CPAN-Plus.) One of the nicest things about cpanm is how much less verbose it is than cpan. For your particular use case, I think if you used cpanm and captured the output into a log file, you’d be able to easily edit that log file down into the set of notes you want showing exact versions of what got installed (the output is regular enough that you could even automate that step). Here’s part of the output of running cpanm LWP:

% cpanm LWP
--> Working on LWP
Fetching ... OK
Configuring libwww-perl-6.13 ... OK
==> Found dependencies: HTTP::Date, File::Listing, Encode::Locale, HTTP::Daemon, HTTP::Cookies, WWW::RobotRules, HTTP::Request, Net::HTTP, HTML::Entities, HTTP::Response, LWP::MediaTypes, URI, URI::Escape, HTTP::Request::Common, HTTP::Status, HTTP::Negotiate, HTML::HeadParser
--> Working on HTTP::Date
Fetching ... OK
Configuring HTTP-Date-6.02 ... OK
Building and testing HTTP-Date-6.02 ... OK
Successfully installed HTTP-Date-6.02
--> Working on File::Listing
Fetching ... OK
Configuring File-Listing-6.04 ... OK
Building and testing File-Listing-6.04 ... OK
Successfully installed File-Listing-6.04
--> Working on Encode::Locale
Fetching ... OK
Configuring Encode-Locale-1.05 ... OK
Building and testing Encode-Locale-1.05 ... OK
Successfully installed Encode-Locale-1.05
--> Working on HTTP::Daemon
Fetching ... OK
Configuring HTTP-Daemon-6.01 ... OK
==> Found dependencies: HTTP::Request, HTTP::Status, HTTP::Response, LWP::MediaTypes
--> Working on HTTP::Request
Fetching ... OK
Configuring HTTP-Message-6.10 ... OK
==> Found dependencies: LWP::MediaTypes, URI, IO::HTML

So you see what depends on what. You see what versions of what gets installed. You don’t have to download everything by hand, extract it, and run the build yourself. This will make your life better.

Now, to respond to your list of “things I don’t know”…

  • MetaCPAN is an alternative interface to CPAN. It uses the exact same underlying data as, but I think it looks nicer, and it provides a lot of additional information in a much more accessible fashion. Particularly useful are seeing how many people have ‘++’-ed a module (which is akin to starring a Github repo or faving a tweet), which gives you some idea about the consensus around module quality, which can be useful when you’re trying to decide between two libraries that do the same thing. MetaCPAN also links to bug trackers, code repos, and shows upstream and downstream dependencies for a module. It also happens to be where the ‘!cpan’ DuckDuckGo search shortcut goes to, which is what I use for searching CPAN these days.
  • I recommended Cpanel::JSON::XS as an alternative to JSON::XS. I did this before I realized you weren’t using JSON::XS directly yourself. Given that you’re only getting it as a dependency of JSON::Util, you don’t have a lot of alternatives. I am sort of interested in what you’re using out of JSON::Util, because, to me, the latter looks like a very thin wrapper around JSON::XS and IO::All — basically, almost exactly the sort of thing you ranted about earlier, that would be trivial to do yourself.
  • The module is called ‘Cpanel::JSON::XS’ because it is a fork of ‘JSON::XS’ that was created by somebody working for Cpanel after they decided that the module was too important for their business for them to rely on the asshole maintainer of JSON::XS. It was something that was originally only intended for use inside Cpanel (hence the name), but ended up getting released to the public because other people were considering a public fork (because, again, asshole maintainer). So, basically, the name is an unfortunate accident of history.
  • All JSON::XS does is serialize Perl data structures into JSON, and deserialize JSON back into Perl data structures. That’s it. The ‘XS’ in the name is because it’s written using something called ‘XS’, which is a way of calling C code from Perl. What that really means is, it’s fast — much faster than JSON::PP (where ‘PP’ stands for ‘pure Perl’, which means you can build it without a C compiler, because it’s just Perl).
  • All the JSON::* modules have exactly the same API (and there’s even a module that will use the fast XS one if possible and the slow PP one if not, or error out if neither of them are available), so you could update JSON::Util to use Cpanel::JSON::XS and everything would — well, should — still work just fine. That said, as I said above, I bet you could trivially replace JSON::Util with a couple of your own lines of code that use Cpanel::JSON::XS. Alternatively, I found the JSON::Util Github repo, so you could send in a patch switching that over to a different JSON library. (I may just do that myself…) (Update: I did it myself.)

It may surprise you that I agree with you about treating CPAN modules as black boxes. I pretty much treat them as black boxes too — with one major difference, which is that when something in one of them breaks, then I open up the box and try to figure out what went wrong, and either send in a patch or at least a bug report. And, yes, I do know quite a lot of these people, to one degree or another, and I assure you: they’re not above your pay grade. They are, generally, just like you: people who are trying to solve problems. Some of them are raging assholes, but most of them are reasonably nice and do appreciate hearing about things that are broken or poorly documented or whatever — just like you appreciate hearing about those things from your users.

My reasons for doing this have less to do with knowing the authors of the code, and more out of a sense of obligation. Someone (often, many someones) have given me the gift of their labor, in the form of code I don’t have to write or maintain. Letting them know when it doesn’t work, and trying to fix it if I can, or at least wrap the failure up in the form of a bug report or maybe a failing automated test case, seems like the least I can do to return the favor.

Finally, as far as HTTP::FuckingSimple, you may want to investigate HTTP::Tiny or even HTTP::Thin::UserAgent (although mind the alpha API warnings on that last one).

Hopefully this was at least somewhat helpful for you. Sorry it took me so long to respond.

Well, I made it. (I assume if you’re reading this, you’re probably also interested enough to be following along with the Twitter updates, so this isn’t a huge surprise…) I figured I’d re-cap what happened on the day of the surgery, from my first-hand perspective.

Last Wednesday, as scheduled, we got to the hospital around 10:45am. We checked in with registration, and got handed something that looked very much like the buzzer you get when waiting for a table at a chain restaurant. After a ten-minute eternity of sitting around, the intake nurse came and took Laura and I back. I was given a hospital gown and a pair of ‘safety socks’ to change into, and a bag to throw everything else into. I got changed, and pretty quickly after that, we had a succession of different nurses come through the room, each doing their own specialized task. The first one was responsible for a task I had not anticipated: shaving the right side of my body.

Shoulders to hips, they shaved my right side. I didn't think I was all that hairy ... until I saw what was left behind!

The other nurses had more stereotypical responsibilities: asking various questions, placing a couple of IVs in my left hand and lower arm, and so on. Once that was done, we went back to waiting. After a bit, they let my parents come back to the prep room too, and then … there were twice as many people sitting around waiting.

At this point, we had what could have been a total catastrophe: the bus depot called to tell us Ms12’s bus was waiting at our house and where was somebody to get her off the bus? It was her last day of school, and somehow got converted into a half-day without anybody giving us any sort of notification at all. Fortunately, since my parents were there, they were able to rush home to take care of her.

We eventually found out that previous surgeries were taking a little longer than expected, so we were waiting both for an available operating room and for my urologist and anesthesiologist to finish up their first surgeries of the day. Nothing quite makes time slow down like waiting to go under the knife, lemme tell you.

My urologist came by, and marked my right side with a Sharpie. I joked with her that I had thought about marking my left side with a big red ‘NO’ or an ‘X’, but then I started to worry that a big red ‘X’ would be the symbol they would use for the correct site. A little bit after she was on her way, Dr. Chen, the anesthesiologist stopped by and we had a quick chat. And not too long after that, we were off to the races.

I remember being wheeled into the operating room, and I distinctly remember the sense of surprise I had at how the room felt. I was expecting something sterile and vaguely high tech-ish. Instead, it felt more like the very clean woodshop of somebody who is extremely serious about their tools and craft. (I liked the actual room better than the one I expected to be in.) I also remember that I chatted with the people in the room a little. I remember sitting up so that they could place an epidural needle in my spine … and that’s about where things start to get fuzzy.

The next thing I remember is waking up in the recovery room. Sadly, my memory doesn’t include any particularly silly things I said while waking up, and none of the recovery room staff could remember specifics of what I had said. I laid in the recovery bay for a while, mostly out of it, and then the staff began the prep work to move me to my actual hospital room. At that point, I said, “I’m either getting hungry, or I’m nauseous.” - followed, a few minutes later, by, “Nope, I’m for sure nauseous.” That slowed the move down a bit, as they pumped me full of some anti-nausea drugs and figured out that my blood pressure was super low. Eventually that recovered, and I got wheeled over to my room.

Surprisingly, I got a private room - I hadn’t really thought about this at all in advance, but I’d been assuming I’d be sharing a room with somebody. It wasn’t anything I was going to complain about, that’s for sure. I was happy to be able to see Laura again. I think I slept a little more at that point. I was pretty determined to get out of bed the same day, so after Dr. Ganeshappa came by and okayed it, I gave it a shot. I got as far as sitting up, but then had another wave of light-headedness and nausea, and decided that maybe the next day was good enough for getting up. Sleep happened soon after that.

Five not-terribly-exciting days of hospital stay followed. I moved from only ice chips, to clear liquids, to a full diet. I worked up to progressively longer and longer walks. I took lots of naps, was given lots of drugs, and generally tried to be good natured about the whole thing, even when somebody was waking me up at 0300 to stick a needle in me.

We got the pathology report while I was still in the hospital, and I’m happy to say that this should be the end of this particular adventure: the mass they removed was a cancerous tumor, but it had not yet begun to spread. Having it removed was the only necessary treatment. I will be having yearly imaging follow-ups of the abdomen for the rest of my life, just to confirm something else hasn’t sprung up, but that’s a pretty small burden to bear.

I’ve been home for a little bit more than 48 hours now. Trying to settle back into a routine, hampered by the limitations of what my body still can’t do. Not quite stir-crazy yet, but I am getting to the point where I’m wishing I could push the “recovery montage” button and compress the next several weeks down into a 45 second burst of still shots and a driven soundtrack.

Please feel free to watch my Fitbit step count and yell at me on Twitter or Facebook or email if you don’t see a nice gradual increase in total steps there from day to day. I’ve got one more post-op follow-up appointment on Friday, to get the staples removed from the incision, and after that, I’m hoping the pace of the “back to normal” movement around here just continues to increase and we settle into a nice, quiet, drama-free summer.

Thanks again to everybody that helped out with this — Laura, my parents for coming out to help, all the doctors and nurses and other hospital staff, and last-but-not-least, all y’all, my Internet pals. Being able to share things and chat with people on Twitter and Facebook from my hospital bed was really an amazing thing, I think without that outlet, that stage of the process would have seemed so much worse. <3

The past few weeks have, most of the time, felt like the initial part of a rollercoaster ride — a rollercoaster you’ve never ridden before. Just sitting there, strapped down, no real control or ability to alter what’s going to happen, not really sure what is going to happen, just waiting, anticipating, as the car makes that long slow climb up to the top of the first drop.

Not really my favorite part of the ride.

Fortunately(?), that’s about over. After I post this, I’m going to go take my shower with the special anti-bacterial soap. I’m going to pack my overnight bag for the hospital. And then I’m going to fidget some more until it’s finally time to leave.

I report to the hospital at 10:45am PT. Last I heard, the operating room was booked from noon until 4pm (and here’s hoping they won’t use it for that whole time!) Not sure what time I might be expected to wake back up, but I would bet it’ll probably be early evening, Pacific Time. (If you’re curious about those times in your time zone, see this link which my crazy internet friends put together.)

Not sure when I’ll be back on the air, but I’m going to pass my phone over to Laura so she can tweet out any updates from my account. So watch @genehack for those updates, or maybe even her account, @mrsgenehack if you want to make sure you don’t miss anything.

I do want to thank everybody that was at YAPC::NA this week for all the support and distraction provided by interacting over Twitter and IRC. I didn’t end up watching that many talks but I’m looking forward to you all providing many distractions during my recovery process.

Special thanks to those of you that bought shirts, and extra special thanks to Stevan Little, Sawyer X, Mark Prather, and Chris “Bosley” Prather for organizing that whole effort.

Okay, just about at the top of the hill, so I should probably finish getting ready now.

(Put your hands up on the way down, that’s more fun!)

Today, I learned that my surgery has been scheduled for next Wednesday (the 10th). Upon learning this, I briefly considered the possibility of making it down to SLC for the first day of YAPC, and then dashing back home for the surgery — but that, with due consideration, seems like not the wisest course of action. So, YAPC::NA::2015 is definitely a miss for me.

However, since OSCON isn’t until later in July, I expect I’ll be able to make it up to Portland for a little hanging out while that’s going on, assuming all the surgical stuff and subsequent recovery goes as expected, so if you’re going to be in town for that, hit me up and we can grab a beer or whatever.

In other good news: the other odd-looking spots that were seen in my kidneys on the CAT scan have gone away in the MRI. They were probably somehow related to the bladder infection that originally led to the discovery of all these problems. This is good news because it confirms that just taking out the part of the kidney containing the tumor is the best course of action.

I just want to say, thanks again to everybody that has offered help and support while all of this has unfolded. It is really, deeply appreciated. I’m lucky to have some thoughtful friends in my life. 8^) <3

…just for a change.

As of yesterday, I’ve been cleared to discontinue the “workaround” and go back to peeing fully on my own! To celebrate, here in just a few minutes, I’m going to have my first cup of coffee since this nonsense started. It’s only been 1 month, 1 week, and 4 days since the last one, but who’s been counting? (Other than me, I mean.)

In kidney/surgery news — still nothing new to report. Pre-op doctor’s appointment on 01 June, so I expect to know something after that.

I talked to my urologist today. (Oy vey, I have a urologist, this is my life now…) She called to discuss next steps. She had been a little concerned about the odd area in my kidney seen on the CAT scan, and had wanted to research it a little and consult with some colleagues before making a plan on how to move forward.

Fortunately, that’s all completed now. She’s decided the odd area is probably just some old scar tissue or something like that, not anything to worry about. Consequently, we’re going to go forward with the heminephrectomy — which is doctor for “cuttin’ out about half your kidney”.

This is kinda good news, because ending up with 1.5 kidneys is better than having just one. (It turns out, if something goes wrong with the other one, you can eek it out on half a kidney and clean livin’…)

But it’s also kinda bad news, because in order to take out part of the kidney, she’s going to have to open me allll the way up, using something called a “flank incision”. According to Dr. Ganeshappa (my urologist, y’all, keep up), this is one of the more painful surgical incisions when it comes to healing. I’ll be in the hospital for 3 to 5 days after the surgery, and I’m probably going to have an epidural for at least part of that, because the pain will be that bad. (The epidural is preferred for pain management because it doesn’t have the constipation issues you can get with narcotics.)

As you can imagine, I’m eagerly looking forward to that phase of the process. (Only, not so much.) I bet I end up with a bitchin’ scar out of this though, so I’ve got that going for me.

Now, the really good news: she also confirmed that, assuming that the tumor is stage 1 (very likely, due to the relatively small size), once it’s cleanly excised, that’s it — I’m done. No chemo, no radiation. I’ll have periodic imaging follow-ups (on the order of once a year) for the rest of my life, but that’s it.

I still don’t have a date for the surgery — other than “some time within a month” — but I will share it when I do. Between then and now, I have to do a bunch of pre-op stuff (blood work, X-rays, and an MRI (to give Dr. G. a better idea of where things are, tumor-wise and kidney-wise)), and I’ve got a “pre-OP” appointment with Dr. Ganeshappa on June 1st, so it will be after that — but how much after, I’m not yet sure.

Thanks again for all the messages of support and offers of help. <3

Thank you to everybody that responded on Twitter, Facebook, sent email, or called in the wake of Friday’s post. I really appreciate the support, and particularly people’s willingness to volunteer to help in what is probably going to be a fairly crappy, trying period. Love to you all.

Damn, it’s all dusty up in here. Last entry in 2012?! Kee-rist, I’m a poor excuse for an olde skööl blogger…

So, as some of you are aware, or may have inferred from my social media postings, I’ve been having some health issues lately. It all started around the middle of April, when I sort of … lost my ability to pee. That’s lead to a massive upswing in the number of doctor appointments in my life, and has greatly increased the number of people that have handled my junk.

That’s sort of mostly okay at this point — I’m still not peeing all that great, and the workaround for that is not the most fun I’ve ever had, but it’s manageable, and every day I pee a little bit better. Hopefully soon, I won’t need the workaround anymore. (Email me if you really want details about the “workaround”, but trust me, it’s probably not your scene.)

But, that’s not really important to this post…

During the course of getting the not peeing thing cleared up, I found out that I have diabetes. This is also not turning out to be a huge deal — I immediately went on a low carb diet and some drugs, and a few weeks later my blood sugar levels are looking really good. I saw my primary care doc on Tuesday, and basically all he said was “keep it up” and “come back in three months”. I’m a little disappointed that I’ve eaten my last sandwich ever, but hey, them’s the breaks. I’m even pretty confident that, in time, I can get off the meds and manage things entirely with my diet.

Of course, the diabetes isn’t really what’s important to this post either…

During the course of getting the whole “Johnny can’t pee” thing evaluated, one of the tests they did was an ultrasound of my bladder and kidneys. And that ultrasound showed what the doctor calls a “renal mass” — which is doctor for “a chunk of shit in your kidney that shouldn’t be there”. The ultrasound was followed up with a CAT scan, which confirmed that the chunk of shit is indeed probably a tumor. (There’s a 5% chance it’s something else, which just looks like a tumor, but … it’s probably a tooo-moor.)

There’s also something else odd, in a different part of the same kidney. To quote the very experienced urologist that I’m seeing, “I’ve never seen anything like that before!” Could be the remnants from an old injury, could be … well, who knows.

So, right now, the plan is: cut some or all of that kidney out. The doc is going to put her head together with some other docs and see what the consensus is on the other weird stuff, and that’s going to determine whether they take out the whole kidney or just the part around the tumor. In general, from what the doc said, they like to remove as little as possible, but if it seems like the other stuff is going to be an issue, fuck it, let’s get the whole thing out. (I may be paraphrasing a little there.)

From her description of the alternatives, I’m actually kind of hoping for the “take it all!” route, because that can be done laparoscopically, which will make for a much easier recovery. If they decide to just take the tumor, I’ll have to be opened all the way up and will end up in the hospital for about a week.

So, obviously a shitty situation — but, looking on the bright side: this was completely unrelated to the issue with my inability to pee. The only reason it was caught was the ultrasound — and the only reason the ultrasound was done was because I happened to mention than an urgent care doc had said she was going to order one, so the urologist ordered it. She said normally, with my symptoms, she probably wouldn’t have bothered if I hadn’t mentioned it. The tumor is still pretty small (around 2.8 cM, which I guess is small as far as renal cell carcinomas go), which means the long-term survivability after removal is really good — 95-98%. This could have gone undetected for years, until I started pissing blood or something. So, while shitty, things could have worked out much, much worse.

Now, short-term consequences: I will not be at this year’s YAPC, I am very sad to say. I am also not going to be able to do {REDACTED VERY COOL THING}. It’s probably fortunate that my OSCON and OSB talks didn’t get accepted, because it saves me the trouble of canceling them. Instead of doing those things, I’m going to having surgery, probably in late May or early June, and then focusing on recovering and healing up, so I can do all those things next year. Because fuck cancer.

I intend to post updates on my condition here, but feel free to drop me an email, or poke me on Twitter or Facebook, and ask how things are going if it seems like it’s been too long since I’ve updated. And now … I think it may just be time for a nap. 8^)

Like many, I haven’t been very pleased with the recent 2.x versions of Skitch. My main use for that app was to be able to right click an something — generally a screenshot — upload it to a remote server, and have the resulting URL put onto my clipboard so I could paste it into a chat channel or an email message. The new version doesn’t really support that workflow, and, further, the URLs have gotten incredibly ugly. Finally, while I use Evernote, I really don’t want my temporary scratch pastebin files getting imported into the same app where I keep stuff I want to annotate and search long term.

I realize I’m not alone in this position, as there’s been a moderate amount of grumbling on Twitter and in $WORK’s chat channels about the deficiencies of the new 2.x Skitch. Several replacements have been proposed, but none of them really had the ease of use I was looking for, and so one afternoon I finally broke down and wrote some Applescript. (I know, I know, I took a shower immediately afterwards.) Since I’m lazy, I’m really leveraging Sartak’s nopaste script to do all the hard work. I call the resulting conglomeration Skotch. (Insert your own “taped together” joke here.)

Skotch has two parts, an Applescript based app and a shell script that calls nopaste with the appropriate environment variables set. If you’d like to play with Skotch, grab the two pieces of code from this gist. Use ‘Applescript Editor’ to save the first code as ‘’ (and make sure to change the ‘File Format:’ dropdown to ‘Application’, and uncheck the two checkboxes). Use a plain text editor to save the second chunk of code as .skotch in your home directory. Modify the environment variables to match your path and server names, make sure you have the nopaste utility installed, and, finally, make sure you have SSH key-based auth working so you don’t get prompted for a password.

In order to get ‘’ to appear as an option in the ‘Open with…’ context menu, you need to modify the Contents/Info.plist file inside the application bundle. Add additional <string> sections inside the <key>CFBundleTypeExtensions</key> array (see here for background.) You may need to restart the Finder to get new entries to be recognized.