Twice Reclaimed Ash Box

A while back, a friend had an ash tree from their yard milled into floorboards. Those then those sat in storage until they moved and he donated the lot of them to me. As a thank you gift I made this small box for him:

I tried to keep details from the floorboards intact. The pull on the lid is part of the tongue from the boards and the lip on the box is from the groove. The bottom I planed down thin enough to show a bit of the separation between the boards (I swear it was intentional!)

I’m particularly proud of the tight miters on this one and the fact that the lid will fit no matter the rotation.

Materials: twice reclaimed ash

Finish: two coats of shellac and a coat of paste wax.

Happy Holidays!

In lieu of physical cards this year I spent way too long putting together a digital version that has a few jokes that made us laugh:

2020 Salzman Holiday Card

I really do want you to have a happy last few weeks of the year. If you celebrate Christmas, Merry Christmas! And here’s to a happy new year 🙂

Nerd stuff

There’s a github repo if you really want to delve into it. There’s not a lot there that you can’t envision from what you’re seeing on the site. It’s not meant to be open sourced, it’s not meant to be more than what it is. Robin Sloan’s idea of apps being home cooked meals applies here. I honestly wouldn’t have put it on github normally. Github pages required it though.

The highlights are:

  • React. I don’t really need React for this. It’s overkill; however, it’s what I use at work so I reached for it. In the future I’ll probably use Preact.
  • Tailwind for styling. Again, we’re using this at work and I’m a huge fan. Once you get used to the syntax it’s fast to use and powerful.
  • Using github pages to handle serving the file. This is the first time I’ve used that and was surprised at how easy it was to get going.
  • The “Too Cool” shades is just a png the same size as the jpg family photo. It’s such a simple trick. When I was looking around for ways to approach this I ran across this method and was amused at how simple of an idea it is and how well it works.
  • Depending on your combination of buttons the fonts change and that delights me to no end. No one else will notice this. Sometimes you do things for you though.

Issues with the Microsoft Sculpt on USB-C MacBook Pros

Feel free to skip this if you do not want to hear about a very specific hardware issue I am having. I’m writing this so I have a reference document to point back to and share!

Updates

Update February 3rd: calling this fixed! I bought an individual Anker USB-C to USB-A dongle just to try one last thing before fully giving up and it’s been rock solid for a week straight. Here’s how it shows up in the System Report:

I have no idea why this connection would work better than using the USB-A port on Apple’s official Multiport adapter, but that’s just how bad USB-C is as a “one port to rule them all” solution. Leaving this page up as a reference for anyone else who has this issue!

Update Dec. 10: Thought the powered USB hub had done the trick, but had a drop this morning. It did last a lot longer between drops than before. Back to the drawing board.

UPDATE Dec. 9: cautiously optimistic that I’ve found a fix! Chris Dzombak mentioned trying a powered USB hub. I found an Anker hub with a wall wart power supply in the closet and have been using the keyboard/mouse for 24 hours without any drops.

The Problem

A few years back after having some bad back pain I picked up a Microsoft Sculpt keyboard and mouse. It’s been such a lifesaver in terms of limiting pain. The only downside is that it uses a proprietary USB-A receiver that is linked to the keyboard and mouse it came with. Lose the receiver and you have bricked your keyboard and mouse. To use it on a USB-C equipped mac it needs to go through hub or a dongle to connect to the computer.

Normally this isn’t an issue, however, with this setup about once or twice a day the mouse and keyboard completely stops working. To fix it I need to unplug whatever hub the receiver is on and move it to another USB-C port. It’ll then merrily work again fora few hours until it happens again.

Oddities

  • In the “System Report” the receiver shows up as connected, but it just no longer accepts inputs.
  • Unplugging the receiver from the hub and plugging it back in does nothing. The whole setup needs to move to another port.
  • Any other USB 2.0 devices over USB-A that are plugged into that port via the hub also seem to freeze. My webcam, for example.
  • I have a backup setup and the same behavior happens with that one too. I’ve tried the official Apple multport adapter as well as a 3rd party option and it happens on both of them.
  • This all works on my iMac using its USB-A ports

But, the weirdest thing about this is that I leave the mouse turned off the keyboard will happily work fine with no issues.

I’ve contemplated just buying a good mouse and ditching the included mouse, but I would much rather just use this.

How can one even diagnose what’s going on?

I have no idea what to do from here. I’m open to trying literally anything if you think it might help.

Is there something I can check in console.app to see what is happening with USB devices? Is there an app out there that can help this?

Has anyone else run into this before? If so, please email me or reach out in another way!

mA Draw?

Yesterday I began to think that maybe it’s being caused by some sort of power draw spike? Like the mouse is requesting something from the receiver and it’s spiking the mA request through the hub and MacOS just cuts it off?

Would it be worth using a powered USB-C hub? Does that exist?

What about alternative setups?

I’ve looked for a similar style keyboard/mouse to replace this with, but no one seems to make one that is tenkeyless, which for my style of upper back pain is crucial. If someone knows of one though, please let me know!

Sounds Good To Me! – A Halloween One Shot.

On Halloween I ran a game in which the players played as characters from a not-real-but-plausible 90s sitcom called Sounds Good To Me!. The show was all about the Good family who lived in the Detroit area. The game would be them playing the special Halloween episode from Season 2.

As a way to gauge interest I put together a title card for the show:

Needless to say, a number of people quickly expressed interest in playing out their TGIF dreams. I ended up running two sessions of this: one socially distanced around a campfire on a chilly fall evening, and another on Zoom.

The game part

It was important to me that the rules were as light as possible. I ended up adapting the one-page RPG, Lasers and Feelings, and calling it, Wisdom and Wisecracks. You can see the rules for Wisdom and Wisecracks on google docs. There’s a section for Character Creation and then a section of the Mechanics. It took some tweaking, but I was happy to keep it on one page with a second page to act as a rudimentary character sheet.

Character Creation

Character creation was the heart of this game. The idea was to lean into the genre tropes of 90s sitcoms (and, goodness, there are genre tropes in that age of television) and make a character that would be at home in any of those shows.

Each player built their character at the start of the game by deciding on their:

  • Name – they were all part of the Good family OR closely connected to the Good Family .
  • Archetype – are you a nerd, a jock, bad boy, etc. What kind of ridiculous stereotype are you going to play?
  • Family Role – caretaker/parent, comic relief, responsible child, etc. how do you fit into the family?
  • Flaw – what’s the thing that you’re always doing wrong? Simmering rage, troublemaker, always putting your foot in your mouth?
  • Catchphrase – what’s your catchphrase!

And lastly, because of Halloween, they had to pick a costume!

Throughout each session we asked additional questions about the Good family and learned more about everyone’s backstories. For me my favorite part of the game was seeing these characters come alive. It was interesting to see that both groups ended up with a crotchety grandpa figure as well as a kooky aunt/neighborly figure. The families were distinct yet still familiar.

Mechanics

One shots need to move quickly since you only have one night. I wanted the focus of the evening to mostly be on inventing the Good family; however, it was still important to have some game mechanics that could guide success or failure in their plans. After all, failure in storytelling games is almost always more interesting than success.

The core idea in Lasers and Feelings-like games is that when faced with a questionable action/decision in the game you roll a d6 (or more than 1d6 if things are going well for you) against a target number that you’ve chosen at the beginning of the game. If you’re rolling for something that is Wisecracks (ie flirting, trying to joke your way past a situation, or any other rash decision) you want to roll OVER your number. If you’re using Wisdom (ie deduction, asking an NPC for help, or basically anything rational) you want to roll UNDER your number.

  • Failure on all of your dice results in a consequence/complication
  • 1 success means you do it, but there’s a minor consequence/complication.
  • 2 successes you do it.
  • 3 successes you do it very well and something extra happens.

If you manage to roll your number exactly it’s Wise Wisecracks! You do it, get something extra, say your one liner and get to ask the GM a question.

And that’s about it for rules! There’s no real turn order or hit points or anything like that. It’s up to the GM to make sure that everyone is given the chance to tell their side of the story, but it’s very free flowing from there. This seems like it would be total chaos. It is somewhat, but it also works. If you’re used to play highly structured games like D&D I’d recommend you give a “rules light” game a try sometime.

In both games I found it to be surprisingly difficult for myself and the players to remember if they were trying to roll above or below their number. It’s an elegant piece of game design that also breaks people’s brains. Every roll the players had to ask if they were going above or below and nearly every roll I had to look it up myself. The next time I use this system I’m just going to give them two numbers that they are always trying to roll over.

We also didn’t do the “ask a question” part of Wise Wisecracks. It didn’t seem as necessary for the style of story we were telling.

Letter from the assistant producer

Before the game I sent out a letter from an assistant producer on the show along with a Doodle link for scheduling the game. I’d like to think that this helped set the tone of the game. Even if that was all in my head it was fun to write:

First: good job on the start of the season!

Whatever you’re doing is working, our ratings are up–way up!–and the network is finally willing to treat this little show of ours right. About time.

As part of the marketing efforts they’ve approved the budget for a few “fun” episodes. The eggheads in the writer’s room got wind of that and within minutes had concocted a ridiculous scheme for an on-location Halloween episode. I haven’t read the script, but they told me there’s a corn maze or some hokey midwestern nonsense like that. Anyway, it’ll be “spooky” and “really get the watercooler chatter going”. As long as it gets people watching and the farm doesn’t cost an arm and a leg to rent the place I do not care.

Shoot is planned to start around sundown. Have your drivers get you there by 6:30. We should be wrapped by 9:30 assuming you remember your lines.

Please remember your lines, corn freaks me out.

Ciao,
Chris Salzman
Assistant Producer, Sounds Good To Me!

Running the game

Both groups were a hoot! The first group was comprised of tabletop RPG veterans. The second group was mostly people new to gaming in this style. I went into some detail about the differences between these groups on my podcast. Check out Roll For Topic Episode 49 if you want to hear some free flowing thoughts about it.

The core idea of the game was that the Good family was going to a corn maze for the evening. I had some notes about the outline of the episode, but mostly we were all building the story together based on player actions and occasional dice rolls. Mostly I wanted to hit all the good points in a 90s sitcom: some minor peril, lessons learned about themselves, and wrapping up by dancing. For the real true fans you can read my unedited notes.

Both groups started by driving up to the parking lot of the maze, had at least one character immediately wander off to somewhere other than the line to get in, and took a circuitous route to get into the maze. In one of the groups the character who wandered off never actually made it into the maze at all! They ended up having a little B plot in an entirely different location that kept me on my toes.

Once they were in the maze all sorts of spoopy events happened including splitting the party even further and they reacted admirably. After navigating the maze they ended up at a big party in a barn with the Monster Mash playing.

Conclusion

Multiple players dressed up! One player sang a theme song! There was a lot of laughter!

A campfire on a cold night and Zoom are not ideal gaming conditions. Fighting either the wind or technology was distracting, but it was good to play regardless! I liked the system well enough to try it again in a non-Halloween context, although I don’t think I like the genre enough to, say, play an entire season. For “special event” settings like a holiday it was fun!

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: