wshaffer: (Default)

September 2017

     1 2

Custom Text

Most Popular Tags

One of the work projects that pretty much consumed my work life from last August through this March is now in beta:

We made a little video to talk about the project and why we did it:


Dec. 30th, 2016 01:54 pm
wshaffer: (calm)
So, there is weird stuff going on with Livejournal. More details at the linked post, but the short summary is a) the Livejournal servers are now located in Russia b) the Russian government now has access to everything posted on Livejournal, including friendslocked and private posts and c) there are unconfirmed rumors of Russian-language accounts and posts being purged.

Given this, it seemed prudent to log in to my long-dormant Dreamwidth account and import my Livejournal. For now, until the situation is clearer, I'm going to be posting on Dreamwidth and having the posts cross-post to Livejournal. I don't intend to jump ship on Livejournal right away - I'll still be reading and responding to comments posted there - but it seems prudent to have a backup against the possibility that Livejournal will become unusable or become a platform that I no longer want to use.

If you're reading this and you're also on Dreamwidth, feel free to find me over at
Here's a grab bag of stuff I've been finding interesting today:

Nicholas Whyte put together a very nice guide to election night:

Regarding "making presentations more visual", my sister-in-law tipped me off to this excellent resource of diagrams for presentations: Very useful for those moments when you need a blob with four other blobs radiating out from it, and you don't want it to look like it was created by a five-year-old.

Don't watch this if you are afraid of snakes, but this snippet from Planet Earth II is the most tense action-drama I've seen all year: That un-named little baby iguana is my hero.

Fascinating interview with the lawyer who handles U.S. visas for many heavy metal bands on tour: Hardly a month goes by without an overseas heavy metal band canceling or delaying a U.S. tour because a visa issues. After reading this interview, I'm more amazed that anyone ever manages to tour the U.S. at all.

Music that is scientifically proven to reduce stress:
I've been asked to interview a potential candidate for a tools developer on my team at work. The job posting is here.

I've worked with plenty of developers, so I've got a pretty good notion of what I want in a candidate. I'm not planning on asking a lot of technical questions - there are other people on the team who will do that. Also, I really care much more about a hypothetical candidate's problem-solving abilities and their ability to understand the user mindset well enough that they'll build things that not only meet the technical requirements but actually help us do our jobs better. (In theory, translating writer requirements into language that developers can understand is part of my job. In practice, I've found that that's nearly infinitely easier to do with a developer who is willing to meet you halfway.)

Anyhow, I know that many of you are developers or regularly interview developers. I would love to hear about your favorite interview questions, or things you look for as red flags, or whatever. Please, give me advice.

Also, if you know anyone who would be a good candidate for the position, send them my way. The current candidate looks quite promising, but it never hurts to have a larger pool to choose from.
The VMware Information Experience team has started a new video series called Blogger Talk, where we interview VMware bloggers about their favorite topics. I talked to Mike Foley about vSphere security topics like why a VM escape is unlikely on ESXi, how to deal with internal security threats, and how to use the vSphere Hardening Guide.

Please like, comment, or share if you are so inclined.

My efforts to teach myself Ruby programming have not advanced much in the past few months, having been displaced by acquisition of other skills more immediately of need in Ye Daye Jobbe. However, I have a solid skill base in writing scripts that take information in one format, slice it and dice it a bit, and spit it out in another format. This is surprisingly useful.

This morning I was in a meeting where we found ourselves saying, "We have a pile of XML files with a ton of information - if only we could turn them into a CSV file containing that information." I have now written a script that does just that.

Using the Nokogiri gem actually makes it pretty stupidly easy to parse XML/HTML. One of these days I'll set myself a programming challenge in Ruby that does not basically reduce to 1) Find the gem that provides the correct objects and methods to handle your data set. 2) Perform basic string and array manipulations. 3) Profit!

Today is not that day.
Last night and this morning, I helped two coworkers work through problems with an internal tool that I happen to have written the internal documentation and training for. It looked to me, from what I was able to see in the logs, like the problem was user error - both of them were, completely separately and independently, doing Operation X instead of Operation Y.

Which really made me think, "Gee, how crappy must my training and documentation have been, if it left them so confused? What the hell did I do wrong?"

Until I asked the second colleague, "Hey, why did you do X instead of Y?"

And she replied, "Oh, Y isn't visible in my user-interface."

It's looking like the tool administrator borked up a bunch of people's permissions. Fortunately, my documentation covers what to do in that case.
Lots of food for thought in this article. I don't entirely agree with it - I think the author doesn't recognize the extent to which competing against oneself and setting and exceeding goals can be an empowering experience for someone who's always struggled with fitness or exercise. Certainly, for me personally, being able to track my progress has really helped me see myself as someone who can actually succeed at exercise.

But it is true that when you grow up as the fat kid who was always picked last in gym class, your early experiences of quantitative fitness tracking are all about people telling you how much you suck. You weigh too much. You ran that mile too slowly. You can't do the right number of push-ups or sit-ups. I think there was a time in my life when tracking my fitness to the extent that I do now would probably have been counterproductive. And with fitness apps and trackers going mainstream, I worry that a lot of people getting started in fitness are going to be deluged with numbers that they just interpret as metrics of how terrible they are. I think there's a ton of room in the market for apps that encourage movement in other ways.

And as much as I've loved some of the health and fitness apps I've used, nearly all of them have assumptions built into them that drive me batty. Back when I used Health Month, for example, it used to annoy me that if I met my goal of running three times a week, it would suggest that next month I set a goal of running four times a week. I didn't want to run four times a week - I needed the time between runs to recover and to do other fitness things I wanted to do. But the app just had the assumption that more was better written into it. (And as the author of this article points out, that assumption is nearly universal in fitness apps.)

And as much as I love my Fitbit, the extent to which it prioritizes steps over other measures of activity can lead to some counter productive incentives. If you look at my Fitbit activity history, you'll notice that the day on which I'm most likely to fail to make 10,000 steps is Monday. Why? Because on Monday I go to the gym and do a fairly intense strength training workout with my personal trainer. During that strength training workout, I might only take 1,000 to 3,000 steps, as opposed to the 5,000 to 6,000 steps that I get on a typical walk or run. So, by Fitbit's most prominently tracked metric, Mondays look like off days for me. But if you look at other metrics, like total calories burned or amount of time that I got my heart rate elevated, Mondays are clear wins.

Now, my personal solution to this is simply to not get too hung up on the numbers. And Fitbit's prioritization of steps has a decidedly virtuous aspect as well: on most days, if I look at my tracker and realize I've been a bit sluggish, I'm much more likely to get up and go for a short walk than I am to pop over to the gym for an unplanned workout. Its net effect on my fitness is definitely positive. But I'm still waiting for the day when someone develops a fitness app/tracker that makes it easy for me to track the things that I consider important, and ignore the things that I don't consider important.

(Obligatory chemist's quibble: I don't know why the author of this piece describes the calorie as an "invented unit". A dietary calorie is what chemists would call a kilocalorie, and is the amount of energy needed to raise the temperature of a kilogram of water by 1 degree Celsius. It's as "invented" as the meter is. We now know that what food calories actually do in your body is more complicated than what simple laboratory measurements would suggest, but that's not the unit's fault.)
I have just replaced my increasingly unreliable 13-year-old printer with a brand-new Epson inkjet. It prints, it scans, it copies, it makes a mean strawberry daiquiri*.

Setup was fairly smooth, but when I installed the printer drivers, I got a little popup that said something like, "Print queue was not added. Please consult the User's guide for instructions on adding a print queue manually." So, I found the online User's guide, found its nice search box, and put in "add print queue."

No hits.

Okay. I tried just searching for "queue". No hits.

Scanned through the table of contents looking for anything that resembles adding a print queue. No hits.

Memo to all those software developers out there: if you're going to put text in the user interface of your software telling people to look in the manual for something, please tell the person who writes your manual that you've done that.

* Okay, it doesn't make strawberry daiquiris, but in this weather, it totally should.
I was quite...startled is the word, I discover that the actor who voiced Blackwall in Dragon Age: Inquistion is voicing a mohawk-wearing tattooed dwarven crime boss named "The Cleaver" in The Witcher 3: The Wild Hunt.

Though a real lack of typecasting would involve a fantasy game where the guys with Northern accents all got to be well-dressed posh bastards. I won't hold my breath.
Tonight I came home from work with the full intention of having dinner and then playing The Witcher 3 until the wee hours. Instead, I had a lovely after-dinner conversation with Daniel, paid some bills, made an appointment I'd been putting off for weeks, worked on a writing project I'm doing with a friend, edited some video, and am now planning to go to bed at a semi-reasonable hour so I can get up at a decent hour tomorrow.

What is this adulting? I can't even.

Geralt of Rivia and I are definitely going to have some quality time sometime this weekend, though.
I don't remember how I did programming in the days before Google and Stack Overflow. I think I spent a lot of time flipping through books. Or possibly actually memorized language syntax, which seems like a horrible waste of neurons that might be more profitably put to other uses.

However, if you want to get good results out of Google, you've got to know how to search for the right thing. There is a thing that I often want to do in Ruby, where I've got a variable that holds a string, and I want to put the value of that variable into another string. And somehow I always end up searching for something like "ruby string substitution" and getting pages and pages of stuff on the sub method, which is nice but not what I want at all.

So this is a note to myself: the thing you want to do is called "variable interpolation" and it works a little something like this:

thingy = "variable interpolation"
puts ("When you want to put a variable into a string, that's called #{thingy}.")
Overall, MetalGate looks like it's a non-starter, in that it's just failing to generate the sheer volume of social media ugliness that GamerGate inspired. However, there have been some interesting developments:

1. A singer for a couple of minor but critically well-respected black metal* bands decided to seize the occasion to send harassing and threatening social media messages to a feminist music journalist and some members of some other bands.

2. The singer's bandmate in one of the bands responds by firing him.

3. A bunch of metal blogs write about the story, in some cases using the journalist's name and/or posting screencaps of protected social media posts.

4. Journalist tweets to these bloggers, pointing out that screencapping protected social media posts is uncool, and that using her name in these stories will drive further harassment her way.

5. Bloggers apologize, remove her name and protected content from the posts.

People facing professional consequences for harassing people on the internet? Male allies apologizing and trying to fix the situation when a woman tells them, "Hey, guys, you are not helping"? What strange internet have I stumbled into?

*For those unfamiliar with the metal scene, "black metal" does not equal "metal performed by black people". Indeed, owing to the peculiar history of the subgenre, it is probably the whitest subgenre in a very white genre.
Today's little Ruby conundrum that I'm noting for future reference: I've written a script that takes two CSV files, File A and File B, and removes entries from File A if they match up with certain things in File B. The script is invoked at the command line by typing ruby my_script.rb filenameA filenameB.

Having done this, I wanted to ask the user if they wanted to do additional filtering based on an additional criterion, so I added the following.

puts "If you want to do additional filtering, enter a filter string. Otherwise press Enter."
response = gets.chomp!

To my bewilderment, when I ran the script, it blew through that gets statement without pausing for input and proceeded to filter the output in an unexpected way.

I did eventually find the answer on Stack Overflow, but it was obscure enough that I'm blogging here for my own reference. Basically, it turns out that gets doesn't read from standard input by default. It reads from ARGF, which is an array containing the filenames passed to the script as command line arguments. So, my script as written grabbed the first line of File A and filtered based on that.

To make gets grab input from standard input, I should have used $stdin.gets.

I assume that this isn't more widely documented because few people mix command-line arguments and interactive input in a single script. In fact, I'm not sure I should really be mixing command-line arguments and interactive input in a single script, but I'm already asking the user to type a hell of a lot at the command-line, and this seems like a reasonable hack to get something useable while I decide on a better way to handle this.
My Younger Nephew is kind of obsessed with video games, and doesn't have access to a video game console at home, so we've hatched plans to have him come over and play at my house. The catch is, at 5 years old, I don't think he really has the reading skills (or possibly even the interest in sustained narrative) to get really into the story-based RPGs that make up the bulk of my gaming. (Also, games like Dragon Age 2 seem a touch...traumatic for a 5 year old.) I have a few games that I think he might like - Katamari Damacy and Lego Batman spring to mind - but I'd like to pick up one or two more just to have a variety of things on hand.

So I'm looking for recommendations for good games for kids. They don't necessarily have to be games specifically developed for kids - first person shooters or driving games would probably be right up Younger Nephew's alley - but I'd like to avoid exposing him to excessively adult content. (I should probably hide Grand Theft Auto before he comes over.) Bonus points if they've got a co-op or multiplayer mode that a kid and an adult could play together.
After a bit of research, I found a much better way to do the file name manipulation I was talking about in my previous post.

Basically, it boils down to:

require "pathname"
input_file =[0])
new_base = (input_file.basename(input_file.extname)).to_s + "_counts" + input_file.extname.to_s
output_file = input_file.dirname +

I used Pathname instead of File because the documentation suggests that it's more robust at dealing with different file pathing conventions on different OSes.

I'm a little dubious about the dance I had to do there of converting path fragments to strings, concatenating them, and then converting back to a pathname, but trying to concatenate the path fragments directly kept giving me extra / in the path.
I'm doing a project at work where I've got a bunch of CSV files with several thousands of lines of data. I need to slice and dice this data in various ways, mostly by pulling out subsets of lines with certain strings occurring in them, counting the number of times certain values occur, and so on.

Looking at this data, it became clear that I could either a) become a serious Microsoft Excel power user, or b) put my slowly growing Ruby scripting skills to work. That wasn't much of a contest.

I actually managed to knock together the skeleton of a useful script pretty quickly. Now I'm polishing it up to make it useable and adding a bit of basic error-checking. I encountered two little issues that strike me as the kind of thing that I'm likely to forget about and then encounter again at some point in the future. So, blogging for my own reference, and because it might possibly be useful to some other Ruby newbie.
How do I find the file name extension? )
How do I unfreeze my string? )
Actually, as I was checking in my most recent changes, it occurred to me that Ruby probably has a class with built-in methods for doing things like handling file name extensions. But reinventing the occasional wheel is educational.

Computer woes

Oct. 2nd, 2014 11:25 am
wshaffer: (mini-me)
The hard drive on my Mac died on Saturday morning. The first genius bar appointment I was able to get that fit with my work schedule was yesterday evening. (Note to self: Try not to have your hardware die close to a major Apple product launch.) The official estimate on the hard drive replacement was 3-5 days, although the tech I spoke with told me he thought they could do it in 48 hours.

I just got an email saying it's done, and I can pick it up any time. How's that for under-promise and over-deliver?

I guess I'll pick it up tonight after work and we can see how good my backups are.
Ah, the nuances of how we construct online personas...

In a lot of places where I talk about heavy metal online, I use a gender-neutral name and avatar. This wasn't originally a conscious choice, but once I noticed I'd done it by accident, I kept it up. Partly because it's an interesting social experiment to see how often people casually assume that I'm male, and partly because it's kind of nice to be able to scope out an online space a bit before deciding to take on the burden of identifying as female. I never go out of my way to hide that I'm a woman, but I might go quite a long time without bringing it up.

But I've also recently made contact with a number of French-speaking metal fans and although almost all of them have some degree of English fluency, I'm dipping my toe in the waters of interacting with them in French. It's kind of cool - the international language of heavy metal is this kind of fractured English, so I feel much less self conscious about the fact that I probably go around sounding like this: "Warmest salutations! I like very much your metals, for they possess truly the heaviness!"

The weird thing, though, is that the grammatical requirement for gender agreement between subject and adjective really throws the gender issue into sharp relief. Because it makes it really obvious when someone assumes that I'm male. And I can't even say something simple like "I am American," or "I am happy," without feeling like I'm effectively tacking "AND I'M A GIRL" onto the end.

I'm curious whether other people have noticed this, especially those of you who are much more bilingual than I am. Those of you whose native tongue is a language with gender agreement between subject and adjectives - when you interact with people online in English, do you notice the reduced frequency of obvious gender markers? How do you feel about it?
For the past couple of weeks, a big chunk of my time at work has been occupied by doing a review of the user interface text strings for a new product that I'm working on. I have mixed feelings about these reviews. On the one hand, there are few things more mind-numbing than methodically trawling through pages of disembodied text correcting grammar and style. On the other hand, it's a chance to very directly affect the user experience of the product. And on the third hand, I get to work really closely with the developers and the source code, which is always fun.

With this being a new product and a new team, I get to figure out a whole new process. For ages, I have been struggling with the fact that I work on Windows while most of my developers work on Linux. So far, I've been able to use a series of kludges to be able to do what I needed to do, while always saying to myself that "some day," I'd set up a Linux VM and get plugged in to the build and source control tools the same way my developers do. I put it off, because I assumed that, like the process for getting all this stuff working on Windows, it would take a couple of days to get it all configured and running correctly.

Yesterday, after burning a day fruitlessly trying to get make to play nicely on my Windows machine, I bit the bullet and built an Ubuntu VM. Total effort involved: installing from a pre-built image, running a script to mount the build tools, a bit of dinking around to get the right 32-bit support libraries, and boom: I ran 'make pkg' and built my product from source. Holy crap. If I'd known it was actually this easy, I'd have done this years ago.

Also, I feel stupidly badass for having built the product from source, even though this is something that every new developer probably does in their first week.