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.

Comcast IPv6 Support

I’ve had very few positive experiences with Comcast, but I have to hand it to them — they did a great job on their IPv6 deployment. My modem died today due to a power surge so I figured now would be a good time to get an IPv6 capable modem so I could have native IPv6 support instead of using a tunnel.

IPv6 support worked on the router as soon as I powered it on. In order to get IPv6 working on all of the devices connected to my Airport Extreme, I simply had to check the “Enable IPv6 Connection Sharing” option:


Restart router and done. No fuss. If anything, Comcast made IPv6 easier than Apple did. Which is something else I noticed — Chrome seems to prefer IPv6 over IPv4 and Safari is the opposite.

Updating Your Duo WordPress Integration

If you need to change your Duo integration on a live site and one where you have lost WP admin access but still have server/database access, you need to make some manual updates to the database to fix the integration.

The API host, integration and secret key are all stored in the MySQL database under the “wp_options” table in WordPress (the wp_ prefix might be different if you changed the default).

1. The first thing you need to do is get into your MySQL CLI and run a “use whateveryourdatabase_name_is;”

2. If you want to see the current integration data, run this SELECT query:

mysql> SELECT option_id,option_name,option_value FROM wp_options WHERE option_name IN('duo_ikey','duo_skey','duo_host');

| option_id | option_name | option_value                             |
|       411 | duo_host    |                |
|       409 | duo_ikey    | 8hCQ3ZmVfxTAgUVe]uApiH                   |
|       410 | duo_skey    | VpyuMLFThwjDwDhjEfPg6L2fKLXzwb           |

3 rows in set (0.00 sec)

3. Now that you have this information, you can easily update update each value with the new integration information from Duo:

mysql> UPDATE wp_options SET option_value="" WHERE option_name="duo_host";

mysql> UPDATE wp_options SET option_value="ghdkoMVZEYdLtyXL88DFLhDhfGrCLH" WHERE option_name="duo_ikey";

mysql> UPDATE wp_options SET option_value="pjjDbTaWNhR8EDw2AVyEmCwDthbakr" WHERE option_name="duo_skey";

4. Done! Your next WP login should work immediately.