Felix Adventures: KC Oasis and a stray pup

Written 2026-03-01

Tags:Felix 

My son Felix and I went to Kansas City Oasis, as we do Sundays when his schedule aligns.

People there like to see him because he is so young and cute as a button. Before we left he had fallen asleep in Kate's arms and I packed him into the bucket seat, expecting him to be hungry when he awoke. We parked a few blocks away on Bell st, and when we arrived he was awake and alert and had lots of fun looking at everyone.

Eventually he was hungry and he had a good time sitting on me in the back with his bottle. He received lots of comments on his hair, which we first spotted on an ultrasound.

As it came time to leave we were both surprised by the thunder outside. When I carried him to the window for a peek, I saw hail! I had no umbrella and realized I was woefully prepared for this situation.

Our friend Julie offered to watch him until I could return with our car, and I graciously accepted.

About halfway to the car I found a medium sized black dog. He was scared and wet and shivering in the hail and came up to me immediately. Usually I would be more than happy to drive a lost pet home, but I needed to get to my son. But when I opened the door he hopped right in!

I was reminded of simple logic puzzles I had faced as a child: a hunter has a dog, two rabbits, and only one canoe. How can the hunter cross the stream in the least number of trips without mixing incompatible animals on the shore. I could not leave an unknown dog in the car with my son.

I pushed him out. As I drove toward Oasis he followed me for an entire block. A lot of the people at Oasis have, raise, or love dogs, surely if I took the dog to Oasis, we could figure things out from there. I stopped and opened the trunk and he hopped in and I was able to read his dog tags phone number.

On the way I called his owner, who explained that the thunder had scared him into bolting. Just as I arrived, Julie appeared at the door with Felix. I rolled down the window to ask for just a few minutes - I've got to deliver this dog! Just then the dog's owner arrived and we carefully opened the trunk and clipped on the leash and sent him on his way with a thank-you and handshake. I ran in, thanked Julie, washed my hands, grabbed Felix, explained the situation, and thanked Julie one last time.

Milnot Cheesecake, Choose-Your-Own Adventure Style

Written 2025-11-24

Tags:Cheesecake Milnot 

This makes a sweet, fluffy, whipped cheesecake desert. I'll start with the family recipe, then go into specifics that can be tuned.

What is Milnot?

Well it's not milk, that much is for certain. Through the magic of science and technology, Milnot is canned, evaporated milk that has had its milkfat replaced with vegetable fat. Originally a cost effective, shelf-stable milk, it can sometimes be found in midwest grocery stores. I've never seen it used for anything other than this recipe. It has a peculiar property, in that it whips exceptionally well. Though you can also use evaporated milk, which is more common.

A bit of history

Originally Milnut, Milnot dates back to the great depression. Due to interstate commerce milk purity laws, the original cans stated something like "not to be confused with evaporated milk". The Milnot factory stradles the Missouri-Oklahoma border.

A Base Recipe for Milnot Cheesecake

Ingredients

Steps

  1. Place the Milnot in the freezer - want this to be as cold as possible. Also, don't take a break and forget it's in there!
  2. Dissolve the Jello in 1 cup of boiling water. Once dissolved, place in the freezer on a hot pad until slightly thickened - this should take about 20 minutes.
  3. Cream the cheese, vanilla, and sugar together. I do this in a Kitchenaid mixer - if you have the paddle blade with rubber scrapers, use that. Otherwise take a few breaks to knock down the mix that works its way up the sides of the bowl. We want to ensure all sugar has dispersed into the cream cheese.
  4. Mix in the Jello just a bit at a time and set aside. I turn on the mixer, add a splash of Jello, and wait for it to disperse. These two materials, cheese and Jello-water, won't want to mix naturally. Using cold cream cheese or adding Jello too quickly is more likely to form pearls of cream cheese that don't mix smoothly.
  5. Whip Milnot until fluffy. Use the whisk attachment on the mixer. This works best the colder everything is. Placing the mixer bowl in the freezer for a few minutes can help too.
  6. Fold whipped Milnot into jello-cheese
  7. Pour into graham cracker crust
  8. Refrigerate overnight

Fluffy or Richer?

My wife tends to prefer a richer Milnot cheesecake - no worries, double the cream cheese and read on!

Cream cheese to Sugar Ratio

The above family recipe calls for 1 cup of sugar per block of cream cheese. This is on the higher end of what I have seen used, but hey, it's a dessert! I've seen other receipes go as low as 1/3 cup of sugar per 8oz cream cheese, and from experience that's too low, and you get too much cream cheese tartness. 1/2 cup or 2/3 cup of sugar per block is also good.

I'm not considering the sugar and tartness of the Jello since those are somewhat balanced already in the Jello.

Other Flavors

We can swap out the Jello for other flavors, and sometimes the lemon juice too. Lime Jello and lime-juice makes for a nice lime cheesecake. Cherry jello and lemon juice is good too. I'd lean more on the stronger fruit flavors. Certainly no celery.

Alpha Filter Initialization

Written 2025-11-17

Tags:filters 

My home has mostly been converted to LED lightbulbs. With a variety of needs of brightness and socket bases, we have a variety of bulbs on switched dimmers, with a variety of turn-on behaviours. Some start from zero and ramp up. Some start from the minimum turn-on level of the bulb. Some seemingly start randomly then approach the expected output level. This has got me thinking about the topic of filter-initialization.

AC Dimmer Introduction

Wall power here is 120-Volt, AC/sine, 60Hz. Typical home dimmer systems operate by chopping the sine-wave at a specified phase(point in time relative to the cycle). This leads to a rather jumpy voltage delivery to light bulbs. In the incandescent past, the thermal mass of bulb filaments was enough to filter out the voltage spikes from the dimmer. With the advent of LED bulbs, "dimmable" bulbs usually include a decoder or filter of sorts to handle this.

Alpha-Filter Introduction

An alpha filter, or exponential moving average filter, is one of the simplest low-pass IIR filters. Generally, the filter is represented by two values. The first value is a state-variable that is updated each time we process a new sample. The first value is a constant, named alpha, that relates to how much smoothing occurs. For each sample the math is simply:
state = sample * alpha + prevState * (1 - alpha)

When alpha=1.0, the filter simply passes input to output, and can be considered to have unlimited bandwidth. When alpha=0.0, the filter blocks any changes as has zero bandwidth. Everything in-between provides a trade-off between responsiveness and smoothness. Typically, alpha is an application-specific constant.

I have no idea if light-bulbs use alpha-filters, but we'll use them as a way to discuss a more general problem.

Initialization

What should we use for prevState for the first sample? In some applications turn-on transients may not matter too much, but here are a few approaches:

Option1: zero

prevState = 0

Starting at zero means the filter is going to under-estimate the target value for a while, but in the case of a light-bulb this can give a slow but not unpleasant ramp-up, especially while carrying a newborn infant around the house wondering about how my lightbulbs handle filter initialization. One downside is that there is a noticeable delay getting a useful level of light output.

Option2: minimum bulb output

prevState = minOutput

Similar to starting at zero, starting from the minimum bulb steady-state output also gives us a small amount of light immediately, then ramp-up to the target. One odd thing about this when the dimmer is set to the minimum level when switched on, the bulb turns on immediately but then doesn't ramp up at all since it's already reached its target output. It feels inconsistent and find myself sometimes expecting it to brighten further.

Option3: first sample

prevState = anyPossibleInputValue

Some of my lightbulbs strike on to a seemingly random value, then ramp up or down as needed to the target dimming. Due to the chopped AC waveform, this is almost certainly the wrong choice for a light bulb, but may not be a bad choice for other applications.

But this approach has one advantage - on average, it'll at least start somewhere in the expected range.

This is equivalent to overriding alpha=1.0, just for the first sample.

Proposal: variable filter bandwidth initialization

What if we ramped alpha from 1.0 toward during the first few samples? It turns out we can get both quick initialization and a variety of filter responses from this. One possibility - substitute alpha for 1/N (where N is the sample-number, starting with 1):

state = sample * 1/N + prevState * (1 - 1/N)

This happens to generate a sliding-window filter. After 1/N decreases below some minimum-alpha, we can transition to traditional alpha-filter behaviour, like so:

tmpAlpha = MAX(alpha, 1/N)
state = sample * tmpAlpha + prevState * (1 - tmpAlpha)

The end result of this is that we take the first sample as truth, then several subsequent samples are averaged together with decreasing filter bandwidth for each, before reaching our final minimum bandwidth steady-state alpha. Early during startup this can lead to very noisy samples, so we might want to clip tmpAlpha, like so:

tmpAlpha = CLAMP(alpha, 1/N, 10 * alpha)
state = sample * tmpAlpha + prevState * (1 - tmpAlpha)

Here's what that looks like. 1500 random samples, alpha=0.002 for the fixed-bandwidth filters, but ranges 0.002 to 0.02 for the variable filter:

alphaFilterInitialization

The variable-bandwidth filter approaches the target value quickly, perhaps a little too quickly and overshoots slightly, then smoothly approaches much quicker than constant alpha filters.

Older