Did you know that there is no way to spell WordPress incorrectly, in WordPress? Even if you don’t upper-case the “P” in “Wordpress,”
WordPress will still auto-correct it upon content save. That means you can’t even have a post on your own site to talk about this “feature” and quote the actual misspelling.

We can thank this function.

Desktop Notification When Command Finished (MacOS)

If you have some one-off command you’re running a lot and it takes a long time to complete, you can use the native notification system in MacOS via command-line Applescript access to send yourself a notification once the command is done:

osascript -e 'display notification "DONE" with title "Command Done"'

I setup a bash alias so I can easily append this whenever I need:

alias notify_me="osascript -e 'display notification \"DONE\" with title \"Command Done\"'"

And then…

What Was Ruby Compiled With?

If you ever need to see the compile-time options for Ruby (–configure input), use this command:

$ ruby -rrbconfig -e "puts RbConfig::CONFIG['configure_args']"
 '--prefix=/Users/graham/.rbenv/versions/2.3.1' '--with-openssl-dir=/usr/local/opt/openssl' '--with-readline-dir=/usr/local/opt/readline' 'CC=clang' 'CFLAGS= -O3 -Wno-error=shorten-64-to-32 ' 'LDFLAGS=-L/Users/graham/.rbenv/versions/2.3.1/lib ' 'CPPFLAGS=-I/Users/graham/.rbenv/versions/2.3.1/include '


Selenium Browser Testing & Full Page Screenshots

If you require full-page screenshots in Selenium, save yourself some time and use the following:

  • Firefox 47.0.1
  • Latest version of selenium-webdriver Ruby Gem (I am on 3.0.7)

This should be the only code you need:

caps = Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false)

driver = Selenium::WebDriver.for(:firefox, desired_capabilities: caps)
driver.get ''
driver.save_screenshot 'screenshot.png'

Version combinations matter a lot because the underlying automation driver has gone through a lot of changes, specifically for Firefox. Firefox has a new automation driver called Marionette, but it’s very new and not widely supported. In Selenium 3.x, Marionette defaults to off and uses the legacy driver.

Most browsers are now following the W3C standard, which means screenshots will be of the view port, not the entire full rendered page. This isn’t super helpful if you want to capture a long page and the footer content is needed.

You can read more on the Selenium issue about why this doesn’t work in some version combinations.

If you want to use Chrome, good luck. There has been an open bug report for Chrome for years about this without a fix. Given how a lot of people have moved on to taking screenshots, scrolling the page, then stitching images together, it doesn’t seem likely this will be natively possible anytime soon. The screenshot-scroll-stitch method isn’t very useful if you have header content that stays stuck to the top of the screen.

If you are using this kind of setup with Capybara on top, you’ll likely run into even more problems. Capybara doesn’t appear to fully support Marionette yet, so you may need to downgrade and lock versions to get everything working correctly.

DirecTV Now

Do not waste your time on this terrible service. I was lured in to their launch special that included a “free” Apple TV. The only good thing about the offer was the Apple TV. The day I received my Apple TV there was a 6 hour outage (probably because they didn’t anticipate the surge in demand). Can you remember the last time your cable TV service had 6 hours of downtime? Was there an apology or credit from DirecTV for that outage? Nope.

That’s not even the worst part. Sadly, since the day I started using this service, I still frequently get random video stalls. I can be watching a show for an hour and then it randomly happens, or it sometimes happens if I try to change to a channel and I get a black screen. This is only a problem with DirecTV Now. I can use Amazon, Netflix, or any other app without video streaming hiccups. I’ve never had this issue on any other device on my network. I consistently get 250/30 Mbps Internet speed.

Putting aside the technical issues, this service is really no different from regular cable service. They took regular cable service and put it on the Internet. They managed to actually make usability worse and there isn’t even a good value argument.

Other annoying things:

  • Although you don’t get commercials on a channel like MSNBC, you instead get a static image during normal commercial breaks and an annoying audio loop. I hate commercials, but this audio loop is surprisingly more annoying. It would be better if they had no audio.
  • Changing channels is done using the trackpad on the Apple TV remote. Picking up the remote in the dark will often cause accidental channel changes if you brush against the trackpad. I would have happily used either my Android TV, PS4, or Xbox One but they don’t make an app for these devices, which is strange when almost every other streaming service supports at least one of those devices.
  • I added HBO service, which I pay extra for each month. I didn’t realize until after I had signed up that it’s a limited HBO channel. I can’t go back and watch all episodes in a season. It appears you only get some of the most recent episodes. Comcast, as much as I hate to admit, offers a better service and value.

Good things:

  • You can watch live TV from your bed, from any device

Stop Chrome From Mangling Your Clipboard

Many releases back, Chrome began to automatically change URLs that you copy from the location bar. In Chrome, if you see “” in your location bar and select and copy that, in your clipboard, Chrome changes it to “” This is a pain-in-the-ass if, say, you’re going to copy that into a terminal and intend to traceroute|ping|dig the host.

I can see how some users might find this behavior beneficial, but it’s unexpected and annoying for people who expect that what you copy is what will be pasted.

There were some janky Chrome extensions that tried to solve this, but I figured solving this in Alfred workflows would be a better solution. I made a simple workflow that provides an alternate paste command (command + shift + v) via Alfred and strips out the protocol, www. (if it is present), and the path contained in the URL. This is really just a one-line bash command:

echo -n '{query}' | awk '{gsub("https?://|https?://www\.|/.*","")}1'

You can download the Alfred workflow here, too.

Side note: don’t forget about the built-in paste feature in MacOS that strips formatting. That key combination is: command + option + shift + v. This is extremely useful when pasting something that contains formatting (font, size, etc) into an editor where you don’t want the source formatting.

My Tips For A Good Résumé / Employment Application

I have done a lot of recruiting over the years. It’s never been my main job, but at a smaller company, it’s always been something I’ve had to do. I’ve probably done hundreds and hundreds of interviews at this point and hired dozens of people. Working on recruiting is very rewarding once you find the right person for your company, but unfortunately it’s a long process to find the right person.

This means I come into contact with a lot of bad applications. Sadly, there are a lot of good, talented people hiding behind bad résumés. After seeing the same problems over-and-over, I thought it might be helpful to share my tips on making a résumé better. Most of these are geared towards tech because that’s what I know. So, here we go:

  • Tell me what you’ve done with the services/apps/AWS products you’ve used, don’t simply list them all.
    Anyone can create an AWS account and “use” those services. I’ve interviewed people that listed off tons of AWS services on résumés, but after I interview them, it’s clear that they haven’t been using AWS any differently than a normal VPS or dedicated server provider. Or many of the projects they worked on never made it to production. I want to know what you built, how long you used/maintained it, what problems you ran into, what your responsibility was, what type of things broke on it and why, why you chose those services in the first place, etc.
  • Make it clear what your role in any project was.
    Did you build the platform from scratch on your own? Was it you and one other person? Was it a team of 10? Did you only handle QA or support for the platform? Were you on-call when it broke? Was the platform in maintenance mode when you came on or did you make changes to it? All of these answers change your seniority level and are important to know and they are frequently unclear on resumes. Sometimes (although rare) this is an intentional deception but it will come out eventually and it simply means you’re wasting your time and mine. Other times it seems like people focus too much on summarizing what the company they worked for did instead of what they did at that company (which becomes especially useless information for people coming from larger companies).
  • Skipping a cover letter or writing a generic one that is a few sentences is a wasted opportunity.
    The résumé/CV is the item you send around to a bunch of different companies. The cover letter should be where you customize your message to the company you’re applying for. It’s where you can highlight projects/skills from your past that are applicable to what the company is working on. This is where you should really be heavily selling yourself to the company. The company is looking to solve a problem and you are the solution! At the bare minimum, you can show you actually know what the company does and took an interest. This is a good place to ask questions, too. If the company is unclear about what their pain points are, ask them!

If anyone has any other suggestions or disagree with my feedback, feel free to hit me up on twitter @gmcmillan or email me.

Goodbye, Apple Music

I’m switching back to Spotify, at least for streaming music. Ever since Apple Music launched, iTunes stability has taken a dramatic turn for the worse. Considering the first three months were free, I was more willing to ignore these problems, but now that i’m paying for it, it’s pretty annoying.

Especially today when I started receiving this error every few minutes:


This error makes the iTunes dock icon bounce every time it happens, so it’s very intrusive. So, Apple thought it was important enough to interrupt your work, but not important enough that it can be dismissed automatically. And it appears to be happening even when I play offline tracks. Restarting iTunes does nothing. It doesn’t affect playback of my music, it’s just an annoying error.

This is on top of all of the other random errors and nonsense in the new version of iTunes and Apple Music (I have an almost daily iTunes crash, usually more per day). The iTunes app needs a dramatic overhaul; it seems to be getting more bloated each year and more confusing to use.

I originally switched away from Spotify because I liked the idea of having everything, both my offline music and streaming, in a single app. But the iTunes and Apple Music experience is so poor it’s not even worth that added convenience when the entire thing is a fluster cluck.

I guess i’ll have to get my Taylor Swift tracks somewhere else.

Stopping Spam Phone Calls

Update Feb 08 2018: This post seems to be getting a decent amount of traffic, so here is an update:

I’m now using RoboKiller (iOS app) for several months, which is a service that blocks known spam numbers. It costs about $2/month and is well worth it. It has definitely reduced the number of spam calls I receive and is also correctly identifying the ones that match my number prefix (XXX-XXX-NNNN) as spam.

For some reason, I get a lot of spam calls on my mobile. They rarely ever leave voicemails and the phone number is always different and always in a different area code. It’s mostly student loan refinancing, cruise trips, and a bunch of other similar bullshit. Googling the numbers yield a lot of people receiving the same calls. I sometimes get one call per hour, several times per day, but always from a different number so the “block number” feature in iOS is useless. Until now, I would just ignore any call that was from a number I didn’t recognize, but this still means an almost daily interruption and it has come to the point where I’d like to do something about it. My options are:

  • change my phone number
    • get a fresh number and discard the old one
    • get a fresh number and port the old number to google voice
  • adjust ios settings to curtail interruptions
  • try to get removed from these lists

The first thing I did was turn off all the “handoff” stuff in iOS/OS X. I’ve realized how annoying it is to have my phone ringing on my Mac, my iPad, and my phone at the same time. This feature is significantly more annoying when any spam call can interrupt you in such a fantastic way. I was excited about this feature when it was announced, but it’s more trouble than it’s worth.

I am seriously considering either porting my number to Google Voice so I can better control inbound calls, but I am hesitant to do this because it feels like Google is getting ready to kill Voice. They haven’t updated the iOS app in forever and I get the vibe that Google has abandoned it. If I did port the number, going forward, I would only give my mobile number to people I actually know. Businesses wouldn’t get it. The other reason I don’t really want to change numbers is that notifying people about number changes is a PITA and a lot of two-factor things are tied into that number.

iOS has a feature called “Do Not Disturb” which I thought would fix this problem. Unfortunately, it doesn’t offer the right level of customization and it’s pretty much all or nothing. I had intended on only allowing people in my contact list to ring through, but when DnD is enabled, it also silences ALL notifications for any other app. Which means PagerDuty alerts, important alerts, would never alert audibly. So that option is out.

Which brings me to my final act of desperation. Here is what I’m doing for now, which is a pain in the ass to setup, but it works great…

  1. First, either make or buy a “silent ring tone” in the itunes store and set it as your default ring tone
  2. Then, go into your contacts and customize what the actual ringtone should be for each contact (this is the most time consuming part, but you only need to do it once per contact)

Now, any time someone not in your contacts list calls you, it will come through on your phone but there will be no ring/noise or interruption. If someone is in your contact list, it will ring/alert you normally. This probably won’t work for everyone, but most of the people calling me are people in my contact list, so it’s just about perfect. Having to remember to adjust the ringtone anytime I add a new contact is slightly annoying, but worth the tradeoff.


Wireless Routers

I’ve used many wireless routers over the years; from the basic 802.11b Linksys models to running my own PFSense installation with a separate wireless AP. Sadly, it is difficult to find reliable consumer routers/APs that have a decent set of features and don’t require regular reboots to continue working. You often have to trade reliability for good speed/range.

Apple Airport
For several years I’ve been using an Apple Airport Extreme alongside an Airport Express that extended the range of my wireless; it was just enough to give me the range needed to be usable so I could get decent signal outside. It’s also the easiest router i’ve ever setup and one that I think the average person has a better chance of getting working than most competitors. It’s definitely the easiest system I’ve used to extend my wireless signal with repeaters — you just add more airport expresses to extend your range. Setup is extremely easy in the Airport Utility app. The biggest downside is the lack of features and visibility into what is going on; all you get is what you see in the Airport Utility app. I’ve also mentioned before how easy it is to get IPv6 working with this system and with Apple’s coming IPv6 priority changes in El Capitan, it’s nice to see that it’s easier than ever to get IPv6 working for wide adoption by all clients.

For the most part, these Airport devices are incredibly reliable. I can’t remember the last time I needed to reboot them. My last router was a D-Link draft-N router and it required constant reboots and QoS was a joke; a single user could make the network inoperable for all other users.

Speed is very good with Airport, especially if you use 5Ghz. In the same room as the AP, I can transfer files locally at around 20MB/sec (160Mbps) over rsync/SSH.

Mikrotik RB2011UiAS-2HnD-IN
A few people I work with told me about this 802.11b/g/n 2.4Ghz Mikrotik router; it runs on software called RouterOS. Granted, this router does not exactly compete with the Airport system on features. I’m not a networking expert, but you do need some networking knowledge to get this thing working. Your parents won’t be able to use this without your help. On the bright side, this router gives you enough features that you can manage their network remotely if they have trouble.

I was able to get up and running in under 30 minutes, including setting up my native IPv6 configuration (note: I had to do this from terminal, not the web interface). The signal strength is very good throughout my house, but unfortunately it is not enough to reach outside. Still, the speed inside is consistent — I received about 10MB/sec (80Mbps) persistently when transferring a file over wifi to two machines in the same room. I’m still impressed considering that this is only a 2Ghz router; I would love to see a 5Ghz version of this router.

The number of features in this router are simply too many to list. I don’t even know what some of these features do, but the amount of features is almost overwhelming. This is basically an enterprise level router at (below) consumer prices.

Considering the Airport still wins in range, I’ve setup the Mikrotik as my router and the Airport has been switched to AP mode only so I get the best of both worlds.