Recent posts

Genuary 2026.18: Unexpected paths

Genuary 2026.18: Unexpected paths

I feel like the most unexpected of paths is Langton’s Ant!.

Okay, it’s fairly expected. And I’ve even done it before. Been a while though.

Anyways, here we go!

In a nutshell, you have a grid with N possible values (the length of the rule string). For each pattern, when the ‘ant’ walks on that cell, the value in incremented by one and you will turn according to these rules:

  • R turn right (90° or 60° in hex)
  • L turn left (same)
  • S turn right 120° in hex mode (nothing in square)
  • M turn left 120° in hex mode
  • U turn 180° in hex mode
  • anything else (N above), do nothing/go straight

This ends up with some really interesting behavior for such a short ruleset. Langton’s Ant (LR, the default) is definitely an interesting one. For 10,000 ticks, you get chaotic behavior… and then suddenly it stabilizes!

Here are some interesting patterns:

You can also do some interesting things with multiple ants (they’ll spawn in a circle):

The modes are:

  • pauseMode controls when the simulation will stop (note: will always pause at width * height * 100 tiles)

    • n-tiles will pause when the tile count is width * height (no matter where they are)
    • one-at-edge will stop when each cell is 1 pixel and any ant reaches the edge of the image
    • all-at-edge will only stop when all ants reach the edge
    • no-pause will never pause (this can get really laggy eventually)
  • centerMode is how the displayed part of the simulation will be centered

    • origin will stay centered at 0,0
    • bounds will center on the middle of the current overall bounds
    • ants will average the x,y of all ants
    • tiles will average the x,y of all tiles
    • mouse will allow some mouse control; left click and drag to move, right click (in theory) to reset

read more...

Genuary 2026.17: Wallpaper Groups

Genuary 2026.17: Wallpaper Groups

Wallpaper group. There are only 17 ways to cover a plane with a repeating pattern, choose your favourite on this page: Wallpaper group

This is a great article about Classifying Symmetries that says there are actually 35 tiling patterns!

List of planar symmetry groups is another Wikipedia page with a good summary of the wallpaper group.

I spent waaaaay too long on this one.

  • group is the 17 groups mentioned
  • subGroup is horizontal or vertical for some of the above
  • cellType is the shape of each cell
  • cellStyle is what to fill them with
  • debugDrawOne shows what one tile looks like
  • debugDisplay prints what random values were selected
  • pauseBuffer is useful for pausing the generation (although if any of the others are random they will keep changing)

Not all of the groups and cell types are perfectly compatible. In fact, probably half or more aren’t. But they still produce something, and I think that’s pretty cool!

read more...

Genuary 2026.16: Order vs Disorder

Genuary 2026.16: Order vs Disorder

Order vs Disorder

So I have two kinds of agents: Order, which always moves in straight lines and Chaos which… doesn’t!

Settings:

  • updateRate is how fast it runs
  • minAgentCount will spawn agents until you reach this number
  • maxAgentCount will kill off agents until you’re under this number
  • dieOfOldAge will kill off old agents
  • maxAge is the longest an agent can last
  • agentRatio of 0 is all order and 1 is all chaos
  • spawnRate is how often an agent will spawn a new agent (of the same kind)
  • resetPercent is how much of the screen can be full before resetting
  • pauseOnReset will pause on a reset to allow downloading! (change any setting include this one to unpause)

read more...

Genuary 2026.15: Invisible Object

Genuary 2026.15: Invisible Object

Create an invisible object where only the shadows can be seen.

Noise that pushes a bunch of particles around on the screen. There is 1 (or more) ‘shadows’ on the screen that push the dust away.

If the shadow runs off the screen it will come back in a bit from the opposite edge.

Settings:

  • dustCount is how much dust
  • dustSpeed is a multiplier for how fast the dust goes per frame
  • dustDieOff is how much dust disappears each frame
  • onlyEdgeDust sets dust to only spawn on the edges, rather than anywhere (has some weird visual artifacts when the dust is a nearly horizontal / vertical)
  • rainbowDust makes the dust far more colorful
  • windScale is the scale of the noise, 1 will wiggle a lot more, 5 is closer to straight lines and slow changes
  • fade will leave trails by fading the screen; turning this off is interesting since the shadow will be much more subtle
  • shadowCount is how many shadows there are
  • shadowForce is how strongly they repel dust
  • shadowWindIndependent means the shadow doesn’t always move with the particles
  • shadowEdge will show where the shadow shape actually is
  • shadowsMove will allow the shadows to move / stop them

read more...

Genuary 2026.14: Fits Perfectly

Genuary 2026.14: Fits Perfectly

14) Fits Perfectly

Basically, we’ll pack as many circles in as we can!

  • retriesPerFrame is how many circles it will try to place before giving up and drawing the frame
  • minDiameter is the smallest a circle can be (this should be 1 for a ‘perfect fit’)
  • maxDiameter is the largest one can be
  • spacing is how much space to leave between circles (this should be 0 a ‘perfect fit’)
  • borders will draw a black border on each circle
  • fillInside will place circles inside of each other as well as outside, so long as there is still enough spacing
  • blackPercent is how many of the circles will be black rather than bright colors

read more...

Genuary 2026.13: Self Portrait

Genuary 2026.13: Self Portrait

13) Self Portrait

That was surprisingly fun.

Basically, it will take recursively divide the picture over time. Each time, it will find the node with the largest error (real image color compared to the current random color) and split it in 4, assigning each to the nearest random color from our palette.

  • colors controls how many maximum (random) colors will be chosen
  • edges will draw the boxes of the tree
  • minimumBlock is the size at which it won’t split any more
  • resetAfter will generate new colors even this many frames
  • evenSplit will split each box into exactly 4; if this is off, each axis will randomly be 25-75%
  • weightErrorBySize will split small boxes earlier; with this off, larger boxes have more error because they are larger

If you don’t want to look at me any more, turning off selfPortraitMode will load an image from picsum.dev.

read more...

Genuary 2026.11: Quine

Genuary 2026.11: Quine

11) Quine

Making a genart quine? That’s… certainly a thing!

So basically I made a very simple stack based virtual machine. You can check the source code below for what commands it can actually run. It will then run until it outputs enough code to match the input length (or times out). If it happens to output a quine? Woot!

If not, it will randomly mutate and try again.

  • cellSize - Change how big the program is (default is 10, theoretically with semi quines size shouldn’t matter)
  • ticksPerFrame - How fast the simulation will run
  • asFastAsPossible - Ignore the above and run an entire simulation per frame (it could technically go even faster 😄)
  • pauseAfter - Pause to see what happened after output is done or a break
  • stopAfter - When a single program has run, stop the main loop (mostly useful for debugging)
  • randomizePercent - How much of the input to randomly change for the next iteration
  • runOutput - Run the output as the next program (otherwise, randomize the input)
  • highlightActive - Highlight the parts of the program that actually ran (brighter colors)
  • allowSemiQuine - Ignore non-active parts of the program when considering a quine (if you copied the output to the program in these parts, they’d be a quine, so I think it counts)
  • allowReadingCode - Allow (new) commands that allow reading our own source code
  • allowWritingCode - Allow (new) commands that can modify the code you were originally running
  • debugPrint - Print each command run/output to console.log for debugging
  • debugSlow - Drops the framerate to 1 fps for debugging
  • debugStepButton - Add a ‘step’ button that runs one step at a time (noLoop) for debugging (reload the page)

In addition, you can put in code in the box and ’load’ it to run. This will be helpful to verify quines! I have some interesting code below (including a hand written quine! That uses the self reading instructions).

If you manage to find a quine organically (or write one), I’d love to hear what it was!

read more...

Lost: Season 5

Lost: Season 5

What lies in the shadow of the statue?

Season 5 is where it really started to get obvious that the writers of the first few seasons did not have a plan for where all of this was going to go. It manages to hold together relatively well–and we do get a few answers, mixed in with all those questions–but man, there are a few moments which just don’t line up with what we already thought we knew.

I suppose that’s what you get any time a show introduces time travel .

Faraday: I studied relativistic physics my entire life. One thing emerged over and over–can’t change the past. Can’t do it. Whatever happened, happened. All right? But then I finally realized… I had been spending so much time focused on the constants, I forgot about the variables. Do you know what the variables in these equations are, Jack?

Jack: No.

Faraday: Us. We’re the variables. People. We think. We reason. We make choices. We have free will. We can change our destiny.

We have, at first, a combination of ‘what is going on here’ on the Island, along with a ‘we have to go back!’ off it. And man, despite the fact that there are only the ‘Oceanic Six’, there are some pretty complicated shifting alliances going on here.

Frank Lapidus: In my experience, the people who go out of their way to tell you that they’re good guys are the bad guys.

And then, in the latter half, once the Island stabilizes a bit? Well, that’s where all the real trouble starts. Because the might just have made it back where they were trying to go. But not quite *when* .

Jack: If we can do what Faraday said… our plane never crashes… Flight 815 lands in Los Angeles. And everyone we lost since we got here… they’d all be alive. Kate: And what about us? We just… go on living our life because we’ve never met? Jack: All the misery that we’ve been through… we’d just wipe it clean. Never happened. Kate: It was not all misery. Jack: Enough of it was.

Oh, that’s quite the set up for season 6.

One more to go!

The Bear and the Nightingale

The Bear and the Nightingale

“All my life,” she said, “I have been told ‘go’ and ‘come.’ I am told how I will live, and I am told how I must die. I must be a man’s servant and a mare for his pleasure, or I must hide myself behind walls and surrender my flesh to a cold, silent god. I would walk into the jaws of hell itself, if it were a path of my own choosing. I would rather die tomorrow in the forest than live a hundred years of the life appointed me. Please. Please let me help you.”

The Bear and the Nightingale.

Basically, what happens if you take a Russian fairy tale and expand it to the full length of a novel while still managing to keep both the whimsical magical aspects… and all the dark bits as well.

We go through years, watching as our main character Vasya is born (and her mother dies), up through when she’s a teenager on the cusp of being married off–or sent to a monastery. She never quite fits in and makes for a wonderful point of view into this wordl.

In the meantime, we see Russia ‘growing up’ as well, abandoning the old gods and spirits of the forest in favor of the Church. It’s not the only conflict of the story (or, I’d argue, even the main one), but it does underlie the whole thing.

“Nothing changes, Vasya. Things are, or they are not. Magic is forgetting that something ever was other than as you willed it.”

This was a delightful, haunting sort of story.

Side note: I did not realize this was a trilogy until writing this review! More to read!

Brian's Hunt

Brian's Hunt

Basically, this is Brian’s Return part 2. Where he actually finishes the trip he set off on–and somehow by far the most tragic of the five books. It’s a major tonal shift and there isn’t really any time to recover from it before the book is over.

I get it, nature is rough sometimes. People die. But these books always had the sense of ’no matter how bad it gets, you know (because it’s a book), nothing truly terrible will happen to Brian’. If that sounds great to you, consider skipping this book.

Other than that, we have the first hint of Brian as teenage boy with teenage boy thoughts–but there just isn’t time to get into it.

And we have more hunting–again, little enough time to get into it.

Honestly, you can stop after book 1 or 3, in my opinion. So it goes.

If there ever happened to be a sixth book, I’d be interested to see the story finished, but apparently (on looking it up), Gary Paulsen passed away in 2021. Such is life. I do wonder about his other works though.

Onward!

Genuary 2026.09: Cellular automata

Genuary 2026.09: Cellular automata

9) Cellular automata

Just a bunch of random rules, with the ability (if you put this in p5js at least) to add them pretty easily.

This one can do some wacky things if you randomize it. But also, it might crash your browser tab on some of these settings. Sorry. 😄

Try:

  • Perlin, Max, fuzz, diffuse

read more...

The Gate of the Feral Gods

The Gate of the Feral Gods

Ever since that first monkey looked up into the sky and saw something twinkling up there, you meat puppets have tried to force twenty pounds of existential meaning into a ten pound sack of chaos.

Holy crap things just keep escalating.

We have another single level this time. Bubbles in space, each populated by a subset of crawlers that can’t (initially) interact, and each of which separated into air/earth/water/underground sections with their own puzzles.

Of course by the end Carl has done an excellent job of not being broken (more or less), saved people, killed even more people, and managed to summon and/or fight entirely too many (feral) gods.

“You know what, Carl? I’ve decided something,” Donut said, finally speaking. She released Mongo, who squawked and started investigating this strange, new world. “Yeah, Donut?” “I think they’re right about you. I think you’re crazy. Like, not a little weird crazy. Not guy who eats cereal without milk crazy. But crazy, crazy. Straitjacket crazy.” I took the cat into my lap, and then I pulled her to my chest. She purred heavily into my ear.

Man that ending hits hard.

And now… based on the afterward, we’re really going to have some complications next book.

I’m looking forward to it!

Brian's Return

Brian's Return

Brian sat quietly, taken by a peace he had not known for a long time, and let the canoe drift forward along the lily pads. To his right was the shoreline of a small lake he had flown into an hour earlier. Around him was the lake itself, an almost circular body of water of approximately eighty acres surrounded by northern forest–pine, spruce, popular, and birch–and thick brush.

Brian is back.

Again.

After a couple years, Brian doesn’t seem to be doing overly well adapting back to ‘regular life’. So he ends up going back to the wilderness, this time at least with a few more supplies. It’s another trip on a river (this time with a canoe) with a bunch more hunting and arrow building.

Honestly, it ends before it really starts and I’m not entirely sure what the point of this one is compared to the two. We don’t really get into Brian’s headspace going back. So it goes.

It is amusing that he takes Shakespeare with him this time around though.

Author’s Note

This is the final book about Brian, though someday I may do a nonfiction book about those parts of my life that were like Brian’s.

doubt

Genuary 2026.07: Boolean algebra

Genuary 2026.07: Boolean algebra

5) Boolean algebra

So the basic idea here is to recursively divide the space. The black squares are the randomly chosen values. Then, for each level of the tree, combine the children using one of the selected functions (and/or/xor/etc), drawing a border if the result of that combination is true.

Try various combinations of settings!

read more...


Recent posts by category

Click a category to see all posts in that category, or click the RSS icon to subscribe to that category's RSS feed.

Programming

The earliest memory I have of ‘programming’ is in the early/mid 90s when my father brought home a computer from work. We could play games on it … so of course I took the spreadsheet program he used (LOTUS 123, did I date myself with that?) and tried to modify it to print out a helpful message for him. It … halfway worked? At least I could undo it so he could get back to work…

After that, I picked up programming for real in QBASIC (I still have a few of those programs lying around), got my own (junky) Linux desktop from my cousin, tried to learn VBasic (without a Windows machine), and eventually made it to high school… In college, I studied computer science and mathematics, mostly programming in Java/.NET, although with a bit of everything in the mix. A few of my oldest programming posts on this blog are from that time.

After that, on to grad school! Originally, I was going to study computational linguistics, but that fell through. Then programming languages (the school’s specialty). And finally I ended up studying censorship and computer security… before taking a hard turn into the private sector to follow my PhD advisor.

Since then, I’ve worked in the computer security space at a couple of different companies. Some don’t exist any more, some you’ve probably heard of. I still program for fun too, and not just in security.

But really, I still have a habit of doing a little bit of everything. Whatever seems interesting at the time!

Reviews

It started more than a decade ago now (2012!). I was catching up to 30 new releases in a year in theaters and reviewing them. Then at some point (2014), life happened1 and I didn’t make it to the theater as much anymore.

After that, starting in 2015, I realized I could do the same thing with books! And I started writing a review of every book I read. And I read a lot. Since then, I’ve reviewed over 1300 books–and I still have over 1000 on my to read list. So that isn’t likely to stop any time soon.

It’s mostly fantasy and to a lesser extent scifi, although I do get a few horror novels in there, along with a couple non-fiction or poetry anthologies a year. I’m always looking for more to add though. Hit me up!

Then, starting in 2021, I started again with the movie reviews, this time mostly ignoring what was in theaters, instead watching whatever seemed interesting, much like my book reviews. And this time, I added TV reviews as well.

And… here we are. Really, it’s as much a memory aid for me as anything. I love being able to look back at all the covers I read in a year, pick one at random, and use my own writing to remind me of a particular book/movie/show. And if anyone else is inspired to read something out of it? Well, all the better!

Current book bingo: 2025 Book Bingo


  1. My oldest was born in 2014. A coincidence I’m sure. ↩︎

Other

… other things I currently haven’t put into a category!

Maker

I love to take things apart and put them back together. It’s one of the reasons I work in computer security for a living. But more recently, the dropping prices of 3D printing and entirely not dropping prices of wood working have led to a few new hobbies. :D

Photography

I’ve always had a soft spot for photography. I borrowed my mother’s camera in high school and eventually bought my own. These days, I mostly use my phone (it’s amazing how good those have gotten), but I still pull out my years old DSLR from time to time.

Mostly, I have pictures organized by photosets, but I’ve started adding a few ‘meta sets’ like Mini Worlds, Bugs etc (macros), and Fungus Among Us.

Home Automation

Another hobby I’ve been getting into more recently is Home Automation! Previously these posts would have been in Other, but it’s nice to have them all in one place.

Writing

I am a writer–I just don’t always remember it.

I wrote my first novel in 2011. I’ve started 14 more since then, finishing about half of those. One of these days I’ll actually try to find someone to publish them (or just do it myself). Onward!

(If anyone would like to be a beta reader, feel free to drop me a line).

Research

Once upon a time, I was on track to get a PhD in censorship/computer security. I was ABD (all but dissertation) when my advisor decided to leave and go into the private sector. When that happens… you either find a new advisor or you go with them. I decided to go with them, move to Silicon Valley, and join a startup. It was perhaps the best thing that could have happened to me. While I sometimes regret not having the extra letters after my name, I love the practicality of working in the ‘real world’. Not to mention the job prospects are better. :)

So for the most part, these posts are archival, but there are still a few gems in there.

Search