• Chuck and Michael

    “Nerds of a certain age” are likely to have heard of, or perhaps even watched, the TV show Chuck. In addition to some amusing writing and strong performances by Adam Baldwin and Zachary Levi, the series featured a recurring leitmotif of notable books on software design and development.

    The episode Chuck and the Broken Heart features the definitive work on XSLT: XSLT Programmer’s Reference.

    This book was my contstant companion for many years as I developed tooling to work with XML-based documentation content.


    I always appreciated the clarity and completeness of the book, as well as Michael Kay’s continuing support of the language.


  • Magic

    If you’re an AT&T cell customer, you can save a lot of money by switching to Consumer Cellular. For our 4-line plan, switching from AT&T saved more than $150 each month (four lines, unlimited data, throttled after 50GB) while still using the AT&T network infrastructure.

    One initial problem was that conditional call forwarding (CCF) wasn’t supported. CCF allows you to forward unanswered/unreachable/busy calls to a different number. If you have a Google Voice number (free VOIP calling, nice Android app), using CCF to forward missed cellular calls means that any voicemail messages can be transcribed and e-mailed to you.

    This is a great feature, but using the standard AT&T Feature Access Code (FAC)


    to configure it resulted in errors like this:

    Carrier Message
    Call forwarding

    Using the Android app UI (Settings->Calls->Call Forwarding) produced these errors:

    Call settings error
    Network or SIM card error.

    For some reason, I tried doing this again recently, and this time it worked! Interestingly, updating the forwarding through the Android app didn’t seem to work, but using the FAC did, and after setting forwarding through the FAC, the forwarding numbers appeared in the UI.

    Handy. And magic.

  • Bagelnomics

    Despite numerous comments from the chattering classes about how Americans are “just misinformed” about the impact of Bidenomics on their daily lives, Labor Departments inflation statistics when it comes to food don’t lie:

    Category (Selected) 2020-2024 Cumulative Dec 2022 to Dec 2023 Dec 2021 to Dec 2022 Dec 2020 to Dec 2021 Dec 2019 to Dec 2020
    Food away from home 23.4 5.2 8.3 6.0 3.9
    Other food at home 26.2 2.8 13.9 5.6 3.9
    Food 23.3 2.7 10.4 6.3 3.9
    Cereals and bakery products 26.7 2.6 16.1 4.8 3.2
    Nonalcoholic beverages and beverage materials 24.8 2.6 12.6 5.2 4.4
    Meats, poultry, and fish 24.4 2.3 4.5 12.6 5.0
    Food at home 23.5 1.3 11.8 6.5 3.9
    Fruits and vegetables 16.9 0.3 8.4 5.0 3.2
    Dairy and related products 20.0 -1.3 15.3 1.6 4.4
    Eggs 45.7 -23.8 59.9 11.1 -1.5

    Over the same time period (2019-2024) our awesome local bagel bakery increased their price for a baker’s dozen bagels by 37%, from $13.95 to $19.05. So I started baking bagels myself. After several weeks of experimentation, I settled on a recipe that produces bagels that are the equal of those from the shop.

    And what do they cost?

    Ingredient Cost (/gm) Amount Cost Notes
    Diastatic Barley Malt Powder $0.02 30g $0.60 Best price for 1.5 pounds from Amazon
    Yeast $0.05 10g $0.50 Fleischman’s Active Dry 4oz bottle, retail from Target
    Flour $.0026 1100g $1.05 King Arthur Special Patent (50 pound bag from Restaurant Depot)
    Baking Soda $.044 10g $0.04 To adjust pH of pre-bake boiling bath
    Salt $0.022 10g $0.02 Morton salt, retail
    Toppings varies varies $0.50 Retail poppy seeds, sesame seeds, jar garlic
    Electricity $0.30/kWh 2 kWh $0.60 Electric stove, Eversource residential rate

    Total cost $3.31 per dozen (recipe makes 12 bagels), so $0.28 per bagel versus $1.47 from the bagel shop.

  • Google Domains, We Hardly Knew Ya

    Three years ago I wrote about deploying a pair of sites using HTTPS from a $100 fanless PC over my FIOS connection. The post details how Google Domains can be used to implement a roll-your-own DDNS system for domains registered there.

    Not long after officially announcing that Google Domains was out of beta on March 15, 2022, Google sold Google Domains to Squarespace. I had been hoping that the API would continue to be supported by Squarespace, but sadly no.


    Based on a quick Google search, it looked like Cloudfare was a viable replacement. Primarily known as a CDN-as-a-service provider, Cloudflare also offers domain registry services and an API that allows you to edit DNS records.

    The domain migration process was trivially easy (my domains had not yet been migrated to Squarespace), the domain registration is cheaper, and the API straightforward to use. Some configuration details follow.

  • Stolperstein

    This morning’s Boston Globe has a  story about the Stolperstein Memorials that can be found across Europe.

    Stolpersteine, or “stumbling stones,” identify European citizens taken from their homes in World War II. Each begins with the phrase “Here lived.” They then document the birth date, date of deportation or escape, and, if known, the date and place of death. Laid into the pavement in front of the last voluntarily chosen residence of these citizens, the plaques are the life’s work of German sculptor Gunter Demnig, whose inspiration comes from a passage in the Talmud: “A person is only forgotten when his name is forgotten.”

    On one of my many business trips to Budapest, a colleague in the office mentioned these to me, and it happened that I had been walking past a Stolperstein each morning on the way to the office.


    In front of an apartment door


    embedded in the sidewalk cobblestones


    is a memorial to Aczél Bertalan (in the Hungarian custom, the last name is given first).


    Here lived Bertalan Aczél born 1877 Deported and Killed 1945.11.4 in Dachau

  • Saturday

    They say it’s good to have goals. Every Saturday, mine is to complete the Saturday New York Times crossword puzzle, in ink, without errors.

    Today I came close, but unfortunately I spelled ‘Lon Chaney’ incorrectly on my very first entry.


    If you want to play along, here were the clues:

    1 It means "father of" in Arabic
    4 Catty remark?
    7 Rated PG-13 or R, say
    12 Sylphlike
    14 Fit out
    15 "Amaaazing!"
    16 Is a witness
    17 Comedian John who is said to resemble a love child of
       Harry Potter and Owl from "Winnie-the-Pooh"
    18 Ottawa leader
    19 Stun gun
    20 Like part of a dress affected by static cling, say
    22 Hootenanny
    24 Word with gag and ground
    25 Headwear for the big game?
    27 Levy of "Schitt's Creek"
    28 Isn't open about oneself
    30 Drink cooler
    33 Stereotypical Silicon Valley types
    35 Act huffy?
    37 Came out of the blue?
    39 Launched weapons
    41 Unwanted autocorrections
    43 Bonny young lady
    44 Influenza
    45 Some Buddhist mandalas, e.g.
    46 [More details below]
    47 Acknowledgment of a poor performance
    48 Schoolmaster for the classroom, e.g.
    49 Italy's longest river
    50 Spec for a script
    51 Atlanta-based network
    1 Parcel
    2 Place to study cultures
    3 They're issued by the Bureau of Consular Affairs
    4 Suit cut between "classic" and "slim"
    5 House of Saud title
    6 Like some blankets and bars
    7 Along with the anteater, one of two animals 
      in the order Pilosa
    8 Less hurried
    9 "Pfft, this one doesn't work"
    10 Count ___
    11 Currency whose name means, literally, "round"
    13 More than a couple
    14 Skin-toned cosmetic
    16 Silent film star known as the "Man of 
       a Thousand Faces"
    18 Disciplinarians, at times
    20 Something often seen with trunks
    21 Fold
    23 British pop star with more "Ed Sullivan Show"
       appearances than the Beatles
    26 It gets bald over time
    29 Going down the drain, in a way
    30 Inits. at a bar
    31 Place to get a wax
    32 Summit goal
    34 Back
    36 Occupied
    38 Can opener
    40 Cattle-grazing tract
    42 Looks like
    44 Good name for a biologist?
    45 Collect dust
    46 ___ Taylor-Johnson, director of "Fifty
       Shades of Grey"
  • Illustration

    Sometimes the most effective method for communicating technical information is a quick drawing on a whiteboard.

    A number of years ago, I acquired a Craftsman tablesaw from the 1930s:


  • User Error

    Like many, I’ve spent much of the past year working from home. To improve my productivity, I created a wired and wireless infrastructure in my house. My internet service provider is Verizon FiOS, and their service is excellent, with good bandwidth and excellent reliability.

    The following diagram summarizes the overall network configuration:


    The “consumer” network is managed by a Google Mesh WiFi system. This mesh router is connected to the FiOS router through a wired connection. The mesh router is also connected to an Ethernet switch, and this switch provides wired connection for consumer devices including a game console, media streaming device, and a Chromecast-equipped smart TV.

    The “professional” network is managed by the FiOS router. An Ethernet switch is connected to the router, and it provides wired connections for a Linux host (used to serve a hobby web site), a laser printer, the wired dock for my work computer, and a second media streaming device.

  • Quality of Life

    I’m spending a lot of time in Visual Studio Code on a Linux-enabled Chromebook. (In fact, I’m using it right now.)

    Unfortunately, the default appearance of the menu bar, well meh…


    But it turns out that with a small preferences tweak

    how to

    you can have a nice, compact menu bar:

    how to

  • Free hosting (multiple domains, SSL, subdomains)

    In addition to this domain, I had a couple others languishing at the somewhat skeevy godaddy.com. I’d configured them to redirect to a pair of Medium publications, back when Medium was offering free SSL certificates for custom domains on their site.

    I also had an obsolete Lenovo laptop running Linux, with Verizon Fios internet service, pointed to by a a DDNS name from noip.com I’d been using it for hobby-grade stuff, but the lack of HTTPS was going to be a problem.

    But thanks to this article from Jeremy Gale I was able to redirect my two domains to my on-prem Ubuntu server, set up a number of subdomains, and obtain free SSL certificates for everything.

    Here’s a short recap of what I did.

  • About this site

    Once you own a domain, especially domain named after yourself, you’re kind of stuck with it. You can’t really just throw it back into the ocean. For a long time, this domain was pointed at a page created with the “original” Google Sites (you can see it here), but there was no easy way to support https with a custom domain on legacy Google Sites.

    I was naturally pleased to discover how easy it was to get a Github-hosted Markdown site to work with https.

  • In Other News

    Video from hammering the GT3 around Lime Rock last September. Filed under “he ought to know better.”


  • Touristfahren

    Last Touristfahren day at the ‘ring. Lots of traffic but lots of fun. Driving a Renault Megane RS.


  • vi

    If you’re going to work with a Linux host, you need to know at least a little vi.

    My helpful screenshot

    Available formats: PDF Editable PDF Press-Ready PDF PNG

    License: ©2015 Ed Dennison CC-BY-NC-SA

  • Icy Morning

    Rain+snow+freeze means an icy hike in the hills overlooking Boston.

    My helpful screenshot

  • Write/Draw/Code/Think

    I’m looking for a Natick-based writer who loves math and visual design. Or a mathematician who loves to write and draw pictures. Or an artist who loves to write about mathematics. Anyway, it’s a cool job with a cool company. More information at https://www.cognex.com/careers.aspx.

  • Nürburgring Nordschleife

    Also in the “life goals satisfied” section, I recently had a chance to drive the famous “grüne hölle” in Germany:

    Rainy Ring

  • Top of the World, New England Edition

    I was able to fulfill a key life goal last week by hiking to the top of New England’s highest peak, Mt. Washington. The hike took me up the Ammonoosuc Ravine Trail to the summit, then across to the summit of Mt. Jefferson and down the Caps Ridge trail. About 10 miles of walking and about 4500 feet of vertical climb. Time on the trail was 9 hours.