Videochatting on Thanksgiving: An acceptable teleconferencing solution for the whole family

In late October I started thinking about how in the world we were going to videochat with family on Thanksgiving in a way that didn’t involve holding a phone at arm’s length while we tried to keep a baby from grabbing it. I got some advice to use a computer for the video portion and an external speakerphone–like you might see in a conference room–for the audio.

For us what ended up working was:

  • iMac at one end of the table. This is admittedly overkill, but nice to have an all-in-one solution for the “computer” part of this. You could easily use a laptop, or a laptop connected to a tv.
  • External webcam (Logitech c920). What you’re mostly after here is a wider field of view than your computer’s camera. The wider field of view meant we all didn’t have to be directly on top of each other to be in frame.
  • External speakerphone puck (Jabra 410). I think this worked better than the iMac, but didn’t do any comparisons. Regardless, it was nice to have something that could be more centralized in the room rather than tied to the computer. I’m unlikely to use this thing more than a few times, but for the few times we use it it will be massively helpful.

Of course I didn’t grab a photo of this setup, but it ended up working very well! Bounced between Skype and FaceTime depending on what people had. Next time we do this I’m going to try use the TV as our display and put the webcam on top of the TV. It’s not the same as being in the same room, but needs must.

Small Box For Beach Treasures

On Friday we went to the beach in Port Huron, MI and my daughter collected rocks and shells. The rest of the weekend I worked on making a small box for her to keep those treasures in. Final dimensions came out to about 3.25”x2.25”x2”. Materials were white oak and Titebond III. Finished with three-ish coats of shellac buffed to a satin finish with steel wool.

Pictures taken in every woodworking project’s natural environment: outside in the grass on top of a scrap of figured walnut.

A small box is much harder than a big box.

The boards for this were resawn on the band saw from a single piece of scrap wood and then planed down to roughly 1/4″ on a thickness planer. I wanted crisp mitered corners, but the small pieces kept tearing out on the table saw and, frankly, I was closer to the blade than I wanted to be for those cuts, so I settled for simple butt joints. Now that it’s all together I quite like the look of the exposed end grain all around it.

You make boxes like this by gluing it all up as a solid rectangular cuboid (aka “a box”) and then cut around four edges to pop the lid off. Cutting the lid off is moderately harrowing; however, the upshot is you get continuous grain from the base to the lid and that makes woodworkers happy.

After the lid was free there was another hour or two pairing down high spots and squaring everything up with a sharp chisel. Then another hour or two hand sanding everything smooth from 100-220.

The little jagged tabs that align the lid and let it stay snugly in place were made by snapping some offcuts off with a pair of pliers and then artfully sanding them down. It’s a fun look and gives the design some teeth. It’s very satisfying to pop the lid on and off. And you can fit the box in the upturned lid as well. An unintended affordance, but delightful!

A Dad Goal of mine is that my kids grow up with little handmade curiosities like this littered about the house. My daughter smiled when I gave it to her and said “I’m going to put it in my room!”

A pile of knives

Our previous methodology of storing our knives was a pile in one of the drawers. In a nod to safety we had a scrap piece of wood in there as a divider to keep them separate from the non-pointy kitchen utensils.
It wasn’t the worst system. It wasn’t the best either. So I made a better one:

This took a few hours a few weeks ago and has made our knives a lot safer and easier to use. Grabbing one now doesn’t feel quite as fraught! I should have made it years ago.

Design Notes

  • The slots for the blades were made with kerf cuts on the table saw. I tried a few different manual saws because I aspire to being one of those philosophical back-to-basics handtool woodworkers. Turned out that the table saw blade was already the right width so I was able to save myself a lot of trouble.
  • Our drawer space is at a premium so having two rows of knives on the right lets save some space, while still making everything accessible.
  • This is highly customized to our random collection of knives. I designed it mostly by measuring the longest knives in each category (short ones in the front on the right, medium in the back on the right, long in their own compartment on the left) and then just going for it. Winging it is fun, but it did result in a lot of back and forth of test fitting.
  • The rows are slightly offset so that handles aren’t covering blades. I mean, of course they are, however, this wasn’t clear to me until I started to lay it out.
  • It’s a friction fit. We can easily remove it if we decide we want something else later on.
  • Made out of scrap pine and sealed with paste wax. I lightly rounded over all the edges with 120 grit sandpaper.

Front Garden

We had A2 Garden Guides design and landscape our front yard and it looks SO much better! Super happy with it:

And here’s the map they drew for us of what is what. This is really useful because our kiddo keeps asking us the names of things:

Descriptions

Azalea

Varieties ‘Hino Crimson’, ‘Boursault’, ‘Gaiety’.

Azalea

PJM Elite’

Azalea

Mt St. Helen’

Hydrangea

Hydrangea are shrubs grown for the large globes of flowers in the summer that dry and give winter interest. Varieties ‘Annabelle’ and variety unknown.

Gooseberry

Variety ‘Jeanne”

Hosta

We rounded out your hosta collection with a few more.

Heuchera

Shade plant with striking foliage.

Astilbe

Shade plant with feathery leaves and flowers.

Bleeding Heart

Late spring bloomer of pink and white heart-shaped flowers in a line on tendrils.

Arborvitae

Variety ‘Globe.’ Evergreen with soft flat fronds.

Viburnum

Viburnum mariesii is a shrub with white puffs of flowers.

Serviceberry

Amalanchier (common name Serviceberry) is a native shrub that produces white flowers in spring and edible red/black berries in June.

Hydrangea

Oakleaf Hydrangea ‘Peewee’ are shrubs grown for the large globes of flowers in the summer that dry and give winter interest.

Microbiota

Low growing evergreen provides winter interest.

Solomon Seal

Shade plant with white bell flowers.

Sedge

Carex pensylvanica is native to Michigan.

Strawberry flat

These are strawberries cultivated for eating, so make sure they stay well mulched to prevent rotten fruit. They will spread over the whole area.

Mulch (Hardwood)

Hardwood mulch is medium to dark brown, and will fade to a lighter brown after about a year. Thick applications will last 2 years.

Holly-tone (50lb)

Organic, natural fertilizer for acid-loving plants.

Plant-tone (50lb)

Organic, natural fertilizer to “ensure superior plant growth.”

Currant

Ribes americana is a native shrub with edible black berries.

Salzbaby.live Updater

Years ago when my daughter was born I put together a website/app thingy to help us keep people updated on the progress of her coming into the world. The idea was that it was a single page site that would display a single message at any one time. If you were curious how it was going, you could check the site and not bother us.

I wrote a quick iOS app to help me update it from the hospital. Lots of people liked it and followed along for the entire 40 hours or so it took for my daughter to enter the world. It cut way down on the number of “what’s happening?!” texts we got, although we still got a bunch wondering if the site was broken since it was taking so long.

I consider this an example of an app that is a, in Robin Sloan’s words, a “home-cooked meal”. An app that doesn’t need to be spun off into a SaaS or be open-sourced, or grow an audience. It’s just for the people it is for.

We knew for our son we wanted to do this again. And, because nothing can be easy, it turned out I needed to rewrite the app. Who knew that Swift would change in the intervening years?!

Components

iOS App

After being frustrated that the code I’d hacked together 5 years ago didn’t magically work with no bugs I ended up starting over from scratch using SwiftUI. Swift is better than it was 5 years ago, but still a frustrating language to jump into to “get something done real quick”. The documentation is bad.

Anyway, here’s the code for the view:

@State private var message: String = ""

var body: some View {
    VStack {
        Form {
            Text("Salzbaby.live Updater")
            TextField("Enter Update", text: $message)
                .frame(height: 100.0)
                .textFieldStyle(RoundedBorderTextFieldStyle()
            )
            Button(action: {
                self.POSTfunction(message: self.message)
            }) {
                Text("Submit")
                    .multilineTextAlignment(.center)
            }
        }
    }
}

And that ends up looking like this in the app:

Type in the box, tap “submit” and it fires off a POST request to a file on the server. The passcode is a hardcoded string that I have replaced below so you don’t “hack” me. The server checks for it over on its end.

Here’s the main function for the post request:

func POSTfunction(message: String) { 
        //Create dict and then convert to JSON
        var dict = Dictionary<String, String>()
        dict["passcode"] = "lolno"
        dict["message"] = message
        let data = try! JSONSerialization.data(withJSONObject: dict, options: []) 
        
        // https://stackoverflow.com/questions/32201926/post-json-request-in-swift
        HTTPPostJSON(url: "https://salzbaby.live/SECRETPHPFILE.php", data: data) { (err, result) in
            if(err != nil) {
                print(err!.localizedDescription)
                return
            }
            print(result ?? "")
        }
    }

The app is then sideloaded onto the devices I physically plug into my computer. This does not scale, but it does not need to.

Server

Aside from general NGINX and SSL setup, over on the server I have a PHP file with one job to process the POST request:

<?php
	# Get JSON as a string
	$json_str = file_get_contents('php://input');

	# Get as an object
	$json_obj = json_decode($json_str);

	if($json_obj->passcode == "lolno") {
		$fn = "SECRETTEXTFILE.txt"; 
		$file = fopen($fn, "w+"); 
		$size = filesize($fn); 

		fwrite($file, $json_obj->message); 

		fclose($file); 
	}
?>

PHP’s motto should be: “your server is already running it so why not abuse it?”

Shouldn’t this be saving to a database instead of a txt file? Yes. Absolutely.

Web Site

The site is a bespoke templating library that does server side rendering and delivers an HTML file to your browser that displays the text in the txt file in the middle of your screen:

<!DOCTYPE  HTML>
<html>
	<head>
		<title>Is the Salz Baby Here Yet?</title>
		<style>
			body {
				height:100%;
			}
			#answer {
				text-align:center;
				font-size:4em;
				position: fixed;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
				-webkit-transform: translate(-50%, -50%);
			}

		</style>
	</head>
	<body>
		<!-- 
			Hi there, nerds! Here's what you're after:

			The text of the page update is being read from a plaintext file. I have a bespoke iOS app on my phone and am sending a POST request to the server to overwrite the file whenever I make a request. It's simple, it works, and, there's no history by design.

			I'll show you the code sometime! Just not now!
		//-->
		<script type="text/javascript">
		</script>


		<div id="answer">
			<?php
				$fn = "answer.txt"; 
				$file = fopen($fn, "r"); 

				$contents = fread($file, filesize($fn)); 

				fclose($file); 

				print $contents;
			?>
		</div>

	</body>
</html>

This file was more or less the same as it was before just with a more direct comment to the many nerds in my social network. This is me making good on the promise to show you how it all worked.

Conclusion

Programmers overcomplicate everything all the time. The hardest part of this for me was limiting the feature set to only the basics. Since this is never going to be used by anyone else I could afford to cut every corner there is. Heck, there’s no notification on whether or not the update went through. You go to the site to see it there. That’s extremely poor UX!

However, despite the length of the list of feature requests requests…it did its job admirably. Folks from all of our disparate social circles got to check in on us when they were thinking of us and get a glimpse into what was going on. And as people woke up on the 27th and saw the update we started to get trickled in congratulations from all over. The Workantile slack even started a thread to notify people whenever there was an update, which was heartwarming to watch.

I’m glad we did this and the site will show this very important message until the registration on the domain name lapses in about a year:

UPDATE

A friend emailed me after the birth to say that he’d asked the Internet Archive to archive the site when it updated. He said “When he’s older and you explain to him how you set up a website, tell him another nerd archived it.”

This was such a gift and I’m so thankful for my friend who did this:


http://web.archive.org/web/20200526145350/https://salzbaby.live/

http://web.archive.org/web/20200526182423/https://salzbaby.live/

http://web.archive.org/web/20200526193713/https://salzbaby.live/

http://web.archive.org/web/20200527033742/https://salzbaby.live/

http://web.archive.org/web/20200527120404/https://salzbaby.live/

Caspian Orion Salzman

Our son was born on May 27th 2020 at 7:17am. He was 21.25” long and 8lbs 12oz.

I told him this when he was born. Perhaps this is too much to lay at the feet of a baby, born into a country on fire, but I think he can do it:

Promise you’ll be kind.
Promise you’ll be good.
Promise to fight for justice.

He is named after Caspian from the Chronicles of Narnia, although I’m learning to like the Phish song as well. Orion is after the constellation. It’s vast and encompasses many stories. Later he can decide which one he likes best.

2×4 Bench, Rustic Strength

Finally finished this bench I’d been slowly working on. This was the second attempt at a similar design. Both found homes with friends. The first one will live near a firepit and this one will end up inside as a bench near an entrance. Final size is about 33″ wide by 16″ tall.

The wood came from scrap 2x4s and the box joint configuration created a surprisingly strong bench!

Started by milling the 2x4s on the thickness planer and table saw to get square edges and flat faces. None of them were acceptable without this step for the finish quality I was going for.

After milling, I cut the top and sides to slightly longer than needed. Then I attacked worst part of this project: the glue up. I didn’t want to have any screws or nails involved so gluing involved a lot of clamps and annoyances. Once it dried I evened out the legs and top ends with a circular saw, chiseled and hand planed everything reasonably flat and then sanded (a lot). Finished with a few coats of clear shellac.

I’d been wanting to try this technique for a while. After trying it? It’s neat, but oh-so-fiddly to get right. What I learned is that I never want to use 2x4s for “fine” furniture again if it can be avoided.

Cutting Boards, Racing Stripes Edition

Made two cutting boards yesterday! I have the week off from work and so naturally spent a few hours in the shop. One is spoken for, but another is still available as of yet ($40). Edit: Both are sold! Talk to me if you want one though since I’ll do another batch later this month!

Dimensions are around 9″x12″ with rounded edges. Pattern is: red oak, oak, walnut, red oak. The walnut came from a friend who had it in his basement and the rest is from Urbanwood. Finished with Howards Butcher Block Conditioner.

A Cutting Board, A Cut

A Cutting Board

Finished this cutting board yesterday. Made from oak and walnut. I love the grain on this, it’s wild and varied and unexpected. Measures about 8″x12″ with rounded corners and two usable sides.

The knot at the top is filled in with clear epoxy, which worked well and is a nice detail. I’m curious to see how it will wear over time.

Finish is a beeswax+mineral oil blend from Howard called Butcher Block Conditioner. Wood is from Urbanwood.

If you like the look of the above and would like one of your own, I’m open for commissions. Contact me and we can figure out a price and delivery date!

A Cut

About halfway through making this I did something very dumb and ended up with four stitches in the side of my index finger. I’ll spare you the details, but will tell you the lesson I learned:

Your hand is not a clamp. Never use it as one, even if it seems convenient.

It was nice to confirm that my chisel sharpening technique is good. The wonderful person who stitched me up said it was a clean cut. Something I do after I hurt myself is google for similar injuries. It’s comforting knowing you’re not alone and a great relief when you don’t pull up any obits.

Due to the circumstances, I’m going to keep this cutting board because you should always keep your enemies close.

Charcuterie Board

For Thanksgiving we volunteered to bring a charcuterie board. Naturally that meant I needed to make the actual board itself in addition to us bringing the things that went on it.

Here’s the front and back of the finished board. Determining which is the front and which is the back is left as an exercise to the reader:

I made this out of walnut and red oak. The contrast in color and grain texture between the two woods ended up looking really nice. Here it is just after glue up:

After the glue was dry I planed it down. Cut the ends to length and rounded over the edges. Sanded up to about 220, raised the grain with water, then sanded again.

Finished it with Howard Butcher Block Conditioner (essentially just a mixture of mineral oil and beeswax).

My wife put it all together on Thanksgiving. Here’s the board loaded up with meat, cheeses, olives, and fruit. The bowl on the right is filled with cranberries and lactaid pills: