I’m Daniel James. I write things here when I feel like it. Find me on the fediverse (Mastodon, et al.), GitHub, LinkedIn, or a myriad of other sites.
Newest Posts
I love bikes and trains, and so do a bunch of my friends at Pasadena Complete Streets Coalition. There was a call for contributions on this post, and I got to share a blurb about a ride I did with a couple friends a few years ago.
The Orbic RC400L is a pretty cheap mobile hotspot that happens to run a version of the Android OS. It’s handy to have a small device that slips into my pocket or my backpack, but the power button is very easy to press unintentionally. So I designed a case to…
I’ve been working on building a Raspberry Pi cluster and decided to jump into the “mini rack” world after seeing the trove of information that Jeff Geerling and his community have assembled at Project MINI RACK. I saw the Flyht Pro Stage Rack case and found it to be the…
Things I write about
More Posts
regexed game
🗒️
After a very busy (and pretty traumatic) several months, I’ve decided to drop the “daily” from regexed’s tagline and start publishing the puzzles I have in the queue. For now, I’ve decided to publish weekly Saturdays. (Midnight UTC)
As a part of my prior experience dissembling “smart” air purifiers, I have had a couple of Cubic PM1003 indoor particulate sensor modules sitting in my electronics stash. Since I had already tracked down the datasheet with the UART protocol and familiarized myself with it, I knew I could use…
Multiple fires in Los Angeles have put smoke and ash into the air–and it’s worse than with many other wildfires because it’s not just burned wood and brush. Keeping the air in your home as clean as you can make it is important to prevent getting sick with breathing problems.…
regexed game
🗒️
As I’m working through the initial tranche of puzzles for regexed 🗯️, I’m finding myself diving specs in order to validate my own work. It’s a trove of “Today I Learned” content.
A couple years ago, I added a very bright 12VDC LED strip to my bike along the down tube and around the head tube. This increases my visibility at dusk and at night significantly, and illuminates the road really well as I’m riding.
Last month, I added some of the 300mm NOODS LED strands to my Adafruit order because they were on sale and looked like they’d be fun to make something with. I was enamored with how flexible and bright and noodly they are and really wanted to make something that highlighted…
regexed game
🗒️
I’ve managed to write 10 puzzles so far. The challenge for me right now is developing the habit of making time to write a puzzle. Once I’m in “puzzle editor” mode, the actual thing comes pretty easily and I enjoy the process of writing while playtesting my own attempts at…
regexed game
🗒️
Today has been a pleasant bit of flow time. I got the game engine worked out enough to actually make a full game cycle and did some refinement (and winnowing) of the puzzle concepts to get to a point where I feel comfortable enough putting it in others’ hands for…
regexed game
🗒️
I love Regular Expressions. This might place me among a small group of people, but I have enjoyed the puzzle of figuring out the arcane incantation to match the text I’m looking for.
A few years ago, I wrote a tool–mostly for myself–to convert a GTFS file into an Excel spreadsheet and back so that I and my colleagues could make quick edits with comfortable tools. The command line tool I wrote was not particularly friendly to non-developers. I really wanted to make…
After building the framed display for my SAO collection, I realized the last demo on the badge was running Pew! Pew!, which isn’t very interesting to look at if you’re not actively playing the game. So I made a neat little “firework” animation with shifting colors in center!
I had a great time at the Hackaday Superconference this year and collected a bunch of ShittySupercon Add-Ons for this year’s badge. They were too good to just put in a box and leave unseen, so I pulled an unused frame out of the closet, painted a piece of plywood,…
I love a good use case for a reducer. Also, TIL that reducer support on JavaScript Iterators is available in the very newest browsers.
There’s a game called “Liars’ Poker” that I play frequently with my wife and our gamer friends. It is a bluffing game played with a deck of poker cards and a keen knowledge of standard five-card poker hands. All players in the game start out with two cards in hand.…
There are a lot of ways to organize humans in the activity of developing software. The popular methodologies like Agile and Kanban are decent for prioritizing the speed of delivering a piece of software while working with a competent and highly autonomous group of workers. Other methodologies like those commonly…
After writing up a summary of day 2, I got the itch to make a game on the badge. I had a few criteria I wanted to satisfy:
I wanted to be present and attentive during talks, so I didn’t do any programming at the conference today. I did, however, have several conversations with folks and hand out a few more Petal Matrix diffuser covers.
Ever since the badge reveal, I thought the the Petal Matrix SAO looked neat, and I wanted to be able to make something that I might be able to trade with other conference-goers. Since it’s a cool illuminated thing, I thought maybe a diffuser cover might look cool!
After a satisfying fit test of my diffuser cover, I got to work testing out the logic to light up the Petal Matrix SAO. My goal was to be able to drag my finger around the schematic image on my phone and cause the petal to light up with a…
Since this year’s Hackaday Superconference is all about ShittySupercon Add-Ons, I really wanted to make one for my badge. I was inspired by John’s really slick cursive script name tag, but I am far less acquainted with the tools and techniques he used in his add-on.
It’s only a few weeks away from elections in the United States and–like most folks here–I am deluged in spam texts every day. Most of them are annoying, but easy enough to ignore. The obvious “USPS customs” scams are easy to spot and block as junk. But occasionally I’ll get…
The Hackaday Superconference 2024 schedule was released today and I’ve been very excited to see who all is speaking and what fun stuff I’ll plan to attend. However, the schedule on the site was pretty hard to conceptualize and there wasn’t a machine-readable format for calendar apps.
The UE ROLL 2 wasn’t made to be serviceable, but that didn’t stop me.
In 2019, I was wrestling with needing to build robust, real-time data processing systems in my role at GMV, so I turned to the industry of telephony for inspiration. I picked up a used copy of the out-of-print book Signaling System No. 7 (SS7/C7): Protocol, Architecture, and Services and started…
I needed something to focus on for a bit and I already used up the free puzzles on the NYTimes app.
I’m trying a new format for projects I’ve done that I don’t really have good write-ups for. I repurposed a canvas bag a while ago and sewed up a useful bike tool roll from it.
My wife is a talented and prolific knitter with a yarn stash that rivals my own nerdy maker supply. She uses an IKEA KALLAX unit to organize her yarn and really liked the pressed bamboo BULLIG boxes she saw at the store. However, the boxes are designed with smooth-headed bolts…
I’ve been working on a Balena-managed deployment of Kerberos Agents running on Raspberry Pi 4 with the new Camera Module 3, but was having a huge issue trying to get libcamera to work inside a container. The documentation has been kind of frustrating, but I finally worked out my issues.…
Following up on my Dumbing down the Levoit LV-PUR131S Smart Air Purifier work, I received a new Mean Well LRS-35-24 power supply and got to work installing it in the unit. I cut a hole in the side of the box to accommodate a new NEMA C14 socket I had…
The Levoit LV-PUR131S Smart Air Purifier is a HEPA filter (plus a carbon filter) with a particulate matter (PM) sensor and proprietary WiFi-based cloud connectivity. It’s a pretty reasonable air filter I use for my living room to help manage the indoor air quality. The replacement filters aren’t super expensive…
Workshop air filter
🗒️
The box was so close to being done. Just needed something to keep the filters in place, but also allow them to be easily removed. I decided on using weatherproofing gasket with adhesive backing. Now the filters fit snugly, but are still easy to remove and replace.
Workshop air filter
🗒️
After a bunch of design and planning out the cuts, I had most of a Sunday to work on cutting lumber and assembling my Corsi-Rosenthal box. I started with the miter saw and the 2x4s since that was the least-familiar material to me. I did a little bit of planning…
I recently received a Ryobi TS1340 miter saw by way of a friend whose family member was needing to relieve themselves of it. The saw itself had been reasonably well cared for over its estimated 15 years, though had lost its lower blade guard. Unfortunately, neither Ryobi nor third-party parts…
Workshop air filter
🗒️
It’s been over a year since I last wrote about building an air filter for my garage workshop, but I’m finally making progress toward designing and building my own Corsi–Rosenthal Box. I recently received a nice miter saw and decided to try my hand design and building with US dimensional…
I love a good “cutty tool,” and there’s nothing quite like using the right X-ACTO knife for the job at hand. However, I didn’t like the storage option provided by the X-ACTO Basic Knife Set. Getting the blades in and out of the plastic shell was a bit fraught and…
Between the end of 2018 and early 2019, I worked with the CTO at Syncromatics (now GMV) to develop a framework for developing an engineering career within the organization. I had the joy and pleasure of speaking with Katie Wilde at Buffer about the groundbreaking work she did and shared…
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…
I needed a holder to keep my esoteric set of metric Allen wrenches together. (I also made a Gridfinity module to hold this with my pocket knife.) I made it to hold 2mm, 2.5mm, 3mm, 4mm, 5mm, and 6mm wrenches.
With my Evidences of Coverage in hand, I now have the daunting task of comparing four 120+ page documents full of dense insurance language. Fortunately, my favorite diff tool, Beyond Compare, can handle text extraction from PDFs. Since these Evidences of Coverage are all very similar except for a series…
So frustrated with US health insurance right now. Thanks to my mom’s passion for medicine, 30+ year career as a Registered Nurse, and general wonkery for navigating health insurance, I have made sure to request and review Evidences of Coverage (EOC) for each medical plan I’ve been able to choose…
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!
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…
I have three intermingling background thoughts lately: “The purpose of a system is what it does” (POSIWID), humans seem to have three ways of sensing the world–why?!, and how do I be?
I wanted to display my Hackaday Superconference badge without continually burning through disposable batteries, or having to cycle through rechargeables every other day. A fellow conference-goer shared this LiPo holder design which just fits into the badge’s AA receptacles and provides a sturdy plane to which to strap a bigger…
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…
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…
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…
Wow, I haven’t done one of these for a few months. Let’s see how this goes!
A small confirmation for any who might look for me on Twitter/X: I have deleted my account there. I enjoyed many of the interactions with people I had there, but the site has changed beyond recognition and is no longer a place where I want to be.
If I’m going to use Elixir, I might as well make use of its pattern matching!
I’m doing some work in Elixir now, so I figure I’d take a shot at this week’s question with Elixir.
I bought a cargo e-bike this weekend and am elated about it. It’s so much fun to ride and it’s so easy to move such a big bike. Everything about it makes me think of it as a station wagon.
A few years ago, I bought a ridiculous-yet-useful octopus-like “Viozon Selfie Desktop Live Stand Set” to organize my desk and improve my work-from-home set up.
Simple, no-frills solution to this week’s question.
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)
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!)
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.)
In this case, writing tests to prove the solution was far more interesting than the solution itself.
The simple case wasn’t hard, but the low-memory iterator pattern was a fun, self-imposed challenge.
Art display board
🗒️
I’ve been slowly iterating on designs to hold art on my cool, new display board. I haven’t settled on anything yet, but here are several of my attempts so far.
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…
Art display board
🗒️
I have basically been thinking about building the display board all week, but haven’t had a chance to until today because of both work and weather. I’ve found this thinking time useful for planning the cuts and assembly procedure. I read up on some woodworking “best practices” that suggested a…
Art display board
🗒️
I’m starting a new woodworking–plus–3D printing project add some more art to my home office: a display board for my art postcard collection! For this project, I’m trying out a new way of writing about my progress through the project. I’ll write smaller updates as I iterate on the designs…
A couple of friends gifted a Monstera plant to Bonnie and me. We’re trying to get the hang of caring for plants, so we decided to give it a name and make it a nice stand to perch upon.
The tests were harder than the implementation 🥴
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.
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…
Nice little brain teaser involving number base conversion 😄
Nice, bite-sized algorithm question.
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.
My wife has been enjoying making anise, cinnamon, and citrus water centerpieces with floating tea lights. They look pretty on the table and they smell nice without setting off my scent allergies. But after a few weeks, we started accumulating spent candles. I started to wonder if I could melt…
This was a fun, light interview question this week.
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!
On a whim, after someone on a Discord server shared a video of a fidget switch they printed, I decided to try a quick interpretation of the design with the materials I had on hand.
I was in the mood to build something with my hands, and I have been working on getting my garage organized into a functional space to do all sorts of maker-y things. I have a strong tendency to “collect” various materials that I think will be useful eventually. In order…
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…
This one was tricky to stay mindful of the number of iterations.
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.
I do enjoy getting Cassidy’s newsletter late Sunday/early Monday and trying my hand at the “interview [questions] of the week.”
Recently, I designed and printed a battery box to power some new lights on my bike. The box is pretty great and feels reasonably study, but I wanted to give it a bit more of a protective coating to avoid friction from pulling the printed layers apart. I decided to…
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…
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…
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.
Updated January, 12, 2023
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…
I’m so grateful for friends and family celebrating with Bonnie and me. When Bonnie pitched the idea of fundraising for our 15th anniversary, I was excited. She’s got a keen sense of knowing what good needs to be done and who’s engaged in doing that work.
Friends, it’s a weird and wild time to be alive. There’s a lot of bad stuff going on, but also some good! The inexorable passage of time has inexorably passed, and with it, Bonnie and I are celebrating 15 years of marriage in 15 days, and we’d like for you…
It’s been a full year since I bought my Sovol SV02 printer. I’m sitting at my desk with at least a dozen printed objects around me: fidget toys, small art pieces, organization trays, and electronics enclosures. The process of learning about modeling, manufacturing, and materials science has been fascinating (and…
Updated December 5, 2024
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.
I was tired of fiddling with the fold-up case that my RadioShack 22-810 multimeter (photo not mine) came in. The probes were a pain to fit into the case properly and I also wanted to have the option to use wires with Dupont connectors to play nicely with my breadboard.…
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…
For multiple reasons–my asthma, air quality, and COVID-19–I run several air purifiers throughout my home. I run a whole Levoit Core 300 air purifier on top of my desk, which typically is useful for collecting my cat’s dander in addition to putting clean air out close to my face. However,…
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.)
Harmony Aikido Foundation is a nonprofit dedicated to teaching self defense to women and girls. I got involved with the nonprofit after my friend JT Tam recruited my wife and then me to join in his vision to help women defend themselves against acts of violence. Our work needed a…
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…
I wrote a .NET program to test building and cross-compiling an application to run on a Sierra Wireless AirLink RV50 gateway.
Quick query to determine which columns of a table must be assigned values on INSERT:
“I just want to know if there’s anything in this array.”
Don’t let this happen to you! Look at the details of how your indexes are being used. If you have plain ol’ “predicates” and not “seek predicates” on your index, you’re scanning your index, despite the seek!
Here’s a neat tidbit I found recently while working deep in some ETL scripts written in T-SQL: You can use RAISERROR with a severity of 0 as you would use PRINT in order to print out informational messages, and RAISERROR has a nifty option to write the message out immediately…
I, like a few others I know around here, enjoy getting the semantics of things right. Even if two things are functionally equivalent, correctly identifying each of the things makes me feel warm and fuzzy. Take for example, SQL Server User Defined Types. No, not the SQL Server 2005 CLR-based…
Sometimes I think of IIS as a big, dopey guy with a mostly-likable personality. He really wants to help with anything and everything, but he’s not very good at any of it.
Davis and I set about a journey together into the nether regions of the ASP.NET request lifecycle to solve an issue: Insert a script into the header of an ASP.NET page, whether that page has a <head runat=”server”/> element or not. After trying several different approaches, we dug a little…
Every object in C# has it: .ToString(). That supposedly handy little method that “converts” the object into some string representation of the object. Sometimes it does just what you want, but sometimes it causes developers to go mad.
Think LINQ
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
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…
I’ve recently dived in to the .NET 4 Task framework, and was trying to deal with the issue of having a thread sleep for a specified period of time–unless a cancellation has been requested. This led me to discover ManualResetEvent, which is awesome for what I needed. Without further ado,…
Think LINQ
“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
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
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
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
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
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…
Have you ever found yourself working in T-SQL and thought, “Query parameters are great for individual values, but what I really want is a way to pass an array–or even a table–into my query.” I have, and I was pleased to discover that starting in SQL Server 2008, a feature…
Just came across a most peculiar issue in the ASP.NET 4.0 HttpContext. It seems that postbacks ceased to work when the HttpRequest.Form member was accessed (in a read operation) from within a module’s AuthenticateRequest event. Reading cookies, querystrings, and server variables all appear to function without issue, but accessing the…
Previous post: Interesting ASP.NET bug…
I have spent the last few days tackling a truly gnarly mess of ASP.NET code that was brought to my attention because of its poor performance. The page is intended to be a working view of people involved in a project, allowing the user to interact with people in a…
Breakout session at VMworld 2008 in Las Vegas, NV about VMware Server and its role in Raideil’s fully virtualized infrastructure. I presented this session with my two partners, Kraig van der Klomp and Yves Accad. This was my first speaking engagement and it was a thrill to deliver this talk…