A fast food restaurant named “Chicken Connection” is in a mall food court. The counter displays illuminated menu boards featuring various chicken dishes. In front, there are empty tables and chairs on a tiled floor.

An indoor atrium of a modern building with a curved glass ceiling. There are multiple levels with railings, beige flooring, and a large planter containing tall green plants in the center.

Lloyd Center, Portland, Oregon. 9th May, 2025.

Three thoughts from a week of calorie counting on a low carb diet, with no pre-planning:

  • It’s frustrating, like all of a sudden finding yourself in a community of people that don’t speak your language.
  • Sustaining a feeling of hunger, or quenching it with water, sometimes comes with a weird feeling of gratitude for the comfortable life you’ve built for yourself.
  • At the end of the week that burger you like at your local establishment, that you’ve had many times, tastes infinitely better.

IBM replaces HR with AI:

International Business Machines Chief Executive Arvind Krishna said the tech giant has used artificial intelligence, and specifically AI agents, to replace the work of a couple hundred human resources workers. As a result, it has hired more programmers and salespeople, he said.

Replacing HR with AI seems like a positive development to make it totally clear that HR is there to protect employer, not employees.

A bee hovering near clusters of vibrant purple flowers with green leaves.

Bee butt and the bee’s knees 😄

Sunrise over a coastal town with a silhouetted mountain backdrop. The sun casts a reflection on the water, with buildings and trees lining the shore.

Sunrise over the hill in Kona, Hawaii. 22nd March, 2025.

Vibing Pi o'Clock

An animation of a clock face where the seconds hand is jumping by a different number of places with each passing second.

When I wrote up Piterator.swift on Pi Day earlier this month, I was actually trying to do something with the values it returns but I didn’t get around to that fun part due to lack of time.

A few days after that I imagined a clock face where the seconds hand moves in jumps of the values returned by the iterator at the rate of once per second. So as the values start coming in like 3, 1, 4, etc, the second hand jumps by those many seconds.

I started to write the code for a Mac app but Quartz 2D drawing is not something I have ever really done, so it was tricky wrapping my mind around the coordinate system and laying out individual marks on the canvas.

Fast forward to yesterday when I decided to try out vibe coding for this project. As I got going though, it became more of an AI assisted coding because I started to edit it myself after a couple of initial rounds of code generation. Old habits die hard!

For this purpose I used the recently released Google’s Gemini 2.5 Pro via LLM, essentially as described in this post.

I was very impressed by the code generation. The first prompt I gave was for a static drawing, and it was thus:

llm -m gemini-2.5-pro-exp-03-25 "Write a SwiftUI View that draws a clock face on a Canvas. It should draw each of the 60 tick marks, with 0 and every multiple of 5 being a slightly thicker tick mark. It should also draw the time using an hour hand, a minute hand and a second hand. The second hand should be red. The time should be 10th hour, 10th minute, 30th second."

The result was exactly as I expected. It even improvised and put that little circle in the center which was a nice touch.

Then I gave it this second prompt which also included the Piterator.swift code:

files-to-prompt . -e swift -c | \
      llm -m gemini-2.5-pro-exp-03-25 -s \
      'Update the ClockView to make it animatable using TimelineView. Then hook it up to Piterator so that every second, the second hand moves forward by as many seconds as the number returned by the Piterator.'

This generated code that had a couple of small bugs that raised compiler errors. After I resolved that I had it working exactly as I envisioned it, and the whole thing took about an hour 🤯

All the code is on Github

Mimi Uploader is no longer in active development

I have decided to stop development of Mimi Uploader. The current beta will not be released, and there will be no more releases in the future.

The app will still be available in the App Store and continue to work. If I decide to remove it completely, I will give at least one month’s notice.

I thank you all for your support over the five year lifespan of this app.

If you’re wondering why I’ve decided to do this, please read on, although you might also want to read about the history of Mimi Uploader that I wrote 18 months ago.

So anyway, here are some reasons that went into the decision, although no single one was dominant:

  • Mimi Uploader’s role as a utility has diminished over time as alternatives have become possible and accessible.
  • The app makes almost no money. When I introduced subscriptions for supporting development, there was support for some time, but it plateaued, and then reduced.
  • Micro.blog has been introducing new features for managing and displaying photos and providing alt text. To be clear, I’m in support of that as these go to all users and make the service better for everyone, but they diminish the utility of Mimi, and also increase the burden of maintenance.
  • Some of the most ardent users and supporters have left the Micro.blog community in recent months.
  • I want to focus on newer projects and want to be clear to all users that this app is no longer a priority. If you subscribed to support development, then please feel free to cancel that subscription.

Thanks for a great five-year run 😊

Yesterday it dawned on me that it was Pi Day Eve, so obviously, I whipped up a little Swift iterator that iterates over values of Pi from Pi Delivery. You can get it at this gist.

Use it in your swift code and make fun stuff using the value of Pi up to 100 trillion digits!

Happy Pi Day!

A person wearing a “Lewis & Clark College” sweatshirt, ripped jeans, and sunglasses, is holding a soccer ball. They stand in front of a chain-link fence, with a table nearby. Trees and a building are in the background.

John at Level Beer. 28th February, 2025.

On Friday, I met up with some friends for happy hour. I got there early and was waiting when this guy noticed that I had a camera on me and asked for a photo. He was in a group that seemed to have come by after playing soccer.

A person wearing sunglasses, a bandana, a “Lewis & Clark College” sweatshirt, and distressed jeans is tossing a soccer ball. He stands outside near a table with a chain-link fence and trees in the background.

Making a Mallet

A wooden mallet held in a person’s hand, with a grassy background.

Over the last few evenings, I built my first mallet. As I was making it, I made a big mistake, but I went on making it. I made other smaller mistakes but in the end I have a mallet, that, while not perfect, is a nice addition to my tools. I will only build better mallets in the future.

I’ve been attempting to do more of hand tool woodworking, which involves joinery that takes some effort with chisels to get right. I’ve been using them with a cheap rubber mallet. That has worked fine but I wanted to make my own with hardwood.

I have some scraps lying around, and I found a nice piece of 1" thick walnut (Western, I think) in there. The wood had mostly the characteristic dark brown of walnut, but it all had some lighter sap wood. I decided to make the handle from the sap wood, so that I would have some contrast between handle and head.

A wooden board is lying on a surface. A measuring tape is stretched across the wood, showing its length.

I cut the pieces to dimensions that made sense but here is where I made the big mistake. I cut the pieces of the head in a way that the edge grain ended up on the top and bottom of the head, rather than on the striking faces.

Several rectangular pieces of wood arranged on a light-colored surface.

But the cuts were made and I was committed. I knew I would make mistakes going into this so this didn’t stop me from proceeding.

I lined up the pieces to shape the space for the handle in the head and glued up the pieces to form the head. This is where I made the second mistake. I had seen videos where the person would use a nail gun to hold the pieces in places, but I didn’t have one, so I got some small finishing nails, and hammered them by hand. This led to misalignment of the pieces. As a result, once the head was all glued up, it had to be trimmed to form proper faces.

Pieces of wood glued and clamped together on a workbench, with clamps securing them in place. Woodworking tools and supplies are also visible.

I also chamfered and/or sanded every sharp edge using the band saw and the belt sander. In the end I had a nicely shaped head. The handle was a tight fit but I glued it up and hammered it into place.

A mallet head and a handle lie on a table. Nearby, there is a red sanding block and a black rubber mallet.

The next day I sanded, and cleaned up all surfaces and applied two coats of Watco Danish Oil (Natural). After letting it cure for a day or so, it is now ready. I’m looking forward to chisel work with it in the near future.

A cat is perched on the back of a patterned chair in a dimly lit room. A table with a puzzle in progress is in the foreground, illuminated by an angled desk lamp. The background features artwork on the walls and a blurred interior setting. The photograph is black and white.

Puzzling. 1st December, 2024.

📷 Hasselblad 500C/M
🎞️ Cinestill Double-X (ISO 200)

A snowy street scene featuring a person walking on a snow-covered sidewalk. The trees and ground are blanketed in snow, with a small house partially visible in the background and some parked cars on the street.

Snow day in the neighborhood.

Portland, Oregon. 14th February, 2025.

Three children push a very large snowball on a snow-covered street. Several parked cars are visible, with snow on their roofs. In the background, a person stands near a house with trees and stairs, also covered in snow.

Two people stand on a snowy street. One of them is holding a dog on a leash, and a baby. The dog is wearing a purple coat. They’re in front of a house with snow on the roof.

A snowy residential street with houses and cars covered in snow. A person pulls a child on a sled while another child walks in front of them, and a person dressed warmly walks on the sidewalk. Bare trees and power lines are visible.

A shovel lying on snow-covered ground with visible footprints around it. There are several snowballs scattered near the shovel.

Snow-covered street scene with a turquoise house, chain-link fence, and parked red car. A person wearing a black jacket and orange hat stands near a dark green house. Bare trees and overcast sky.

My Valentine

A woman is sitting in living room wearing a “Portland Marathon” sweatshirt.

My valentine, my wife of nearly eleven months, is such an inspiration to me in so many ways. She inspires me to be a better husband and man, and to take better care of myself.

I want to especially call out her incredible determination over the last couple of years to running regularly. She took it upon herself to start running again after a long pause. I recall how hard it was for her to train up to running her first 5K, and then her first quarter marathon. Later that same year, with an amazing effort, she ran her first half marathon, followed one year later by her second one.

These days a 5K is just a regular run, which blows my mind. Through all the seasons, and injuries, she is going stronger than ever.

❤️

A woman jogging on a paved path surrounded by tall grass and trees. The scene is in black and white, with overcast skies and a wooden fence lining the path on one side.

🛠️ Long Workbench

After building storage shelves towards the end of the year, I turned my eyes to the other side of that area and decided to build a workbench there. The idea being that it would house my new 3D printer, and also have room for other projects that I didn’t want to do in the dusty environment of the woodworking area. I drew up a rough plan on a photo and it came to 12 feet by 2 feet.

A workshop wall with a pegboard holding tools on the left. Centered is a computer setup with cables and networking equipment mounted on wooden panels. Overlaid on the image is a green and black sketch of a structure.

Its frame would be made of 2x4 lumber held together with pocket screws (a first for me, so I went and bought a jig!). The top would have two layers of 3/4" plywood. It didn’t need to be fancy, so I decided to use more of the same birch plywood I’d used for the storage shelves.

A woodworking setup featuring a Kreg pocket hole jig with a piece of wood clamped in place, showing two drilled pocket holes. A Makita cordless drill with a drill bit is nearby, along with a tool bag containing various tools.

Installing the frame was a little bit tricky but I managed to do it by myself by stacking some boxes for support, and attached it to the bare studs with lag screws.

A wooden frame structure, possibly a tabletop or workbench, is mounted on a wall. It is supported by storage boxes with yellow lids. A level tool rests on the frame.

Then it was time to make the front legs. The floor in the basement is not only not level but also has lumpy concrete in some spots. So each leg had to be constructed by trial and error for the place it would stand.

A wooden workbench situated against a pegboard wall in a garage or workshop.

Now I was ready to build the surface which had a base, and a top. The base went on pretty quickly. I screwed down from the top to attach it to the frame. The top was made of the same plywood but I finished it with two coats of polyurethane using a spray. Spray was a bad idea, but more on that later. I installed the top by screwing up from underneath the base.

After a week I started to build the other half. It was the same process but due to issues with the studs, I had to cut a couple of dados.

A close-up of a woodworking joint showing two intersecting wooden beams, with precise markings and measurements on the wood.

The rest of it went smoothly, and I lined it up as best as I could with the first half.

A wooden workbench frame inside a workshop or garage. It is constructed with natural wood and secured with screws. The wall has pegboard and exposed studs.

Next I fastened 2x2 boards all along the edges, and mounted a strip of the same plywood along the back, and with that, it was completed.

Workshop setup with a wooden workbench, a fabric enclosure labeled “TOPCUBE,” with a 3D printer inside, and a network rack with cables on the wall. Yellow-lidded storage bins are underneath the bench.

So far I don’t feel the need for all the legs I had in the sketch, but I can add more if needed.

Lessons were (hopefully) learned. Mainly to not use spray poly to finish a large flat surface, and also not to do it in the house, even if it was in the rough basement. I finished the second one in the shed.

A monochrome photo depicting a cozy living room scene. A person covered with a blanket is sitting on a couch. A cat is perched on the back of the couch, looking towards the person. Sunlight creates patterns on the wall.

Good morning. 6th January, 2025.

📷 Hasselblad 500C/M
🎞️ Cinestill Double-X (ISO 200)

A black and white photo of a fallen, decaying tree trunk in a forest. The textured bark and exposed wood are prominently visible, surrounded by leaf litter and foliage. Trees can be seen in the blurred background.

Laurelhurst Park, Portland, Oregon. 9th November, 2024.

📷 Hasselblad 500C/M
🎞️ Cinestill Double-X (ISO 200)

Black and white diptych of a park scene. The left side features a large, gnarled tree trunk with branches extending outward, surrounded by other trees and fallen leaves on the ground. The right side shows a tree with dense foliage, fallen leaves revealing a pattern of concentric curves.

Laurelhurst Park, Portland, Oregon. 9th November, 2024.

📷 Hasselblad 500C/M
🎞️ Cinestill Double-X (ISO 200)

A black and white image showing the corner of an old building with large windows. The building’s surface is weathered with visible textures and shadows. On the left, leafless tree branches extend into the sky, creating a stark contrast with the structure.

Black and white image of Ankeny Square featuring an elaborate archway with three arches. The scene is framed by bare trees, casting intricate shadows. A skateboarder is silhouetted, partially visible near the arch.

A black and white image of a city street with leafless trees and a building in the background. A person is walking on the sidewalk. Street signs and lampposts are also visible.

Trees and nearby structures were catching my eye on a little afternoon walk in downtown. Portland, Oregon. 25th January, 2025.

A colorful RV with vibrant graffiti-style artwork is parked on a street. Behind it, a building with red walls features large windows and graffiti art, including the word “LORDS” and other abstract designs. A smaller car is parked nearby. The scene is lit by the warm glow of the morning sun.

A street corner with a blue building featuring a yellow door and several windows. A vintage pickup truck is parked nearby. Visible signs advertise ice cream. Power lines cross the sky, and a pedestrian crosswalk with traffic lights is in the foreground. The scene is lit by the warm glow of the morning sun.

A bagel sandwich with egg, sausage, cheese, tomato, and other fillings is placed on a table in a lined basket. Beside it is a blue plastic cup and a napkin holder. A small potted plant is in the background. The sandwich is lit by the warm glow of the morning sun.

Morning walk on Foster Road to get a bagel sandwich. Portland, Oregon. 18th January, 2025.

A cat in a harness sits on a porch railing, looking up at a hummingbird near a red feeder. The porch has a hanging bell and decorative elements, with a background of a yard, trees, and a neighboring house.

Friends.