New 5k Record

August 16th, 2019

I’ve been getting more into running again this summer, trying to really push myself after spending a couple years doing indoor stationary biking a lot more consistently to get stronger. I had previously been in my peak running shape around 2013 and slacked off in the years after that (the ‘second kid’ excuse).

Up at Camp Balsams there’s a great 4.2 mile loop around the lake which I like to run in the mornings, and I got a chance to do it twice in the 5 days we were there in June. That was really good practice to push for a longer distance and I managed to beat 9:00/mile never stopping to walk, though it was a slog.

Since then back at home I had a few runs slowly getting faster, and finally hit a major milestone earlier in this week, breaking my 5k personal record! I knew at the start after the first mile that this was probably going to be a record run; usually I’m slow early on until my body remembers how to pick up the pace a bit. This time my first mile was fast enough that all I had to do was hold that pace. I ended up getting a bit faster towards the end.

DNS redirection

June 2nd, 2018

Whew, finally got DNS setup to work from Hover to Azure! I was stumped on this for a while, until I eventually discovered that the problem was not any of the domain records I was adding (CNAME, A, etc.), but with the name servers. It still had the old name servers from the previous setup, so switching them to and was the trick. I did enjoy learning about to watch DNS updates propagate.

Azure Hosting

February 25th, 2018

This blog is now migrated over to Microsoft Azure! I’m interesting in checking it out as a more functional web host now that it has developed in the last few years (along with Amazon AWS). Specifically, looking forward to being able to host Python and nodejs apps that I’ve been working on, but just running locally so far.

The setup process for migrating the WordPress blog over from my old host was pretty smooth, all things considered. I made the mistake of updating WordPress on the old site before doing the export, and that update broke WordPress and caused it to start erroring on any admin page. That led to some hasty tinkering with the Javascript to skirt around the errors, and ultimately getting it working well enough to do the export. The posts and images seem to have moved over with no errors after all that, though.

Three Years Of Updates

August 30th, 2017

It’s been a super long time since I posted. I think it’s the second kid – the amount of free time really drops down when you don’t have free time when the one kid naps! Of course, it’s all been more than worth it.

Here’s a little glimpse into some of what’s happened in the last three years since 2014:

-I’m still doing much the same thing at work, but I’ve shifted back to a more individual contributor role, and not mostly management all the time. I still have a healthy mix. Ultimately, I get to feel like I really built something or solved a technical problem most days, and that’s the thing that keeps me motivated. So 2017 has been a good year at work as a result of this change.

-Evie is doing amazing. She starts kindergarten next week, and she couldn’t be more ready. Yesterday she used a little notebook and wrote a book about her life so far. No fear about any spelling mistakes, which is such a big improvement on confidence from even six months to a year ago. She’s an awesome kid and really fun to be around and play with. Her favorite new joke that she wrote all herself: “Why do cows love swimming in the waves?” – “Because waves are caused by the moooon.”. We just started watching Star Wars together and her excitement is a lot of fun.

-Grace is similarly lighting up our lives with her bubbly personality, kindness, and awareness for her age (3 and a half now). She is already a little mediator among all the family members, always sharing any food or toy she has, and often piping up just to say: “Daddy” or “Mommy”…. “I love you”. It just melts our hearts.

-I spent a lot of my free time the last three years playing Magic. As always, I get a lot out of having a cerebral hobby that I can really puzzle over all the time. I had a few good finishes which go on the ‘permanent’ record, which is cool. Also got one medium-sized tournament win which I saved the certificate for and framed. Overall, I won at about 55% which I’m happy with given that I seem to not really be a natural at it. It’s a bit on the downswing now with an increase in kids activities, and a diversification of hobbies in general. Not sure how much I’ll be into it going forward.

-I’ve been slowly getting into beer brewing; just made the third batch a couple months ago (Belgian Dubbel). It was ok – a little too hoppy, and we need a more consistent temperature and carbonation. But we’re not using any pieces of the Mr. Beer kit any more, so it feels more real. It’s fun to have something to improve on, and something that is a great conversation topic with lots of people in our lives.

Overall, things are going even better than they have any time in the past, especially with our little family of 4. Lots of positives and I feel very grateful for where we’re at in basically all aspects!

Shopping List Balsamiq

May 4th, 2014

With the release of Angular 1.2 and a desire to keep practicing my web programming skills, I’m working on an upgrade to our Shopping List AJAX app to allow switching between lists. The use case is the need to have a succinct list for each store we visit, since we often have to sequence trips in parallel for various reasons. Having just a single list breaks down pretty quickly in that workflow due to lots of scrolling, or being unable to hit ‘clear’ without wiping out items from the other store.

Through lots of design time at work I’m starting to get passable at making mockups in Balsamiq, so I thought it would be a useful exercise to try taking the skill home. Here’s where I’m at so far (only have a few minutes here and there to work on it).

Still need a solution to the question of how to see all the items at once, which is an unusual UI interaction that seems like it would suggest some sort of “filtering” concept. Maybe a design with a single master list and a filter for each store (including a default filter) is the next one to explore.

On the technical side, I am still figuring out whether this is a good time to tackle switching the backend over from PHP to something a little bit newer and flashier. Simple file I/O was fine initially, but having two layers of tables seems like it will be a huge pain to do without a real database, and I’m not sure spending a bunch of time hacking together PHP + MySQL is really the thing to be doing in 2014. Looking instead for something that integrates nicely with the Angular $resource model, which I haven’t found yet.

Crafting vs Untangling

April 26th, 2014

One of the things I think a lot about during my day job is what motivates people to passion, particularly software developers working on a large integrated system. I’ve certainly learned a lot over the years about the differences between people’s worldviews and styles, and met many developers who derive their satisfaction from technical work in all kinds of ways that never would have even occurred to me.

The most interesting axis of differentiation I’ve run across is the spectrum between engineers who like to craft, build, and own new things on the one hand, and engineers who like to unravel deep and intricate mysteries on the other. These are not mutually exclusive, but I’ve found that everyone has a comfortable spot somewhere on the continuum where they can derive maximum joy from their time spent at work.

Build from scratch

Engineers who are fundamentally crafters have a similarity to the stereotype of a “startup developer” – the desire to be in on the ground floor, see the fruits of your labor, and have a big hand in the direction of a product. Pride of ownership is a big part of job satisfaction, and being publicly viewed as the creator of something is a deeply satisfying ego boost for these folks. They tend to enjoy demoing their feature and working with customers to implement it, even when those become long tasks that take them away from future programming.

Reveal the mystery

On the other hand, engineers who are problem solvers at heart find pride in their ability to understand what no one else can, and dig to the heart of an existing issue more quickly than other people. They can thrive on pressure and get their joy from the “aha” moments that happen in private, as another layer of the puzzle falls away and they reach deeper understanding. These folks can easily be happy doing systems programming on a large codebase, where there is complexity by the truckload for those with the desire to untangle it.

Be true to yourself

My (limited) experience has been that the majority of programmers fall into the first camp. The desire to craft brand new seems to spring naturally out of the engineering mindset, so this tends to be the comfortable mode of working for computer science students and new graduates. The ability to self-identify on this spectrum and choose work that best fits your personal bent is an under-appreciated talent that more software developers should spend time honing. I expect that reaching a better understanding of this concept would be helpful for most developers’ job satisfaction and avoid burnout or boredom that might otherwise be unexplained.


Reset the Swing Timer

October 10th, 2013

Last week we took a family road trip, and as a result I spent a lot of time driving the van through beautiful weather… but also a lot of time driving the van through rain. Owego, NY is a nice quaint town which we discovered has the tiny little downside of actually being buried in water for part of each day. We also hit the remains of something apparently called “thundersnow” on the way out of Pennsylvania.

What struck me while fiddling with the windshield wipers was a cool feature that I haven’t seen on any car I’ve owned before: when I turned the dial to increase the intermittent speed, the wipers always immediately swing (even if they weren’t due to swing yet). This is a subtle thing and it only makes a second or two of difference, but it seems to me a brilliant example of thoughtful design. The only real reason anybody would turn the dial is because they need more wiping, and they need it now, so why not oblige with not just a faster interval, but an immediate wipe?

As soon as I thought about this I was reminded of video games – it’s fairly common in Action RPGs to have an ability that temporarily increases the potency of your weapon swings, and some of these abilities actually do the same thing: they reset the swing timer so that as soon as you hit the button, you immediately get to see an attack with the new ability. It’s a nice visceral effect that gives an increased sense of control and feedback.

A similar scenario comes up in software development occasionally – I’ve seen a particular case where there’s a setting that allows changes on a web page to be immediately “auto-applied” (vs. having to queue them up and click Accept later on). If a particular user prefers the auto-apply feel, they almost certainly want any changes already queued up to be applied immediately when they turn on auto-apply. Having to turn on auto-apply but then still go click Accept is unnecessary extra work.

I’m not sure if there’s a term for this design principle of tacking on an immediate effect to a rate-modifying adjustment. I couldn’t find any references online, but without Google keywords it’s hard to know what to look for. In any case, it’s a good one to consider whenever you’re designing a switch or dial that impacts future state or user actions – is there any way to give the user an immediate effect that they likely want? Furnace manufacturers already have this figured out; they make very sure that when you crank up the heat on the thermostat there’s some kind of immediate reassuring audible or tactile feedback.



Designing Around User Interface ‘Flicker’

August 19th, 2013

A few months ago I rolled out a total overhaul of my Shopping List web app using AngularJS, which was a lot of fun and has in general been a success from a programming/tinkering perspective. It was not, however, a success in user happiness, as we found out the hard way the first trip to the grocery store using version 2.0.

The problem? As part of the overhaul I had patched a data integrity bug where two delete requests are sent in quick succession and it’s ambiguous to the server which line to delete (that’s an architecture problem for another day).  I thought this was a nice change which prevented a rare scenario of accidentally deleting the wrong list item. It turned out, however, that this actually created a workflow where the server update message can come back and can subtly shift the client UI a second or two after the user expects that it’s already done updating, restoring the entry that the server believed to have been deleted in error.

Screen Shot 2013-05-13 at 1.54.17 PM

When the red X is clicked, that row will be deleted… usually. Sometimes it will go away, and then pop back unexpectedly. What a ‘nice’ feature!

This meant that just about the time the user goes to tap the next item to mark it done or deleted, the server rudely shoves a new item into the list and jumbles up the tap targets. This behavior and its unfortunate timing makes it very, very easy to click on the wrong thing. In practice this is just as bad as the bug I had meant to fix, because it manifests in the same behavior of an accidentally lost entry.

Trying to solve this design issue got me thinking about this interesting class of bugs: cases where a user interface updates just before you try to click or tap an element, causing you to hit the wrong one. It comes up somewhat often in web browsing if you’re loading a page with lots of images and trying to click a link towards the bottom of the page. As each image above you loads, the link you’re trying to click can shift. This creates a frustrating race where you have to chase the click target down the page. You can also see this in iOS when you’re looking at a single image in Photos, and you get stuck in loop between tapping the HUDless screen to bring up the “Back” button and trying to actually tap “Back”. For me personally, my brain->finger pathway seems to have exactly the same timing as the UI delay on hiding/showing the HUD, so I can never quite tap on the button I want to until I force myself to stop and break the loop.

I don’t really have a great solution to this problem. One technique I’ve seen applied in mission-critical professional software is the use of a ‘shield’ which blocks all user input when the application knows that a server refresh is pending. This seems to work ok, but it’s tricky to get the user experience right because it’s replacing a rare misclick/mistap scenario with frequent appearance of unresponsiveness. As long as the UI both indicates the reason for the lack of response (maybe with a ‘Loading’ icon) and allows the user to somehow read data underneath if necessary, it seems like a viable path. This only stretches so far, though: after a couple seconds of loading I would expect users to abandon the screen rather than continue to wait. It’s also potentially making the 95% case a worse user experience for the sake of the 5%, which is probably a mistake in most software.

For this particular shopping list application, my solution was to consolidate all workflows that cause row insertion/deletion outside the list itself, so that the risk of a race condition between ambiguous server commands is mostly eliminated, and there aren’t destructive buttons shifting up and down anyway. It seems to work ok for now, but even here it feels like we lost functionality to deal with a bug that, while frustrating when it does manifest, is only relevant a percentage of the time. Here the timing of the server requests made this percentage high enough for a change to be worthwhile, but I’m not sure that’s often the case in other applications.

Network Jack: first attic project

July 30th, 2013

Three home improvement posts in a row – been thinking about the house and designing our lifestyle quite a bit lately. For a while we’d been living with a network cable strung over the ceiling, but it  was unsightly and a horrid cable management failure, so this week was the time to fix it and add a new network jack next to the built-in desk there.

Here’s the setup in its most visible state – not shown is the difficulty of actually climbing up into the attic and drilling the hole in the cross-brace beam so that I would have a spot to pull the network cable up. Somehow I had the impression that this beam would be a 2×4, but there was a second beam underneath it – this took a good 30 minutes of drilling and moving sawdust to punch a 1-inch diameter hole through the entire width. To make matters worse, my first attempt was in the wrong spot and I had to move over 18 inches and do it all over again after we realized that.

The mounting box is a nifty contraption that uses plastic flaps which catch the drywall when you screw them in, so that you don’t have to nail it sideways into a stud. Much easier install when you have an existing finished piece of drywall to work with. If you look closely you can see that I chickened out and used the easy male-to-male RJ45 connectors on the back of the plate, instead of splicing out the copper wires and punching them down. I’ve done that once before (similar project in the old house), and that was enough for me.

The connection on the other side is to one of the cool things about the house – a mini network cabinet in the upstairs closet. We aren’t using the breadboard thing, but it’s a perfect spot for a router that previously connected to four different ethernet outlets around the upstairs, and now hooks up to five. I tried to use the side-mounted tube to pull in my new cables, but could not find any possible access without completely taking out the drywall in the room opposite it. Not worth it for a closet that no one ever sees – I’ll have to put some adhesive to block up the tiny amount of vertical hole that’s free around the cables.

Success – 1Gbps link! As for whether this is worth it compared to wireless – while WiFi covers most use cases, this is our machine where we do all the photo importing and manipulation, and our photos live in a mounted directory on the NAS instead of local storage. Very tough on the bandwidth to do all the photo copying, rotating, and sorting over WiFi; this has worked out much better. Plus, excuses to tackle a home improvement project are always welcome. The sense of accomplishment alone is worth it!

One Kludge at a Time

July 15th, 2013

Yesterday I discovered to my surprise that the gate at the top of the stairs was falling out of the wall! I’m not sure why I let the instruction manual talk me into using only drywall anchors for something that heavy. They failed after just six months of normal use, even without a kid hanging their weight on the gate as far as I know.

So during nap time yesterday I decided to try a quick reinforcement hack of screwing the gate into studs instead, via a board on the wall. It doesn’t look great, but I found some reasonable pieces of laminate that sort of match the surrounding wood tones. Not bad for an hour of improvising! I like that it’s a good example of how the character of old houses is built up from urgent need and compromise, one little step at a time.