Kenneth Jenkins

  • Android APK patching

    Recently I’ve been job hunting, and so I’ve been reflecting on my past work experience. One position I applied to had a required “portfolio” link, and at first I thought that must have been a mistake in the application form. But upon further reflection, I thought, for a front-end engineer, why not? This got me wondering if I could dig up screenshots/recordings of any of the features I’ve worked on in previous roles.

    Read more…
  • Adventures in consumer electronics repair: GE clock radio

    I’ve had this GE clock radio ever since I was little. I took it with me to college, and then after I graduated I brought it with me across the country. It’s been a faithful companion over the years, but it’s starting to show its age. The main slider for selecting between off / on / alarm / music doesn’t work reliably. The radio also has a 9-volt battery backup for keeping the time when there’s a power interruption, but lately it seems to run fast when it’s on backup power.

    Read more…
  • Advent of Code 2020: Day 19 reflection

    Advent of Code 2021 starts tonight! But before then, I have one more reflection from last year’s challenge to share. This one is about the day 19 puzzle, which, to be perfectly honest, I did not particularly enjoy. From the puzzle description: The rules for valid messages (the top part of your puzzle input) are numbered and build upon each other. For example: 0: 1 2 1: "a" 2: 1 3 | 3 1 3: "b" Some rules, like 3: "b", simply match a single character (in this case, b).

    Read more…
  • Advent of Code 2020: Day 18 reflection

    The day 18 puzzle from last year’s Advent of Code involved parsing and evaluating arithmetic expressions, but with a twist: The homework (your puzzle input) consists of a series of expressions that consist of addition (+), multiplication (*), and parentheses ((...)). Just like normal math, parentheses indicate that the expression inside must be evaluated before it can be used by the surrounding expression. Addition still finds the sum of the numbers on both sides of the operator, and multiplication still finds the product.

    Read more…
  • Advent of Code 2020: Day 13 reflection

    The day 13 puzzle from last year’s Advent of Code was the first one that left me really flummoxed. Part 1 (the warm-up) was straight-forward enough, but part 2 required left me feeling like there was some really useful math that I didn’t know. The puzzle was about a set of buses that all take different amounts of time to complete their routes, and keep looping around forever. After getting past all the flavor text, part 2 of the puzzle boiled down to this: given a set of tuples \( \{(k_i, n_i)\} \), find the smallest non-negative \( t \) such that \[ t \equiv -k_i \pmod{n_i} \] for all \(i\).

    Read more…
  • Advent of Code 2020: Day 5 reflection

    The day 5 puzzle from last year’s Advent of Code talks about airplane seat numbering using “binary space partitioning”. From the puzzle description: Instead of zones or groups, this airline uses binary space partitioning to seat people. A seat might be specified like FBFBBFFRLR, where F means “front”, B means “back”, L means “left”, and R means “right”. The first 7 characters will either be F or B; these specify exactly one of the 128 rows on the plane (numbered 0 through 127).

    Read more…
  • Advent of Code 2020: Introduction and Day 4 reflection

    This year’s Advent of Code is just around the corner! I had a lot of fun with these puzzles last year, so in honor of the occasion I thought I would share some of the things I learned over the course of the challenge. For the unfamiliar, Advent of Code is an Advent calendar where a new programming puzzle unlocks each day of December (from the 1st through the 25th). Each puzzle has a part 1 and a part 2, where part 2 is usually a more complicated variation on the first part.

    Read more…
  • A misleading error when using gRPC with Go and nginx

    I wanted to document an issue I ran into while trying to write a gRPC service in Go, in case someone else just so happens to run into the same problem. The scenario was this: I had a web service written in Go serving both HTTP traffic and gRPC traffic in plaintext on the same port using nginx as a reverse proxy to provide TLS. This might seem a bit contrived, but it came about fairly naturally.

    Read more…