Words to Live By

I’m copying and posting this here to remind myself, from time to time, of the message.

Well hey, here’s a valuable piece of information for you.

Most things, fairly universally, you’re wrong about. Yes, it’s true. Most of the things which you believe you’re right about – you are in fact wrong about. To some degree, either by having an incomplete picture of facts but believing you’ve got a complete one, or holding differing viewpoints and not being aware of it, or making a judgement on an incorrect assumption or even bad information you’ve received…

It’s just that most of the time the amount of your inaccuracy doesn’t matter. But accepting that fact is important because it allows room for you to accept errors in your thinking on important issues.

You’re not infallible, you’re not so great, you don’t know much. But that’s OK. Because none of us are infallible, none of us are that great, none of us know all that much.

But if you’re humble enough – you’ll keep learning. Slowly decreasing the margin of our error is all we can hope to do. If you believe you’ve fully closed it…that it’s reached 0, that you’ve finally got it all figured out and there is no more error…well then you’re just flying blind now. It may take a while, but you’ll eventually crash – as any pilot with closed eyes eventually does.

Bricka_Bracka via Reddit

 

Beef Kebabs

I am shocked, shocked I tell you! that my children actually enjoyed this recipe.  I’m not sure why, perhaps they have given up all hope of enjoying a decent meal from my kitchen and now sullenly submit to my demands that they eat the goddamn food that I paid for and worked hard to put in front of them and it’s not like you do any chores around…  Ahem.  I got a little off track here.

Whatever the reason, they ate this one on my first attempt.

These are basically middle-eastern meatballs.  You can cut in other things with the meat, serve them in a variety of ways, whatever floats your boat.  (I rather enjoyed wrapping them in some naan with rice.)  It’s a meatball.  It’s the spices that make it.

The oven instructions are below.  We haven’t grilled them yet, but they should do great, just use a little grill-sense.  It’s a reasonably easy and fast recipe, ~20 minutes to prep and ~20 minutes to cook.

The recipe plus rice and other sides makes enough for 6-8 people.

Ingredients

  • 2 pounds of ground beef – don’t get a lean mix!  80-85% seems good
    • mix in other ground meats as your fancy takes you, but you need some fats – don’t go too lean
  • 1 egg
  • 1/2 cup chopped fresh parsley, or 1/4 cup dried
  • 1/2 small onion, diced fine
  • 1 red bell pepper, diced fine
  • Garlic, 3-4 minced cloves
  • Paprika, 1 tsp
  • Salt, 1 tsp
  • Cumin, 1/2 tsp
  • Pepper, 1/2 tsp

Directions

If you plan on skewering the meat, and you’re using bamboo or wood skewers, soak them in water for ~30 mins.

  1. Preheat oven too 350°
  2. Mix all the ingredients in a bowl (don’t overmix)
  3. Form the mix into oblong patties, about kielbasa-thick
    • If you’re skewering, shove in the skewers now or form the patties around the skewers
  4. Bake in the oven for 20 minutes, or grill for ~20 minutes, flipping at least once
  5. For the last couple of minutes turn on the broiler to brown the meat

Usual disclaimer with ground meat dishes: make sure the internal temp is at least 160° before serving.

Serve with some traditional middle-eastern sides, like:

  • Naan bread
  • Tabbouleh
  • Cucumbers and cherry tomatoes
  • Rice

kebab with rice and naan

Even if we’re in The Matrix, does it really matter?

Let teachers and philosophers brood over questions of reality and illusion. I know this: if life is illusion, then I am no less an illusion, and being thus, the illusion is real to me.

“Conan the Barbarian” in the novel Queen of the Black Coast by Robert E. Howard

CNAMEs in Samba

I’m documenting something that wasn’t easy to uncover.

TL;DR – if you want to create a CNAME in Samba to replace an existing DNS record, you must delete the A record first.

Background

I have an Active Directory domain running on Samba.  I’ve had an underpowered file server, simply called ‘files’, for a while.  I finally had a chance to upgrade it to some newer hardware with a rather large SSD.

Since this, like all my home projects, is a side-project that takes several days to complete I chose to build the new server (‘concord’) and get it running while leaving ‘files’ in-place.

I like to have servers named after their roles, because it makes things easy, but we have a lot more computers than formal roles in the house.  We’ve finally settled on a naming convention: Windows names are places in Washington, Apple products are from California, and Linux products are from Massachusetts.  (I am aware that Unix was birthed in New Jersey but… Ew.  At least X came from MIT, that’s good enough for me.)

I also have a number of dependencies on the name ‘files’ including, most crucially, my own brain.  Muscle memory is hard to overcome (“ls /net/files/… damn ^H/net/concord/…”) and I don’t want to relearn a server name.

That left me with three problems to solve: follow the naming standard, use a “taken” name for the server, and build said server while the needed name is still available on the network.

The obvious answer is to use CNAMEs.  I planned to set up ‘files’ as an alias to ‘concord’.  Similar practice would carry us forward through an indefinite number of role-swaps in the future.

After copying all of our data from ‘files’ to ‘concord’ I confidently shut ‘files’ down and added my CNAME.  This is where things went wrong.

The Problem

After shutting ‘files’ down, I started by creating the CNAME:

dc1 # samba-tool dns add 192.168.1.2 ad.jonesling.us files CNAME concord.ad.jonesling.us -U administrator
Password for [AD\administrator]: ******
Record added successfully

That’s all well and good.  Let’s test it out from another computer:

natick $ nslookup
> files
Server:     dc1
Address:    2001:470:1f07:583:44a:52ff:fe4a:8cee#53

Name:   files.ad.jonesling.us
Address: 192.168.1.153
files.ad.jonesling.us   canonical name = concord.ad.jonesling.us.

Crap.  That’s the correct canonical name, but the wrong IP address – it’s ‘files’ old IP address.

Some googling uncovered someone with a similar issue back in 2012, but they “solved” it by creating static A records instead.  That’s not a great solution, certainly not what I want.

I thought about it for a few minutes.  I got a success message, but was the record actually created?  How can I tell?  What happens if I insert it again?

dc1 # samba-tool dns add 192.168.1.2 ad.jonesling.us files CNAME concord.ad.jonesling.us -U administrator
Password for [AD\administrator]: ******

ERROR(runtime): uncaught exception - (9711, 'WERR_DNS_ERROR_RECORD_ALREADY_EXISTS')
  File "/usr/lib/python3.7/site-packages/samba/netcmd/__init__.py", line 186, in _run
    return self.run(*args, **kwargs)
  File "/usr/lib/python3.7/site-packages/samba/netcmd/dns.py", line 945, in run
    raise e
  File "/usr/lib/python3.7/site-packages/samba/netcmd/dns.py", line 941, in run
    0, server, zone, name, add_rec_buf, None)

Well, it was inserted somewhere, that much is clear.

What happens if I dig it?  nslookup gave us a canonical address, but I want to see the actual DNS record.  Maybe it contains a clue.

First, lets dig the CNAME:

dc1 # dig @dc1 files.ad.jonesling.us IN CNAME

; <<>> DiG 9.14.8 <<>> @dc1 files.ad.jonesling.us IN CNAME
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10370
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 7a0aa65a623d5d3bdbdc39075f2eff9d5b81dbd9ed05c9d0 (good)
;; QUESTION SECTION:
;files.ad.jonesling.us. IN CNAME

;; ANSWER SECTION:
files.ad.jonesling.us. 900 IN CNAME concord.ad.jonesling.us.

;; Query time: 8 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Sat Aug 08 15:40:13 EDT 2020
;; MSG SIZE rcvd: 100

I’ve bolded the line that shows the alias.  That looks right.

But what about ‘files’?

dc1 # dig @dc1 files.ad.jonesling.us

; <<>> DiG 9.14.8 <<>> @dc1 files.ad.jonesling.us
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42296
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 0352365b5c07ecdace1ebf3c5f2effa6da5d32bfe9002b32 (good)
;; QUESTION SECTION:
;files.ad.jonesling.us. IN A

;; ANSWER SECTION:
files.ad.jonesling.us. 3600 IN A 192.168.1.153

;; Query time: 8 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Sat Aug 08 15:40:22 EDT 2020
;; MSG SIZE rcvd: 94

Ah.  That looks like a conflict.  Both records exist, and one has primacy over the other.

‘files’ was assigned an address via DHCP, I never gave it a static address, so I didn’t expect that I would need to delete anything.  But if I think about it, I realized that Samba doesn’t know that ‘files’ isn’t coming back.  (That makes me wonder what kind of graveyard DNS becomes, with friends’ phones and laptops popping in from time to time.)

So, can we delete the old A record, and what happens if we do?

The Solution

We delete the address.  It looks like it’s working:

dc1 # samba-tool dns delete 192.168.1.2 ad.jonesling.us files A 192.168.1.153 -U administrator
Password for [AD\administrator]:
Record deleted successfully

Was that the problem all along?

dc1 # dig @dc1 files.ad.jonesling.us

; <<>> DiG 9.14.8 <<>> @dc1 files.ad.jonesling.us
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38286
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 1610fb8ec07db8e3a43976ed5f2effdffeb142b30ca93848 (good)
;; QUESTION SECTION:
;files.ad.jonesling.us. IN A

;; ANSWER SECTION:
files.ad.jonesling.us. 900 IN CNAME concord.ad.jonesling.us.
concord.ad.jonesling.us. 3600 IN A 192.168.1.82

;; Query time: 15 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Sat Aug 08 15:41:20 EDT 2020
;; MSG SIZE rcvd: 116

That looks pretty good!

Geoffrey the Automower

I met my robotic overlord, and I immediately pack-bonded to it.

Let me back up a little.

I am not a gardener. I hate taking care of lawns. I’m the type of person that likes to do a good job, do it well, get the result perfect – and then it should stay that way. I don’t like doing the same thing over and over. It gets dull, quickly.

A lawn takes a lot of work. It runs counter to my pleasure. No matter how well I do the job, in two weeks I have to do it all over again. So my lawn always looks like crap.

So this year I took my government-issued funny money (the CARES stimulus payment, AKA the COVID relief) and plowed it right back into economy. I bought an “automower.” Specifically, I purchased a Husqvarna 115H.

What Is An Automower?

An automower is a Roomba for your lawn. You set a schedule and it takes care of getting the lawn trimmed and keeping itself charged. During operation it makes random passes over its mowing area and covers every square inch… eventually. It comes with a base station where it charges and “sleeps” when it’s not in use.

The mowing area is defined by a “boundary wire” that makes a continuous loop from the base station, around your yard, and back to the base station. (It is possible to have multiple mowing areas.). There is also a “guide wire” that extends from the base station to help the mower come home.

Automowers tend to be “mulching” mowers, meaning they leave their grass clippings in place instead of bagging them up and dumping them somewhere. Since they run so frequently this shouldn’t leave an unsightly mess; each cut should be millimeters in length.  Mulching and leaving the grass clippings in place is better for the lawn, as well as making the mower simpler and far more reliable.

They’re convenient, but also environmentally conscious.  They’re universally electric, making them quiet, emission-less, and built with a minimum of materials.

My First Thoughts

Setting Up

I purchased direct from Husqvarna.  The mower arrived in just a couple of days. (Going through Lowes or Home Depot would have taken a week longer.) The box is an armload but can be managed by a single healthy adult.

Everything you need to set the mower up comes in the box, except housings to keep the power supply and base station dry.  More on that in a moment.

The instructions were a bit unclear, but not terrible. There are steps that are in the quick setup guide that aren’t in the full guide, which is annoying, you need to read both.

There are diagrams, but they’re useless until you know what you’re doing – at which point you don’t need them anymore because the rules are quite logical.

The manual spends some time explaining complicated setups with multiple zones and islands, which may only apply to a minority of buyers, but no time spent on some of the most basic (and critical) steps: picking a spot for a base station and considerations for a guide wire.

Here’s What You Need To Know

  • There are two wires to worry about: the boundary wire and the guide wire.
  • The boundary wire makes an unbroken loop around your yard and through the base station.
    • The loop may not cross itself. (This is stated in the manual, but poorly in my opinion.)
  • The guide wire connects to both the base station and the boundary wire with a splice. The mower comes with little splice boxes to accomplish this.
    • It can connect anywhere on the boundary loop, so long as the first meter (3 feet) extends straight out from the base.
    • The guide wire may bend after the first meter, but should not have corners. The mower has trouble following at corners, and may run off the guide and get lost when it’s at its most tired and starving, which will make you worried and sad. Gentle, freeway-style curves are best.
    • To save on wire you may bend the guide wire right back to boundary, after you’ve come out a meter from the base station.
    • The quick start mentions that you need  to make a loop of wire somewhere in the boundary, but the main booklet does not.  Neither guide says why you’re doing it: you need to plan where the guide wire will tie into the boundary and leave some slack there. There’s no indication regarding how long to make the loop – a finger’s length is enough. You’ll splice the guide wire into the boundary wire using one of the included splicing boxes.
  • The instructions say this, but it’s not clear enough: the boundary wire should not come near the left side of the base station.
    • “Left” is your left as you’re facing the front of the base station.
    • The boundary wire should run away from the base station at a minimum 45° angle from the left side of the base station, and go out for at least a meter or two. If it’s too close to the base station you’ll get a calibration warning.
    • Since most of the important work takes place behind the base station, it would make more sense to change the point of view and reverse left/right in the instructions.
  • It’s not clear how frequently to put stakes down to keep the wire in place, except indicating that you must space them a minimum of 30 inches apart. I took my best guess on frequency, but I’m also lazy so maybe I didn’t use enough. Time will tell.
  • Finding a good home for the power-brick was harder than expected, as the instructions tell you that it shouldn’t get wet. (That’s an odd requirement for outdoor hardware.) I wound up screwing it under our deck, inside a plastic tupperware bin to protect it from drips.

Total Set Up Time

From unboxing to the mower’s first run was about three hours of work.

Our yard is basically a square, less than two-tenths of an acre, and it’s all behind the house.  We don’t have any complicated edges or ‘islands’ that require runs into the yard.  Everything we need the mower to leave alone is in the outside edge.

We chose to lay the wire on the soil and stake it down, rather than trenching and burying it. The mower comes with plenty of stakes and wire; we used a fraction of one spool. If there were complicated sections we could easily have used more, but now we have enough leftover to fix mistakes and broken wires for a while.

Laying the wire on the soil was an easy choice because we have very little grass. Our yard was re-graded this spring and there’s still lots of bare soil. (We skipped hyro-seeding so we could customize the mix ourselves – wildflowers on the edge and lots of clover everywhere else.)

We stopped in the middle of set-up to run out and buy a 30 qt plastic tub, to make an ersatz garage for the base station. I’m not counting that time in the set-up time.

I may make a real “dog house” for it later.

Operation

Getting the mower itself running was very easy for me. I’m a technical person, your mileage may vary. You push it into the base station to start charging, set a security PIN to prevent theft, fill in some other information, and push “start.” That’s about it for the year, unless you want to make changes.

The unit is quiet. It’s much quieter than I expected. I expected moderate electric lawnmower noise, but I got nearly-silent operation. It’s “guaranteed” to be 59 decibels or less, but as a layman I have no point of reference for that. Suffice it to say, it’s super quiet.

Here’s What You Need To Know

  • There are three small blades that attach to a disc underneath.  They have a short lifetime.  The manual suggests that they will need to be replaced every 4-7 weeks.
    • The mower comes with your first summer’s worth of blades, and replacements are relatively inexpensive.  We found a set of 30 online for ~$15.
    • They look to be reasonably easy to replace.
  • You may schedule the unit to run around the clock – it doesn’t care about day vs night.  Consider nocturnal animals before you schedule it for nighttime, though.
  • You don’t need to shut it off in the rain, though you might want to unplug it during thunderstorms.
  • There’s a phone app that connects over Bluetooth that’s easier to use than bending over the control panel on the mower.

It’s very fun to watch. I immediately started rooting for it to knock down tall sprigs of grass and other vegetation. It’s good to watch it to make sure you set the boundaries properly, leaving enough room for “overage.” It will cross the boundary a little, you can’t make tight margins.

We’ve had it running for less than 24 hours and it’s reached pretty much every point on the lawn.

If the mower crosses a boundary, hits something that activates the bump sensor, or gets confused, it backs up and tries a new direction.  That seems to be a simple and effective solution.

Here’s a video of the mower in action this morning:

There is a stand of taller weeds emigrating from a neighbor’s yard, which took over that side of the yard last year. It has already re-sprouted and grown to a foot high since we re-graded the yard a few weeks ago. If we let it go all summer again, it will grow into two-meter-tall woody stalks. The mower has been slowly nibbling it back until the bump sensor activates, and has already cut down nearly all of it – about 2 square meters (6 square feet). We might have to weed the very edge of the fence, but that’s it.

Considerations Before Trying

Autonomous mowers might not be a good mower for some situations:

  • You like to make patterns in your lawn, like my boss does. He enjoys making checkerboards like you see on professional baseball diamonds.
  • Your lawn is complicated, with lots of islands, special plantings, drop offs, marshy spots, and/or slopes.  The boundary wires will be time-consuming to lay out.
  • There is particularly uneven ground in the mow-zone, with holes, ruts, divots, and/or surface tree roots.  The mower could get stuck and require frequent rescues.
  • Boundary wires could be a tripping hazard in a high-traffic lawn and are more likely to be broken by repeated stepping.  Burying may be a good solution, but complicates installation.

Closing Thoughts

Despite some frustration with the setup instructions, the first 24 hours have gone swimmingly and I’m very happy. This might be the first time in my adult, home-owning life that I’ve had a neat lawn for more than a week per summer.

Having a real, autonomous, domestic robot makes the future feel like it’s finally arriving.

Air Disasters

I think that, were I an A-list actor, I would ask for bit parts in Air Disasters.

I would take roles like a random passenger. Non-speaking, maybe three seconds of screen time at most, just something fun for me and for fans.

I’ve seen small time actors from other shows, such as Russell Ferrier (whom I recognized from an Outer Limits episode), which is a treat. But could you imagine spotting Robert DeNiro in the cabin, or Jessica Chastain in the background of a tower scene?