Success metrics

Arguably the single most important part of any project that everyone skips is defining what makes a project successful.

The Traps to Avoid

Doing so focuses the project and, more importantly, will help you ignore three big traps:

  • Taking on other people’s definitions of success.
  • Never finishing.
  • Grabbing onto tantalizing data that don’t actually support your goals.

Other People’s Ideas of Success

Often–always, actually-–when working on a project people will offer opinions and ideas on what you should do with it. This is human nature and is a lovely thing. If you’re not sure in what you want though, well, it’s easy to take on their thoughts as your own. Feedback is good, taking it all in means that you’re not secure in why you’re doing what you’re doing.

A lot of what people will suggest means success is going to have to do with capitalism. Always remember that you are not required to monetize your joy.

Never Finishing

Finishing anything is hard. It’s so hard.

The last 10% of even the best scoped projects is always 1000% of the work. Nothing will kill your momentum during that difficult phase more than not knowing what you’re actually shooting for.

You get lost, flail about for a bit, and put it down forever. It’ll make you feel guilty for a long time too whenever you think about it.

Tantalizing Data

Social Media figured out years ago that people like having numbers attached to their posts. Engagement metrics are, frankly, super fun because it’s a nice dopamine hit to see strangers interact with your posts! My guess is that with any interrogation though you’ll find that your reasons for posting are not to see analytics numbers tick up.

You’re probably, at a minimum, more interested in a specific audience liking and retweeting your work. Or, the actual reason you’re posting on social media might be to sell your project, generate commissions, share it with a group, keep a diary for yourself, OR any number of totally valid reasons to use social media.

A large number of favs, shares, and/or retweets is rarely going to be your project’s actual goal. If it is, you can go and buy those likes and retweets from many numerous shady websites with a minimum amount of fuss.

A Personal Example

To personalize this: the primary goal of the posts on this blog are to help me organize my thoughts and to reference them later on. A secondary goal is to share posts with my social circles. A tertiary goal is for random folks on the internet to find the posts when they’re looking for specific information.

This post was written as a reminder to myself to avoid mistakes I’ve made in the past. I’ve walked directly into all of the three traps above and will likely continue to do so. If anyone else reads this post hopefully they’ll be able to use it as ammunition against me the next time I dive in headfirst into a project without a goal.

If my primary goal was to achieve some sort of Elite Blogger Status I’d have to do things a lot differently. Probably there would be no cryptic posts about goal setting! Not going after that particular goal frees me up do what I actually want with this little corner of the internet and not obsess too much over analytics numbers.

Tiny candle holders

This past week at the farmer’s market Cobblestone Farm was teaching kids traditional candle making. My daughter happily jumped in line and made two candles. Today I put together a few candle holders out of scrap wood in the shop:

Walnut and Cherry from Urbanwood.

Pizza Taxonomy, Ann Arbor Edition

A question was asked in Workantile’s recommendation channel that resulted in slack telling notifying us that several people are typing:

What’s your favorite Ann Arbor pizza?

I was one of them because, dear reader, I have pizza opinions.

Pizza Contains Multitudes

There is no one Pizza. Instead, we have many many subclasses of food that look similar, yet are quite different, and can all be broadly defined (and recognized!) as pizza.

If you ask a child to draw a pizza they will draw you a shape that more or less looks like what the Teenage Mutant Ninja Turtles eat. Something that is circular, cheesy, and maybe some pepperoni on top. The child’s drawing won’t be able to capture a lot of, what I’d argue, are essential properties of the pizza though: speed of delivery to your mouth, toppings, crust, thickness, greasiness, price, etc.

No artist could, really, pizza is complicated and comes in many forms! And, because of it, pizza places cannot excel at all kinds of pizza. They will naturally do one (maybe two!) kinds of pizza well. Expecting them to do everything outlined below would result in them doing nothing correctly. Recognition that the rubric for “good pizza” is vast and circumstantial has the effect of reducing the stress of picking a pizza place. Rather than having only one favorite pizza place you can expand your palette and have many favorite places each tailored to what you are actually craving.

The Taxonomy of Pizza Places

Since we agree that pizza places suit different needs you can first choose the kind of pizza you are craving and then pick your place from there.

I contend that the categories below are more or less comprehensive of restaurant pizza options (we’re not getting into making your own or frozen). I’ve provided my favorite places in Ann Arbor for each category with the understanding that there will be quibbles. That is fine by me. You are always welcome to submit your own blog post to the internet:

Pizza! Now!

Hot and Ready from Little Caesar’s. You may optionally hate yourself later, but you will at least be full.

Greasy/Cheap/Delivered

Domino’s. It’s “local” and defines this category. Maybe Cottage Inn if you want exotic ingredients like “chicken”. I’m told that Marco’s Pizza is also good in this category.

“Fast” Casual

Blaze pizza. Although “fast” in this sense is highly dependent on how busy it is. Blaze is a nightmare if you are hungry because you feel like you’re very close to getting your pizza, but any line whatsoever is going to make it feel like an eternity. That said you get a ton of choices and can piece together a pretty good pizza. Neopapalis is another option here, although I haven’t been in years.

Not Your Daddy’s Pizza

Bigalora or Mani. If you crave interesting ingredients like brussel sprouts OR potatoes go to these places. Mani is loud though.

Sit Down and Wait a While

Anthony’s. Pizza House has a better ambiance. Anthony’s has much better pizza.

Regional Styles

Was told after publishing that I should really include a section on a few specific regional styles:

Chicago (read: Deep Dish)

Anthony’s. Although maybe just wait until the next time you’re in Chicago.

Detroit

I’m least familiar with this but am told that Buddy’s and/or Jet’s are where to go. As someone who grew up in Chicagoland Detroit style is scary and different.

New York

New York Pizza Depot. I’m unaware of any runner-ups here. Again, probably best to just wait until you’re in NY.

Notes

Thanks to Workantile for helping me take this from that thing I rant about from time to time to a written blog post I can now link to whenever someone mentions pizza.

Referencing directories in WordPress themes

I needed to enqueue a handful of scripts and stylesheets in a WordPress theme and ran into much confusion between which functions to use to return what paths from the parent theme vs. the child theme. To save myself later here is the breakdown of when to use what. Basic gist is that “stylesheet” will get the child theme. “template” will get the parent.

If you don’t have a child theme any of these will get the current theme.

Absolute Path

These functions get the absolute path on the server’s file system. Mostly useful for referencing other PHP files within your theme’s PHP files:

get_stylesheet_directory() – absolute path to the current theme. If you’re using a child theme it’ll get it. Documentation.

get_template_directory() – absolute path to the parent theme. Even if you’re using a child theme it’ll get the parent. Documentation.

Directory

These functions get the public URI for the theme directory. Useful when you’re trying to publicly display something on the site through your theme files:

get_stylesheet_directory_uri() – returns a properly formatted URI for the current theme. Use if you have a child theme that you want to return. Documentation.

get_template_directory_uri() – returns a properly formatted URI for the parent theme. Even if you’re using a child theme it’ll get the parent theme. Documentation.

Playing The Quiet Year in One (1) Hour

You should play The Quiet Year! If, at all possible though, you should not play The Quiet Year in only 1 hour.

I was running this as part of an event and only had one hour so the constraints forced my hand somewhat.

Here’s how I approached it:

  • Each turn encompassed 3 weeks instead of 1. This is where the game suffers the most because projects start less frequently and end more quickly.
  • Cut down each season drastically. 3 cards for Spring, 4 for Summer (make sure to remove the King of Diamonds), 4 for Autumn, and 4 plus the King of Spades for Winter. Put the King of Spades at the bottom of the deck. Draw all but the King of Spades randomly.
  • Keep an eye on the time. If it’s looking like you’ll go long you should remove one of the cards from winter.
  • Your goal is actually to hit around 55 minutes for the game so you have 5 minutes to decompress and make up an epilogue. This is extremely important because everyone will have questions.

A few other items of note. I started the setup for the game by telling folks that the following:

I do not know if this game is fun. It is fascinating though. Keep in mind that we are collectively role playing a community and as such you will sometimes be frustrated with the direction things are taking. There is no win or lose state either, we see what happens and then the Frost Shepherds come.

Saying that the game might not be fun has a weird effect of making the game quite a bit more fun since everyone can just relax and see what happens.

Thanks to Sam and Brendan for helping out with a playtest of this compressed version of the game!

From Hugo to WordPress

There are a million and one blog posts for “move from WordPress to Hugo!” out there. This is the opposite of that.

Hugo is good

I like Hugo a lot. If you need a static site generator I’d recommend it without reservation! Once I had it going it worked very well. I loved how fast Hugo could build the entire site and it required almost no server resources. Turns out, you don’t need that much raw computing power to serving static files to a handful of folks every day.

Posting though

But…posting was far more complex than I wanted it to be. In the end I was syncing a folder via dropbox, committing my code to a repo, pushing it to a repo on the server. From there a git hook would run to build the site and then move the files to a folder. Extremely cool and extremely obtuse. If I had just one computer it wouldn’t have been that big of a deal to continue on; however, because I’m a glutton for complication, I bounce between 5 different devices (3 macs, 2 iOS devices) within the course of a week.

Having a web interface to log into matches my mental model of “I am writing and publishing” much better. I also dearly appreciate having drag and drop image support as well as WYSIWYG formatting options. Hugo’s support for non-text media is lacking. That’s totally okay! But, I was finding that I was avoiding publishing certain kinds of posts because I was lacking easy tools to do so.

WordPress and Gutenberg

What finally pushed me to make this change was a recent experience building a new website for Workantile. During that redesign we relied on the Gutenberg editor for formatting our pages. I was impressed! You can create fairly complex pages quickly with blocks in a way that just wasn’t easily doable a few years ago without diving deep into theme files. We’re in a bit of a rough transition point going from the classic editor to Gutenberg (and more importantly the concept of Blocks). It’s getting better all the time though!

Problems

The move went pretty well for the most part. Some technical issues I ran into:

RSS Importer

The RSS importer that is built into wordpress needs some serious attention. The biggest issue is that it fails because it’s calling a deprecated PHP function. The fix for this for me was to comment out the offending line. This StackOverflow post was helpful:

php – Call to undefined function set_magic_quotes_runtime() – Stack Overflow

I just found line 72 in the importer and commented it out. I wouldn’t rely on this edit for an import where you didn’t control all of the content, or as an importer you run more than once. It’s a brittle fix to say the least. Here’s the error and stack trace:

An error of type E_ERROR was caused in line 72 of the file /var/www/beta.chrissalzman.com/wp-content/plugins/rss-importer/rss-importer.php. Error message: Uncaught Error: Call to undefined function set_magic_quotes_runtime() in /var/www/beta.chrissalzman.com/wp-content/plugins/rss-importer/rss-importer.php:72
Stack trace:
#0 /var/www/beta.chrissalzman.com/wp-content/plugins/rss-importer/rss-importer.php(178): RSS_Import->get_posts()
#1 /var/www/beta.chrissalzman.com/wp-content/plugins/rss-importer/rss-importer.php(204): RSS_Import->import()
#2 /var/www/beta.chrissalzman.com/wp-admin/admin.php(344): RSS_Import->dispatch()
#3 {main}
  thrown

Hugo’s RSS Implementation

And on the Hugo end of things: Hugo’s built-in RSS generator doesn’t include the full text of the posts. It also doesn’t include categories. I happen to be the sort of person who likes adding categories, so this was a problem! Here’s a gist of my RSS theme file that has the full text and categories:

Hugo RSS Implementation with Categories · GitHub

This looks for the categories set in the frontmatter of your markdown files. If there are none it skips it and nothing is added to the feed for that post.

RSS Redirect

I wanted to make sure anyone who subscribed to my old RSS feed continues to get the new one. To do so I set up a 301 redirect using this plugin:

Simple 301 Redirect

Keeping it around since it’s always nice to have this in a readily accessible place.

Images

Moving images over to the new site involved making sure they were uploaded appropriately to WordPress’ Media library. I toyed with the idea of doing one big import and going through and fixing individual images. Then I found this plugin that just did it for me. Installed it and then Edited all of my posts and resaved them. It ran through and copied everything over and updated the src tags for me:

Auto Upload Images – WordPress plugin | WordPress.org

Inserting images in Hugo was one of the reasons I wanted to get away from it so this was nice to have it just work. After I ran this I turned it off.

Conclusion

So far, so good. I’m happy with this and this post was fully written and edited in the WordPress editor. It’s nice to have “my website” compartmentalized to something I go to on the internet to edit, although I will miss how much posting a blog post made me look like I was attempting to hack the planet.

Kitchen Shelves

Our kitchen peninsula was in dire need of some organization. We also had a blank wall directly above it so…shelves!

All of the wood for this project came from Workantile’s storage room: pine slats from someone’s old ikea bed and shelves made from the Baltic birch plywood from an old phone booth project. The screws and edge banding from Home Depot.

I made the shelf supports out of pine based on a google image search for DIY shelf supports. The hardest part was figuring out the order in which to attach everything together to have room to screw things in. For the supports I had to attach the bottom of the angled support to the “L” and rotate it out of the way. Then mount the “L”, then rotate the angled support into place and screw it in that way. There are better ways to do this, but it went pretty quickly.

Finished with shellac and wax. I really like this finishing technique because it looks good and requires minimal drying time.

Installed with much mumbling and annoyance.

Remote Caddy

Made a little caddy for our remotes. The hope is this cuts down on the number of times we have to ask where the Roku remote went.

Mitered the edges and reinforced with splines for rigidity and class.

Pine reclaimed from the Workantile storage room and walnut from Urbanwood. Finished with shellac.

Try Square

Made a try square based on plans from Rex Kruger. Shockingly, it’s pretty and pretty square!

Walnut and cherry from Urbanwood. Aluminum rod for the pins from Home Depot, who looked at me like I was off my rocker for wanting brass rod. Epoxy to hold in the pins. Finished with shellac.