For a long time, I’ve wanted a Spotify-like experience but with music I’ve collected over the years. I appreciate Spotify because I can stream music on my desktop and phone anywhere I am but I can also download music locally to my phone to save on bandwidth. That said, there are some things that aren’t on Spotify like video game soundtracks or ocremix content that I also want to have with me. While Spotify can download local content to my phone the process is a bit cumbersome and the interface is, honestly, not great for that.

Enter Plex and Plexamp. Plex, probably better known as the tool of choice for those heavily into piracy, is actually a great way to store, catalog, and play your music. But Plexamp (and a paid Plex Pass) as a client really takes the experience up a notch by offering an experience that is entirely focused on music playback including hi-res formats and gapless playback. It also has some really clever genre, mood, and artist-based automatic playlists that are super slick. Combine this with the ability to stream the music from outside your home and offline it (at any bit rate you want including FLAC) and you really have a winner.

While I could do a video showing it off I don’t think I could a better job than this one –

Once in awhile I like to read about what kind of software and utilities other people are using on their system to make their lives easier. It’s always interesting to see what mix of tools people are using and often times I learn about a new tool I hadn’t heard of before. Today I thought I’d do the same as I’ve started using a number of new tools on a regular basis just in the past six months.

As a systems engineer that is also familiar with programming I have what may be a unique mix of software and tools on my computer. Let’s take a look.

Operating System(s)

I have been using macOS full time since about 2008. I use macOS because it is a mix Unix and a GUI (NeXT if you’re keeping score) which gives me a familiar and robust command line environment with an excellent desktop environment.

I also use Linux heavily but almost never as a desktop or workstation. I have a laptop that I can dual boot between Linux and macOS for testing. I also run multiple Linux systems to run Proxmox for virtualization. Proxmox is a great way to get use out of otherwise retired computers. In fact, my Proxmox cluster is an older HP desktop with a quad core processor mixed with a pair of old MacBooks. I have written about Proxmox before and you can find it here.

I have one Windows PC that exists mostly because of games but also some business software.

Software Tools

When it comes to software these are the tools I use most frequently.

  • Code Editing and Runtimes/Languages
  • DevOps Type Stuff
  • Kuberenetes
    • kubectx/kubens for easy cluster and namespace switching
    • k9s for a text based UI to Kubernetes
  • Utilities
    • Brew
    • Patterns tool for working with regular expressions. Been using it for years but several tools now exist like it
    • iTerm 2 superior to the default terminal available in macOS
  • Other
    • Spotify for music
    • VirtualBox for testing Ansible roles
    • Twitter client
    • RamBox for chat
    • Bear for notes

UPDATE: This method is old and outdated. Most of the time this is probably what you actually want –

Sometimes when using Ansible there is the need to reboot a server and wait for it to return. This simple recipe will allow you to achieve that while also getting some nice feedback so you know what is going on. You can place these tasks into a role or just in your playbook:

- name: Store target host and user
  target_host: "{{ ansible_host }}"
  target_user: "{{ ansible_user }}"
- name: Reboot the server
  shell: sleep 2 && shutdown -r now "Ansible package updates triggered"
  async: 1
  poll: 0
  ignore_errors: true
- name: Wait for server to shutdown
  local_action: shell ssh -o BatchMode=yes -o ConnectTimeout=2 -o StrictHostKeyChecking=no "{{ target_user }}@{{ target_host }}" true
  register: result
  until: result.rc != 0
  failed_when: result.rc == -1
  retries: 200
  delay: 1
- name: Wait for server to be ready
  local_action: shell ssh -o BatchMode=yes -o ConnectTimeout=2 -o StrictHostKeyChecking=no "{{ target_user }}@{{ target_host }}" true
  register: result
  until: result.rc == 0
  retries: 200
  delay: 3

Wanted to quickly share some thoughts and links of software I’ve found recently and what I’ve been up to.

If you’re into home automation at all you have to check out Home Assistant. There is a bit of a learning curve initially but once you get an understanding of how to configure it you’ll find there is a lot of potential with it. I recently replaced my HomeBridge installation on my Raspberry Pi 3 with the prebuilt RPi3 image.

If you manage servers big or small take a look at Ansible. It isn’t new technology but it is something I’ve grown quite fond of recently. It’s easy to install on Linux, Mac and even Windows 10 if you have that oddly named Linux add-on. Even if you don’t use Ansible to manage servers you should use something.

If you enjoy Destiny or Destiny 2, checkout Guardian Theater. This is a project spearheaded by a friend of mine after collaborating with me on a Xbox GameDVR clip site ( and deciding it’d be way cooler if you could look up clips related to yours. Guardian Theater promises to show game clips recorded by other guardians while in the same activity as you. Lots of fun!

Lets get something out in the open. I’m really picky, particularly with consumer electronics. I expect something to work as advertised, intuitively, smoothly and without crashing. I’ll quickly dismiss a device over things others will quickly get over. The Western Digital TV Live Media Player is one such device that got great reviews that I simply couldn’t stand. It was advertised as a product that could play virtually any file format either through an attached USB device or through a network connection. What I found was it “could” do some of those things but only some of the time. It repeatedly crashed, treated the same file different based only on the file extension and in the end, the product was a nightmare to own and I quickly sold it.

So anyway, lets talk about Android. Recently the on call phone that is passed around between myself and two of my co-workers was replaced by a Droid2 (which I pushed for). The Droid2’s hardware is top notch. It has a high quality feel to it and a great, to my eyes, screen. I haven’t had much time with the camera so I really can’t say much about it.

Android on the other hand is a mixed bag and as my co-workers pointed out today, this is where my picky tendencies just get out of control. I find many parts of the Android OS to look fantastic, especially when not in motion, and have a polished feel, while other parts just feel half-assed. For example, waking the Droid2 from sleep quickly fades the screen into view which looks very elegant. You are then offered two basic options using the same motion, just in different directions. Pull the tab on the left to the right and you unlock the phone. Pull the tab on the right to the left and you toggle between vibrate only mode or sounds on. These are great except the animation of either tab looks rather poor. Once the phone is unlocked, the lock screen fades away to reveal the default interface, which again looks great and is very smooth. This disparity between how the screen fades so smoothly and poor unlock animation breaks the continuity of the experience. The two bits feel like different parts when they should feel as if they’re all one part melded together.

As a long time iOS user, if there is such a thing, there are other parts to the Android experience that really stick out. One of them is text input. So far, I have yet to find a text entry box that brings up the keyboard by default. For example, open the Gmail app and compose a new message. The keyboard won’t show unless you tap the To: field even though the To: field is focused by default. Another example. Add the Android News and Weather widget by doing a tap and hold on the a screen. Once added, attempt to manually add a location. You will be faced with an all black screen with a single text entry field that has focus and a magnifying glass to the right of it. There will be no keyboard even though clearly this is the only text box and the only thing to do on that form is enter text. Touching the already focused text box will cause the keyboard to appear allowing you to enter text. If you then click the done button on the keyboard the keyboard goes away and then nothing happens. You have to click the little search icon instead. I find this incredibly irritating.

Another surprisingly jarring thing is that list views aren’t able to scroll past either ends. The ability for a list view to scroll slightly past the top or bottom of the list provides a visual cue that you’ve reached the top or bottom of a list of items. On Android, the scrolling simply stops but you don’t always know that it has stopped because it is out of items or because it isn’t registering that you want it to scroll. In other cases where the entire list contains just enough items to fill the whole screen, you again can’t really tell if it isn’t scrolling because there are no additional items, or if the screen isn’t meant to scroll or if the hardware isn’t “getting” your gesture.

Speaking of scrolling. Android’s response to touch is great except for initiating a scroll, either up and down or left and right. It seems to take almost twice as much distance for Android compared to iOS to realize you want to scroll a list view or move between screens. Once Android begins scrolling, the animation looks poor and full of judder. Again, this distracts from an otherwise pleasant experience.

All that said, this phone is far superior to the previous phone that was Windows Mobile based. Windows Mobile wasn’t great then and compared to what is available today was positively atrocious. I think Android has come a long way in a short amount of time and I hope Android can close the experience gap with iOS in future releases. Until then, I consider Android versus iOS to be like Windows 7 vs OS X. While I prefer iOS or OS X, having to use Android or Windows 7 isn’t a step backwards, it’s just a different way of doing things.

In my previous post I talk about needing a TFTP server in order to serve some files to a hardware device. This post describes how I used expect to automate the process of logging into the hardware device and issue commands that copy in a config file, commit it to the device, upgrade the firmware and finally tell the device to reset to factory defaults and reboot.

Expect is a way to programmatically work with a normally interactive process. Using expect you can write a script that telnets into a system and then issues commands based on what it “sees.” Here is the script I used, with some important values removed, to automate the process of updating a number of devices.

set timeout 300
spawn telnet
expect "login: "
send "root\n"
expect "Password: "
send "tehmagicphrase\n"
expect "# "
send "cd /tmp \n"
expect "# "
send "tftp -g -r config.ini\n"
expect "# "
send " import config.ini\n"
expect "# "
send "tftp -g -r firmware.img\n"
expect "# "
send "firmware_upgrade /tmp/firmware.img 1\n"
expect EOF

The above script was saved into a file called pushConfig.expect and set as executable using ‘chmod +x pushConfig.expect’. To run the script, I powered on the device and waited for it to be ready, once ready I issued ./pushConfig.expect to start the update process.

Using expect is fairly straightforward. The most difficult part is ensuring you correctly tell expect what to look for before sending the next command. In the script above I do the following:

set timeout 300

This tells expect to wait at least 5 minutes for matching text before continuing to the next send command. What this means, is if I tell it to send some data it’ll wait up to 5 minutes to see what is in the expect line after the send. In the case of my script the firmware upgrade could take quite a bit of time and I didn’t want it to timeout so I set the value fairly high.

The next line tells expect to start a telnet session to a remote machine and then to wait until it sees:


Once it sees that it sends the username. The script continues like this until it sees EOF. At this point expect knows that the process is now complete and it exits.

By using an expect script I was able to simply power on the hardware device and wait for it to boot. Once booted I ran the script. This saved me and a co-worker a lot of time while pushing custom configurations and upgrading the firmware on a number of devices.

Expect is capable of a lot more than I used in my example and can react differently based on what it receives back from the interactive process or even loop over a series of commands. To learn more about expect try ‘man expect’ or search your favorite search engine.

Came across this article talking about progress being made with the new Apple TV in regards to jailbreaking and adding new functionality. Jailbreaking was recently ruled as legal. I think this is a big win for consumers who want to be able to use their hardware devices for whatever they want. For example, I think it’s ridiculous that Apple is allowed to force me to join their developer program if I want to write my own iOS application for a device I own. It’s perfectly reasonable that if I want to distribute my software using their App Store platform but beyond that I should be faced with such restrictions.

Also, just because jailbreaking has been deemed legal doesn’t mean pirating software is suddenly legal as well. There are still plenty of other existing laws protecting against that. In the next few months or years I think we’ll see additional clarifications with the DMCA and jailbreaking. For example, although the iPhone was specifically mentioned in the ruling, I actually don’t think it should be ok to jailbreak an iPhone for security reasons as it pertains to the cell phone network. The iPhone is part of a bigger infrastructure that is not owned and operated by the owner of the phone and in that case it’s a lot like a business PC being connected to a business network. At the same however, such a ruling will hopefully coerce Apple into providing a toggle on the phone allowing end users to install software outside of the App Store. This would satisfy what some end users want while still protecting the security of the cellular network.

Few weeks ago I was telling my co-workers how I wish there was an application that would put the windows of running applications back to “where they belong” when I plug my MacBook into a secondary monitor at work. Yesterday I finally found that app.


Apple announced yesterday that they will be streaming their September 1 event live. The catch? It’ll only work in Safari on Mac and on iOS devices. So in other words, only about 9/10’s of the internet will be able to view the live stream.

But that 9/10’s of the internet will be able to enjoy the exact same video stream no matter what device they are on, be it laptop or the tiny iPod touch. No need for a desktop optimized version and no need for a mobile optimized version. The same stream will play on any sized device.

Make no mistake, this is a giant stab at anyone who is arguing that flash is needed on Apple’s devices. If you need any further information about the state flash on Android you need only watch the video here and then read the comments. People love to rail on Apple while completely missing the point that having flash at all doesn’t mean flash works and a half-assed flash experience is not what Apple is willing to allow on their devices. Reading through the comments you’ll find a few people who argue that “at least it is there” and that “it doesn’t matter that flash sucks today because there are better phones coming out tomorrow.” That makes no sense.

I know someone who just picked up a new Mac and it got me to thinking, I bet people new to the Mac platform don’t know about all of the great software you can find for the Mac. I thought I’d write up a post on some of my favorite free and paid apps.

  • Firefox
  • RipIt: DVD ripping made easy
  • Adium: Multi-protocol chat
  • Growl: Must have notification system
  • NetNewsWire: RSS reader that syncs with Google Reader
  • BootChamp: Simple menu for rebooting directly into your BootCamp OS installation
  • Tweetie: Twitter client
  • iTerm: I can’t let go of this great ssh client.
  • 1Password: Store all of your passwords. LastPass is free alternative that is more cross platform
  • Automator: Built in robot too useful not to mention
  • Caffeine: Sometimes you just don’t want your Mac to dim the display or go to sleep.
  • Colloquy: Decent IRC client
  • Cord: Remote Desktop Client for Mac.
  • CrashPlan: Time Machine is good but I just have to have a second way of backing up all of our photos. CrashPlan really does a good job and has saved me.
  • HandBrake: Very good video encoder and DVD ripper (requires VLC)
  • Loginox: Swap out that ridiculous login screen image.
  • MarcoPolo: Change preferences based on your location or “context.”
  • MacFusion: Mount/Map ssh/sftp servers in Finder allowing any app to directly access remote files
  • smcFanControl: The Mac generally does a good job with the fan but there are times when having it cranked up on high is a good thing, especially for your lap.
  • NTFS-3G: Mount NTFS drives as read/write
  • SmartSleep: Preference pane that allows you to adjust how your Mac sleeps or hibernates

I think that about covers it. There are far more applications in my applications directory but the apps I listed are must haves in my book. If there are any apps you think I missed leave a comment.