Wednesday, February 20, 2019

Throttling Skype bandwidth on macOS

I'm a full-time remote worker, with all of my teammates located together in the office. To help maintain close communication with my team, I have a "telepresence" Skype call with the office that's always on, so my teammates and I can see and talk to one another.

We're currently using Microsoft's Skype as our videoconferencing solution, as it is the only one I've found that (1) works reasonably reliably; (2) supports auto-answer (so I can activate the call without someone in the office needing to manually answer it every day); and (3) is free.

Unfortunately, as with many Americans -- particularly in localities where only a single company provides high-speed land-line Internet -- my Internet service provider recently started imposing a bandwidth cap on my monthly Internet usage. My cap is 1000 GB per month. Between my job, and my family's normal Internet usage, we've been either coming close to, or exceeding, that cap on a regular basis.

As one part of a strategy to try and keep my home's Internet usage under the cap, I looked into how much bandwidth that always-on Skype call was using. Using the Network tab of my macOS copy of Activity Monitor, it turns out that it was quite a bit: An average of around 350 KB per second (with peaks over 400 KB/sec).

Over the course of the typical 6 hours per day where my team (Pacific Time / GMT -8) and I (Eastern Time / GMT -5) are both online, that works out to about 7.5 GB per day; which in turn works out to about 150 GB over a 4-week period where I'm in the office 5 days per week.

Unfortunately, macOS 10.14 Mojave does not provide an out-of-the-box a way to limit the bandwidth used by a particular application.

Skype for Mac (version 8.39) itself also doesn't provide a quality slider or other rate limiter; it always appears to consume as much as it can.

Complicating matters, Skype 8 also doesn't specify or allow configuration of which specific TCP ports it uses, for possible QoS throttling at the router.  Per a page on the Skype support site, Skype might be using TCP ports anywhere in the range 1000 through 65000.

After a fair amount of research and dead ends, the working solution that I finally landed on was the free version of a software package named Murus, which provides a GUI wrapper around the Packet Filter firewall functionality that comes with macOS.

My Murus configuration is based on a very helpful post on the Murus forum by user "hany".  The variant of hany's instructions that I used is as follows:

  1. Install Murus.
  2. In the main Murus window, in the "Services Library" pane, add a new custom service named "Skype" (or whatever you like). 
  3. In the Ports field, enter 10000:22465, and then on a new line, 22467:65000.  (I excluded port 22466 because per Slack Support, that port is used for Slack calls, and I wanted those to remain highest quality.)
  1. Drag the new service to the "Managed Inbound Services" pane.
  2. On your new Skype service, click the little speedometer-looking icon to bring up the Bandwidth dialog.
  3. Set your desired values for the Upload Bandwidth and Download Bandwidth. I found that values of 768 Kb/second resulted in very usable (if slightly blurry) Skype calls.
  1. Press Cmd-S (or select Firewall > Save Configuration from the top menu).
  2. Click the Play icon button in the top toolbar of the Murus window to start limiting bandwidth. (Press the Stop icon button again later to turn the throttling off again.)
  3. I have found that I sometimes need to quit and restart Skype to see the changes take effect, while observing the bandwidth usage in Activity Monitor.
This is admittedly a non-ideal, somewhat brute force solution, since it affects not only Skype, but any application running on the computer using TCP or UDP ports in the 10000+ range.

However, it has proven to be effective: With this Murus configuration running, Activity Monitor shows my incoming (download) Skype bandwidth dropped to around 80 KB/sec.

That works out to about 34.5 GB of usage over a typical 6-hour-day, 20-day work month -- a savings of some 115 GB over running with no throttling over the course of the month, representing an 12% or so usage reduction in my imposed 1000 GB/month cap.  Not incredible, but not terrible, either!

Thank you to the Murus team for the software; to "hany" for the posted on the Murus forum that helped me with this solution... and to my local ISP monopoly for the opportunity to undertake this interesting learning experience!

Wednesday, April 11, 2018

My Five-Monitor MacBook Pro Setup

I currently have my primary work development computer, a 2017 MacBook Pro (15", with Touchbar), set up with a total of five monitors: The MacBook's own display, plus four external monitors.

Five monitors? Isn't that just a bit ridiculous?

Although it may seem like overkill, I have found that this setup is really good for productivity.  I'm able to put my most-frequently-used windows each on their own monitor, which is great for avoiding time wasted switching different windows back and forth into the foreground.

It's also great for helping to minimize the situation of making a mental note of something in one window, switching to a different foreground window, and then doing something in that other window with the remembered information; I can just glance back and forth between multiple visible windows instead.

My typical window configuration with this setup:

  • Second monitor from right: My primary monitor. Typically I've got a web browser here.
  • Second monitor from left (portrait / vertical orientation): My code window. Typically my IDE / code editor (e.g. Visual Studio or RubyMine) goes here. Great for seeing tons of code at once! Also excellent for reviewing long documents, such as XSDs or other documentation.
  • Leftmost monitor: Secondary browser or document window. I put terminal windows here. I also put my mini-mode iTunes music player in the corner.
  • Rightmost monitor: Communication / chat. I typically have my team's Slack window open here.
  • Top monitor: I keep a video conference window to my team's office in San Diego open here during the hours that they are working, so they can see and talk to me, and vice-versa!

What's the hardware?


MacBook Pro, 2017, 15".

As far as ports go, this computer has 4 USB-C ports, plus a 3.5mm headphone jack -- and that's it! Power, video, network -- everything is done through the USB-C ports.

I have the laptop sitting on a 3M LX500 Laptop Stand to align its screen a little better vertically with the other displays.  I like this stand because there's a nice empty space under the stand (which is the not the case with many stands), which is nice for a little extra physical storage space on the desk top.

USB-C to 17-port adapter

OWC 13 Port Thunderbolt 3 Dock.

This is the main device that allows me to connect so many devices to my MacBook, including two of the four external monitors, as well as to provide power to the MacBook, all through a single one of the MacBook's USB-C ports.

Primary external monitor (second from right) 

Dell U2312HM. 1920x1080 resolution.

Connected via: MacBook USB-C port → CableCreation brand USB-C to DVI adapter → DVI cable → Monitor DVI port

Portrait mode (vertical) monitor

Dell U2412M. 1920x1200 resolution. 

Connected via: OWC Thunderbolt Dock → BlueRigger brand Mini Displayport to DVI cable → Monitor DVI port  

The stand that comes with the monitor supports rotation, so it was very easy to get it set up in portrait mode.  

The bump to 1200 resolution in the narrow dimension (instead of 1080) is nice, as it gives the monitor a little extra horizontal room in portrait mode. 

Modern versions of MacOS and Windows both have excellent support for "rotating" the output for a given monitor to support portrait orientation -- I've successfully used this monitor in portrait orientation with both OS X and Windows.

Rightmost (tertiary, 4:3) monitor 

Dell E196FP. 1280x1024 resolution. 

Connected via: OWC Thunderbolt Dock Agatha brand USB-C to VGA Cable → Monitor VGA port

I wouldn't actually recommend this specific model of monitor anymore, because it only supports a VGA cable connection! Newer connection types such as DVI, HDMI, or DisplayPort will generally provide a sharper screen image. However, even with just the VGA connection, in practice I don't notice any bothersome blurriness on this display.

Top monitor: Dell S2415H. 1920x1080 resolution with integrated speakers.

Connected via: MacBook USB-C port Apple brand USB-C Digital AV Multiport Adapter → HDMI cable → Monitor HDMI port

Stand: WALI brand Extra Tall Universal Single LCD Monitor Fully Adjustable Desk Mount

How painful is docking / undocking?

It's not bad at all, actually; there are only 3 USB-C cables to plug or unplug when I connect or disconnect the MacBook laptop from the setup: The one USB-C cable for the OWC Thunderbolt Dock, plus the two additional monitor adapter dongles.

It's not quite as nice of an undock experience as when I used this same set of monitors and other devices with my Lenovo Windows laptop -- which involved unplugging just a single HDMI cable from the laptop itself, and removing the laptop from the physical dock -- but it's still very acceptable!

What's with all of the Dell brand monitors?

Experience has taught me that some non-Apple monitors just don't play nice with MacBooks. The typical symptom I've seen is that I'll connect a monitor to the MacBook, and simply nothing will happen: The Mac will act as though nothing new was connected. Even the System Preferences → Displays → (hold Option button) → Detect Displays feature wouldn't help.

I don't know of any reliable way to tell whether a particular non-Apple monitor is going to work with a Mac other than actually trying it.

I've had good luck with Dell monitors working with the MacBook, though, so my current plan is to continue going with the "Dell" strategy until something changes -- that is, until I run across a Dell monitor that doesn't work with the Mac!

So why the detailed write-up?

Actually getting this to work was the end result of a lot of trial and error.  I tried several times connecting these and other monitors to the MacBook in ways that resulted in things not working -- almost always manifesting itself as the MacBook acting as though one or more of the connected external monitors didn't actually exist at all, as I noted earlier.

Some specific things that I remember trying when I was getting this all set up that didn't work:
  • Trying to connect more than two external monitors via the OWC Thunderbolt dock. I was only ever able to get a maximum of two external monitors working through that dock; any further number of monitors I tried just wouldn't work.
  • Certain other adapter and cable brands. In particular, whereas the CableCreation brand USB-C to DVI adapter (which has only 3.5 stars on Amazon as of this writing) worked for me, a similar Belinda brand USB-C to DVI adapter did not work for me -- even though it specifically listed support for MacBook -- and I ended up returning it.
  • In general, I had a lot better luck getting "non-handshaking" port types (DVI, VGA) to work than "handshaking" ports (HDMI, DisplayPort). I had several different failures trying to get the two primary Dell monitors, both of which support both DisplayPort and DVI connections, to work with the MacBook via their DisplayPort connections, before I did get them working via their DVI ports. (Both Dell monitors did work just fine with my Lenovo Windows laptop via either one of their ports.)
Hopefully this post will prove of some value to anyone who might be trying to get a similar multi-monitor MacBook setup working; or to me, in the event that I need to try and recreate this setup in the future!

Wallpaper shout-outs

OS X does not currently have native support for spanning a single image across multiple monitors as the desktop wallpaper (like Windows does). The great $3 solution that I used to create the spanned image of the Enterprise-D as shown in the photo above is the Multi Monitor Wallpaper app, available on the MacOS App Store.

Multi Monitor Wallpaper shows you an outline of your combined monitor layout, and allows you to stretch / zoom / reposition your selected image across the monitors. It then automatically handles cutting up the image and setting it as the background image for each monitor. I have no affiliation with the app; I'm just a fan!

As for the excellent high-resolution image of the Enterprise-D itself, unfortunately I'm not sure whom to credit. I grabbed the image over a year ago via a Google image search, and I can't find the same image now when I search. If anyone knows where this image is from, let me know, and I'll gladly provide credit!


Tuesday, April 10, 2018

Fix: Blurry display on HDMI-connected Dell 2415H monitor on MacBook Pro

On the MacBook Pro (2017, with Touchbar) that I currently use as my primary development computer at work, after I "docked" the computer (reconnected all external monitors and devices) this morning, my monitors were in the wrong order.

Further, the display on one of the external monitors -- a Dell 2415H, connected via USB-C port → USB-C to HDMI adapter → HDMI cable → HDMI port -- had an extremely blurry display. That monitor also now had "overscan" of about a centimeter; that is, the image extended past the viewable area of the screen in all directions (so that I could only see the bottom edge of the menu bar at the top of the screen).

Fixing the display order was a simple matter of going into System Preferences → Displays → Arrangement, and dragging the monitors back into the proper order.

However, it took a little longer to figure out a solution to the blurriness issue. In the System Preferences → Displays window for the blurry monitor, the Resolution radio button was set to "Default for display" as usual. When I changed it to Scaled, the available values were "1080i" (selected), and 720p.

Changing the setting to 720p caused the display to be sharp again, but everything on that monitor ended up being sized way too large.  (Plus, I then was only presumably getting 720 pixels of vertical resolution, instead of the 1920x1080 of which the monitor was capable.)

The solution turned out to be to close the Displays windows, unplug and replug that monitor's HDMI cable, and then open System Preferences → Displays again.  After doing that, the Displays window → Color tab → Resolution (scaled) selection for the blurry monitor now displayed two additional options which weren't there before: "1080p" and "1600 x 900".

Changing the selection to the now-available "1080p" fixed the problem: All text and images on the monitor became nice and sharp again, and the overscan went away.

Monday, December 04, 2017

Advent of Code 2017 - SmartyStreets Sponsor Text

I just learned about the Advent of Code -- an event with a new short, fun programming puzzle published in each of the 24 days leading up to Christmas.

I noticed that primary event sponsor SmartyStreets has some cryptic text as their sponsor comment:

U2VuZGluZyBDaH Jpc3RtYXMgY2Fy ZHMgdG8gYmFkIG FkZHJlc3Nlcz8K

I won't spoil what it says here, but the only hint you should need to decode the text is that it is base64 encoded. (Also, automatic base64 decoder websites are readily available!)

Also, I'm publishing my C# Advent of Code 2017 solutions on GitHub. I'm generally aiming to optimize them for readability, rather than for minimum lines of code or fastest possible execution speed -- which is what I generally do as well when writing actual production code.  That being said, I have been pretty blown away by the impressive brevity of the solutions of some of the event leaderboard's top members!

Saturday, December 02, 2017

My Game of the Year awards: 2017

Starting with my personal Game of the Year for 2017, and continuing on with the rest of the top 10, these were my favorite games that I played for the first time this year! Originally posted on the Gamers with Jobs forums.

1. The Legend of Zelda: Breath of the Wild (Switch) - Bravely and brilliantly replaced the longstanding Zelda trope of "do a few large dungeons, get the Master Sword, do several more large dungeons" with a huge world that's really worth exploring. Exploring the wilderness and happening upon concealed shrines managed to re-evoke the feeling of discovery that I remember from playing the original NES Zelda as a kid!

2. Super Mario Odyssey (Switch) - Full of great surprises, beautiful art, fair challenges, and so many things to do. An even better iteration on the gameplay, level design, and themes of past Mario 3D titles (Mario 64, Galaxy, 3D Land) than I might have thought possible.

3. SteamWorld Dig 2 (PC) - Rolled into this directly after finishing SteamWorld Dig 1 for the first time, which turned out to be an excellent way to approach it, with the NPC Dorothy from the first game turning PC and searching for Rusty, the first game's hero gone missing. Solid digging gameplay with lots of fun character upgrades, both major and minor.

4. Blaster Master (2017) (Switch) - Blaster Master for the NES was one of my personal nostalgic favorites. A great update while still retaining the best parts of the original. Played through it twice, getting the fun surprise at the end of the second playthrough for 100%-ing the game up through the boss.

5. Mario + Rabbids Kingdom Battle (Switch) - Great tactical strategy game, minimizing the impact of luck on the gameplay, and building on the foundation laid by X-Com by introducing lots of neat new gameplay mechanics.

6. PPKP (iOS) - A simple yet interesting 1-on-1 brawler-type fighting game perfectly tailored to being played on a mobile phone. Manages to make a deep and rewarding combat and upgrade system out of only two in-game "buttons". App Store link.

7. Mario Kart 8 Deluxe (Switch) - My favorite racing game in a long time. I actually enjoy watching others play this almost as much as I enjoy playing myself; while just observing, I notice all of the beautiful graphics happening in the environment around the race track, whereas when I'm actually playing I tend to tunnel vision in on the race itself.

8. Metroid: Samus Returns (3DS) - A very cool stride forward in 2D Metroid games with the counter-attack and 360-degree free aiming systems, even though I think I may still prefer the elegant simplicity of the original Super Metriod (SNES) gameplay. Interesting to compare and contrast this Metroid 2 (Game Boy) remake with last year's indie take on the same, AM2R.

9. Cosmic Star Heroine (PC) - A 16-bit-style turn-based RPG in a sci-fi setting with an interesting new battle system. Steam link.

10. Fire Emblem Heroes (iOS) - A nicely simplified pocket implementation of the standard Fire Emblem gameplay. I enjoyed it when it came out, although I did lose interest fairly soon after reaching the level cap of 40, despite the new content and events periodically being released.

Honorable Mentions: Puyo Puyo Tetris (Switch); Hollow Knight (PC); Snipperclips (Switch).

Previously: 2016 (GOTY: Stardew Valley). 2015 (GOTY: Super Mario Maker).