We got our shit together just in time to run out of money

The relationship between the engineering team and the product team had become deeply exclusive and bordered on adversarial. Engineers felt like the product was being developed behind closed doors without regard for feasibility or clearly-communicated timelines, and product managers felt like engineers were sandbagging and resisting change necessary to reach…

IKEA VATTENSTEN low voltage 5V LED strip with Raspberry Pi Pico controller

I recently picked up a few VATTENSTEN low voltage 5V LED strips from IKEA because I figured they’d be easier to integrate into a USB-powered Raspberry Pi or Raspberry Pi Pico project. I was right!

Quality of life improvements for SSH via AWS EC2 Instance Connect

While doing some work in AWS with EC2 instances through Systems Manager, I needed to be able to connect via SSH in a reasonable way. The AWS docs for Session Manager show off SSH’s ProxyCommand, but I also needed to use EC2 Instance Connect to send my public key ahead…

Hackaday Superconference 2023 – Day 3 – Simon!

In the final day of Hackaday Superconference 2023, I feel like I started to get into the groove of the conference. During the afternoon, I found a spot to play around more with my badge while within earshot of a couple of sessions that–frankly–were beyond my level of understanding in…

Hackaday Superconference 2023 – Day 2 – Leekspin

Second day of Hackaday Superconference 2023 was a bunch of fun. I had the delightful surprise of unknowingly chatting with Benedetta Lia Mandelli and Emilio Sordi the day before only to see them on stage presenting the Soft Actuator Orthosis talk. They seem like neat humans working on ways to…

Hackaday Superconference 2023 – Day 1 – How do I JPEG?

First day of Hackaday Superconference 2023 down and I’ve had some time at home to tinker with the code on this year’s badge. The badge itself has some nifty analog-ish oscilloscope-like features that I’m sure I’d understand and enjoy more if I knew more about electrical engineering. However, I do…

isIsomorphic - Interview question of the week from rendezvous with cassidoo

Wow, I haven’t done one of these for a few months. Let’s see how this goes!

maximumProfit - Interview question of the week from rendezvous with cassidoo

If I’m going to use Elixir, I might as well make use of its pattern matching!

explodeString - Interview question of the week from rendezvous with cassidoo

I’m doing some work in Elixir now, so I figure I’d take a shot at this week’s question with Elixir.

missingLetters - Interview question of the week from rendezvous with cassidoo

Simple, no-frills solution to this week’s question.

trimArray - Interview question of the week from rendezvous with cassidoo

There’s a really simple one-liner for arrays, but what about using this with generators? (i.e., the iterator pattern where a length is not known until reaching the end of the iteration)

mmmPie - Interview question of the week from rendezvous with cassidoo

How can I write a piece of code that can be written quickly and trivially understood? I think it’s mostly good variable names in this case. (And I handle infinite pie!)

binaryPal - Interview question of the week from rendezvous with cassidoo

What’s faster: a typical JavaScript implementation of .toString() and some basic string manipulation or clever bit shifting? (TL;DR: It’s bit shifting, but it’s uglier code.)

oddSquareSum - Interview question of the week from rendezvous with cassidoo

In this case, writing tests to prove the solution was far more interesting than the solution itself.

removeZeroes - Interview question of the week from rendezvous with cassidoo

The simple case wasn’t hard, but the low-memory iterator pattern was a fun, self-imposed challenge.

rollDice (by ChatGPT) - Interview question of the week from rendezvous with cassidoo

I decided to tinker with ChatGPT while working on an answer to this week’s question. While each implementation was passable and useful as a starting point, it became almost immediately clear that ChatGPT’s contextual understanding of its own output is fairly limited. Iterating with ChatGPT on its own technical output…

scramble - Interview question of the week from rendezvous with cassidoo

The tests were harder than the implementation 🥴

numBalanced - Interview question of the week from rendezvous with cassidoo

This one was fun to think about the minimal amount of processing needed to produce the result. In this case, the question is carefully worded to allow naive processing that’s really fast.

Apple HomeKit-enabled workshop air quality monitor

After I built the cardboard stock sorting shelf, I had about a week of breathing issues as a result of poor ventilation from the sawdust and particulate in the air in my garage. Resolved to avoid another week of feeling crummy, I bought a beefy fan and have eventual plans…

A1 Reference Style Spreadsheet Column Names - Interview question of the week from rendezvous with cassidoo

Nice little brain teaser involving number base conversion 😄

missingBits - Interview question of the week from rendezvous with cassidoo

Nice, bite-sized algorithm question.

Spin the Wheel - Interview question of the week from rendezvous with cassidoo

Well, I spent quite a bit more time on this tonight than I’d originally anticipated. It’s not pretty, but it does work and has a little bit of viable game theory.

sumEveryOther - Interview question of the week from rendezvous with cassidoo

This was a fun, light interview question this week.

Updated Flipper Zero CO2 Monitor

Well, I finally got around to updating my CO2 Monitor to take advantage of the latest APIs in the Flipper Zero firmware. (It wasn’t quite as bad as I thought it would be 😅) Now it even has its own application icon!

Guidelines for backlog refinement sessions

Formerly referred to as “backlog grooming,” backlog refinement is the process of defining pieces of work and estimating the amount of effort required to complete them. Backlog refinement requires buy-in from developers, testers, and stakeholders (product managers, business folks, etc.). Doing this refinement work results in a clearer understanding of…

rectangleSum - Interview question of the week from rendezvous with cassidoo

This one was tricky to stay mindful of the number of iterations.

Manually calibrating the Sensiron SCD30 CO2 gas concentration sensor

I picked up an Aranet4 Home CO2 sensor on a Black Friday sale and have finally had the chance to run a commercially-calibrated CO2 sensor against my DIY CO2 monitor on the Flipper Zero and found that my sensor needed some calibration.

verticalSlashes - Interview question of the week from rendezvous with cassidoo

I do enjoy getting Cassidy’s newsletter late Sunday/early Monday and trying my hand at the “interview [questions] of the week.”

How working on Developer Experience (DX) improved knowledge sharing and enabled more developers to contribute to a project

A four-year old Android app installed on thousands of transit buses needed some serious improvements to usability and reliability. The product team proposed a bold vision for improving the user experience for bus operators, but the development team was mired in a codebase that was hard to understand, difficult to…

Writing software that works with hardware

I’ve been working on a lot of hardware projects lately: making text-to-speech appliances work on transit vehicles, making software for internet-connected signs, prototyping tools to help me make good health decisions, and building out my go-sensors libraries to support physical environment sensors. I’ve spent a lot of my time as…

A story about protocols and documentation

In April 2021, I had a problem at work: I didn’t understand how our on-vehicle application communicated with the text-to-speech appliance to make next stop announcements.

Prototyping a real CO2 monitor on the Flipper Zero

Updated January, 12, 2023

Prototyping a volatile organic compound (VOC) and CO2 monitor on the Flipper Zero

I’ve been playing with environment sensors for a while to help me understand how factors of air quality correlate to my health. In 2019, I had a particularly bad asthma attack that was exacerbated by wildfires in California. Since then, I’ve learned a lot about how 2.5 micron particulate matter…

Using Excel to make changes to GTFS feeds

In my work at GMV, I’ve had need to inspect and edit General Transit Feed Specification (GTFS) feeds on numerous occasions. A GTFS static feed is simply a ZIP file containing several CSV-formatted text files that describe the routes and schedules of a transit agency. Because GTFS is a specification…

Interviewed for "How to plan smarter for event-driven architecture design"

I was interviewed by my friend and author, Bob Reselman on the topic of designing systems with event-driven architecture (EDA). His article–which includes a great primer on how to think in terms of events–is published at RedHat’s Enable Architect.

mRNA Vaccine Visualization (and cute frame for my vaccination record card)

I grew up with my mom telling me stories about chicken pox, and then a few of my friends caught it. I avoided catching the pox and I was able to be vaccinated against it. Now I’m an adult with a significant protection against shingles! I think vaccines are fantastic…

I tried to make a watering device for my cat

My cat has an addiction to drinking directly from the tub’s faucet. We’ve tried to get him nice water dishes and electric pump water fountains, but he just craves that good, good tub water. (And is extremely vocal about when he wants to drink.)

How I Built a Twitter Bot Using Auth0 Webtasks and

I wanted to build something small, fun, and socially-engaging. I have been following Darius Kazemi (@TinySubversions) and the community of bot makers at Botwiki (@Botwikidotorg), and I decided a Twitter bot was the way to go. I have also been following the US Executive Order 13792 pretty closely. The order…

MQTT, Mono, and ARM

I wrote a .NET program to test building and cross-compiling an application to run on a Sierra Wireless AirLink RV50 gateway.
Think LINQ

Think LINQ – .SequenceEqual()

Up until March 26, I had come up with a number of crazy concoctions to test whether one IEnumerable<> was equal to another. Some of them chained together .Intersect() with .Count(), comparing the count of the elements in the intersected set with the count of the elements in each of…
Think LINQ

Think LINQ – .Skip() and .Take()

Needing to page through a collection is nothing new, and LINQ handles this nicely with two different methods: .Skip() and .Take(). The .Skip() method will skip over a specified number of items in an IEnumerable<>. The .Take() method will iterate over a specified number of items of an IEnumerable<> and…
Think LINQ

Think LINQ – .Any() and .All()

“I just want to know if there’s anything in this List.” “Do any of the strings in my array start with ‘q’?” “How can I be sure all of the Rectangles in my IEnumerable<> have a width of 10?” These are the types of questions .Any() and .All() can answer.…
Think LINQ

Think LINQ – .SelectMany()

I recently came across a beautiful example of .SelectMany() used to find all types that implement a particular interface in all currently loaded assemblies. With minor alterations, here is how I used it:
Think LINQ

Think LINQ – .ToLookup()

There is an class in the .NET generic collection framework that is often overlooked: Lookup<>. In effect, a Lookup<> functions like a Dictionary<> whose value is an IEnumerable<>. Though Lookup<T,U> is an implementation of IEnumerable<IGrouping<T, U>>, it functions with a similar efficiency to Dictionary<T,IEnumerable<U>>. Part of the LINQ extension methods…
Think LINQ

Think LINQ – .ToDictionary()

There are a number of reasons to use Dictionary<> objects. Aside from the obvious name-value pair uses, Dictionary<> can also be used to essentially “index” an IEnumerable<> of objects. In testing with my colleague, Ryan Davis, we found that for IEnumerable<> collections that we intended to search through on a…
Think LINQ

Think LINQ – .Cast()

Personally, I find that .Cast() is an often overlooked part of LINQ. Of course, .Cast() is handy when casting each element of an IEnumerable<> from one type to another. However, one detail in its method signature brings to light a much more interesting use: .Cast() extends IEnumerable, the non-generic interface,…
Think LINQ

Think LINQ – The Wonder of IEnumerable<>

Language INtegrated Query, or LINQ, is a .NET feature that makes possible a powerful and extensible query on objects and collections thereof. LINQ is really a combination of a few key components: extension methods and generic collections. Understanding these two key components makes it much easier to “Think LINQ” when…