Category Archives: Personal

Static Site Generation from Django

I created App-o-Mat in 2014 using Django (pre-1.0) and Python 2, and for all that time it was deployed on relatively cheap hosting that supported Python backends. Unfortunately, my host recently decided to stop supporting Passenger and Django had long ago abandoned fastcgi. My options were to upgrade my hosting or look for an alternative host.

I had been wanting to look at AWS’s App Runner service, so I started reading through the docs and doing a trial port of my site. Since I also use MySQL, I had to also learn RDS. At some point I knew enough to try to figure out what this was going to cost to host and it turned out to be more expensive than just upgrading my hosting platform, so I abandoned AWS.

App-o-Mat is a content-driven Django app. It doesn’t have any interactivity in the public pages—most of the advantage of Django to me is in its CMS admin interface where I can author new articles. The public site is essentially static.

So, rather than upgrade my host, I decided that I now just run the site locally on my laptop and use wget to crawl it to get a static site that I scp to my host. I had to manually cause issues to get my 404 and other error pages to be part of the crawl. I see that there’s a project,, that purports to turn any Django project into a static site generator, but it also doesn’t automatically handle your error pages.

I might use django-distill in the future, but I write new content very infrequently, so we’ll see.

February/March 2024 Blog Roundup

Personal productivity has been on my mind in the past couple of months because of a new tool I am working on. I shared thoughts in these posts

I also finally started Season 4 of my podcast, Write While True, which is where I share what I am learning about writing.

And I also shared my process for generating Transcripts for a Self-hosted Podcast.

Double Down on Things that Work for You

At the end of January, I realized that the actions I decided to take for my fitness goals weren’t working, so I decided to add more light-impact cardio.

So, it appears that for me, I might need more cardio. From my research, I know that this may inhibit muscle growth, but that effect is because of calorie deficit. So, I will add more cardio (but low stress activities like swimming, rowing, and the elliptical) and I need to find a good healthy source of extra calories

Right after I wrote that, I realized that more walking might also help and was very easy to fit into my days. It’s only been two weeks, but the effect was obvious enough that I decided to do much more walking than I planned.

I started with a daily goal of 12,500 total steps, but now I get over 20k most days. The extra walking is hundreds of calories, which I eat because I am trying to build muscle.

To get this many steps, I have added the following practices:

  1. Almost all of my reading or video watching is on a treadmill. I don’t need to make time for this. I do it in whatever clothes I’m wearing and keep it at a slow enough pace.
  2. Almost all podcast listening has to be done on an outside walk.
  3. If I have to walk somewhere, I leave a little early and add at least 10 minutes more walking each way.
  4. I installed Pedometer++ on my iPhone/Watch and use their widgets as my scoreboard. My current steps is in a complication I see all day.
  5. I try to get close to 10,000 steps in the morning (to win the morning).

20k might unsustainable long term, but I always dedicate the first thirteen weeks of the year to try to make big changes in my life so I can see what the impact would be. Then, I size it to something I can keep on doing.

Win the Morning

Using The Four Disciplines of Execution, I am trying to reach my goals by “playing a winnable game”. The strategy is to develop a lead measure that you can act on at any time (see 4DX: Applying the Second Discipline). But, I find that I win this game more often if I act in the morning.

For fitness, I am doing more strength workouts, incorporating long walks into my day, and eating a healthy high-protein breakfast. I work out at around 7am and eat breakfast soon afterwards, so this is usually done by 9. If I get up early enough, I do a long walk to the gym.

My other two goals have dedicated time allocated to them. I front-load that as much as possible, and move anything that could be distracting to late in the day (especially meetings). I want to work on the important tasks when I have the most energy for them.

According to When by Daniel Pink, for most people, the morning is good for deep work and the afternoon is better for collaboration and ideation. I am clearly one of the “most”, because this works well for me.

January 2023 Roundup

I have two things taking most of my time these days, and I’ve been using them to give me topics to write about.

I am working on a book on Tech Debt

I am working on personal productivity software

I also announced season 4 of my podcast, which I am still working on. I hope that there will be episodes in February, but not sure yet.

Help my book

I am writing a book titled Paying off Tech Debt When You’re Not In Charge.

The intended audience is software engineers working within orgs where they are having trouble getting tech debt paid.

If this sounds like a problem you have and would like to read my first three chapters, let me know. I am in very early stages and want to make a useful book, so the best feedback would be if it was useful to you or not.

4 Week 4DX Checkin

I’m using techniques from The Four Disciplines of Execution (4DX) this year to help me reach my important goals. I documented my setup process in these posts:

  1. 4DX: Applying the First Discipline
  2. 4DX: Applying the Second Discipline
  3. 4DX: Applying the Third Discipline
  4. 4DX: Applying the Fourth Discipline

The gist is that you (1) identify an important goal (2) design and act on lead measures — things you control that you can do at any time that will add up to that goal (3) create a compelling scoreboard and (4) have regular accountability.

I chose to have 3 goals in 3 separate areas of my life that have segregated time. The book stresses having only one goal, because they are imagining that you apply this to work—I do have only one work goal.

For my work and personal growth goals, I have done my lead measures at or more than the level I wanted and I am making progress. Things seem to be going fine there.

For my fitness goal, I am doing what I set out to do, but I am not seeing progress, so it’s time to rethink if my lead measures are right. In my case, I think they are generally good things to do, so I will keep doing them, but they are obviously not enough.

In 4DX, we are supposed to periodically make sure our lead measures are taking us where we want to go. So, I want to share my thinking. The point is not my specific fitness goals or process—if you disagree with my fitness approach, that’s fine—the point is that I am trying to incorporate new knowledge and try something else.

Here’s my thinking:

My fitness goal is to reduce body fat with the lead measures of strength training and higher protein breakfasts. The result so far is that I am getting stronger (can do more pullups, lift more), but my body fat % hasn’t changed at all. My weight also hasn’t changed, but I am ok with that. I have been using a body fat scale since 2019, so I looked at my history, and I see that my lowest body fat % was when I was doing the most running. This is frustrating.

I chose to lower the amount of running I do because I am trying to avoid knee problems. I don’t have any now, and I want to keep it that way. During my lowest body fat periods, I was training for half and full marathons, which I am not planning to ever do again.

So, it appears that for me, I might need more cardio. From my research, I know that this may inhibit muscle growth, but that effect is because of calorie deficit. So, I will add more cardio (but low stress activities like swimming, rowing, and the elliptical) and I need to find a good healthy source of extra calories. I hate to rely on protein shakes, but that will be part of it. I have also seen some research that would indicate that I should substitute whole starches for tofu and tempeh because of their high fat content.

So, my breakfast will have fewer tofu scrambles with tempeh bacon and I’ll have to come up with a bean/quinoa breakfast. I also make an egg substitute from mung beans that has better macros than Just Egg, which I’ve been having a lot of. I will also cut bread as much as I can—mostly this is a problem because I use plant burgers as an easy lunch—I’ll just have to have it with no bun.

So, my new lead measures are to keep the strength workouts, add three 30+ minute low-stress cardio workouts, and keep the breakfast, but lean more on beans/quinoa/mung beans and less on tofu and tempeh, and skip the bread as much as I can. I will need more calories, but I will find them in whole starches.

In any case, don’t let my fitness choices distract you. The point is to periodically look at your desired lag measures for your goal and make sure your lead measures are moving towards it. It’s not something you can see every day, but I think four weeks is enough.

Grouper with Orange Sauce

Today is my wife’s birthday, and I don’t have time to write, so I’ll just share a recipe for part of the dinner I made for her


  • 1 fillet of Grouper, approx 1/3 pound
  • Flour to dredge
  • Butter (a few pats to cook and then about 1-2 tbs for the pan sauce)
  • Olive oil (1 tbs)
  • Juice from 2 mandarin oranges (I put peeled oranges in immersion blender and strained)
  • Zest from 2 mandarin oranges
  • Shallot, very finely minced, about 2-3 tbs
  • Thyme (1 tsp)
  1. Heat a pan over medium heat
  2. Put flour on a dinner plate, season with salt and pepper to taste
  3. Dredge Grouper in flour
  4. Melt pats of butter in olive oil in pan
  5. When the pan is hot, place grouper in it, don’t move the fish—let it sear.
  6. Depending on thickness, turn when first side is ready (4 or more minutes). Fish should be easy to flip—look for some browning.
  7. After second side is cooked, put aside or move to side of pan off direct heat (make sure it’s cooked through)
  8. Put shallots and zest in pan for about a minute
  9. Deglaze pan with juice
  10. Add butter, continue deglazing
  11. Add thyme
  12. Put grouper back in pan and coat with sauce
  13. Put sauce on plate and fish on top of it

If you want more instructions, see this page for how to pan sear grouper. They have a different sauce, which you might also like.

I served with roasted red potatoes and steamed haricot verts with almond slivers.


My Current (2024) Blog Stack

This blog is 20 years old. I started with static files generated from CityDesk and hosted on a simple server. Then, I went to static files generated from RapidWeaver on Mac. In 2012, I realized that I needed it to be easier to post, so I migrated to WordPress.

I very rarely updated this site in 2012. I finally decided to bite the bullet and get everything into WordPress so that I could update from any machine, not just the one I had RapidWeaver installed on. I immediately got a bunch of benefits (1) the site has a mobile theme (2) I can update from my phone or iPad using WordPress apps (3) dealing with images and other media is a lot easier and (4) publishing is automatic and fast. Since the migration, I have maintained about a weekly update schedule.

I have been on WordPress since then and can’t see any reason to change. A few years ago, I migrated to DreamHost, which I recommend for WordPress hosting. They can do more than WordPress—I also host App-o-Mat there (which is a custom Django site).

My theme is WordPress’s Twenty Twelve. Each year they make a new theme (named for the year). It was the default when I migrated, and I didn’t look for anything else because I wanted something plain, which it is.

I really try to limit my plugins. There are three that I recommend if you need the features they implement.

I use the Blubrry plugin to help me self-host my podcast. It generates the podcast feed automatically from blog posts.

I use the Contextual Related Posts plugin to put related links at the bottom of each post and the Exclude Pages from Navigation plugin to let me control which pages show up in the navigation.

Aside from those, I just picked the most popular ones for generating a sitemap and to make it easier to embed videos hosted on YouTube and Vimeo.

I use Hover as my domain name registrar.

I have no plans to change anything. I do keep an eye on the CMS sites that offer some distribution (Medium, Substack, etc), but I care too much about owning my URLs and keeping content in something I could easily migrate away from.

The Last 13 Weeks

This is the fourth post in the series that covered my journalling in 2023. Here are the other three: The First 13 Weeks, The Second 13 Weeks, The Third 13 Weeks.

Based on my experience this year, here’s what worked:

  • Journalling in a book with a place for each day: I rarely missed more than a day in a row of journalling, so nearly every day was filled. In the past, I could go weeks without journaling, usually in the late summer. Having a space to fill was an incentive to do it.
  • Journalling in color: I wrote in Black and Red and it did what it was supposed to do in drawing my attention to the more important stuff when I was reviewing it.
  • Journalling my theme: My theme lasted the whole year. In 2023, I concentrated on Making Art with Friends. I did that by joining groups of likeminded people and starting a tech meetup. In my journal, whenever I did something on-theme, I made sure it was in red and circled.
  • Journalling my meals: I kept a log of what I ate each day in the right margin. I keep it simple so it’s as easy as Taking a Picture of What You Eat, which is enough to keep me mindful of what I’m eating.
  • Journalling on paper even if I also use software: In these last 13 weeks I’ve also started working on personal task management software. I have been using it in addition to my journal. It’s redundant, but so far I’ve used both as they give me different benefits.