Like many people, between general interest and needing a pandemic-friendly hobby, I have gotten into mechanical keyboards. In browsing through endless photos of interesting builds, I discovered a really cool keycap set called GMK Dots by a really cool designer known as biip. Originally a joke, people loved them so much that they really got made. And I loved them! But as an idea, not the colors. Even now, with a round 2 coming including a light version, it’s just not for me. I also do not like Cherry profile keycaps, which is what GMK produces. The KAT Milkshake set, also by biip, had a Dots kit with amazing colors, but is no longer available and between commanding extremely high resale prices and not quite including the colors in the rows that I would prefer, it was not a reasonable option.
So, with copious credit to biip as the originator of the idea, I decided to make my own set using KAT Blanks, my current favorite profile, with pastel/vaporwave-ish colors to match my general aesthetic. KAT Blanks are made of PBT, which is compatible with dye sublimation (dye sub), a process in which things are heated up to the point where ink and surface fuse, creating a permanent print. With a number of retail dye sub products available, I decided this would be a fun DIY project.
Here’s the general concept:
Print dots using dye sub ink or cut them out of ink-saturated paper
Center them on clean PBT keycaps (not ABS!)
Tape them down securely
Heat them up to 400ºF for a length of time related to pressure
Let cool before peeling off tape/paper
Mount and enjoy
I personally have a Cricut cutter machine, and they make both dye sub markers and dye sub sheets, so in the interest of having clean circles, I decided to use the dye sub sheets. I am also currently on a full grid ortholinear keyboard so I only need to worry about 1U keycaps for the moment. Here’s the specific process I used, and then below I will get into a bunch of details / a build log.
Cut 6mm dots inside of 12mm squares on Infusible Ink paper
Cut the squares out and peel off excess material
Center the squares on the keycaps, add a little bit of heat conductive material to the center of the tops to level them out a bit, and then tape the whole thing down to maintain contact
Bake for 400ºF in a pre-heated, precise oven (Breville Smart Oven, no convection) for 4 minutes
Let cool before peeling everything off and mounting
Just kidding I’m not going to wax poetic on virality. But, I posted this timelapse to Twitter once upon a time and later set it to a truly annoying sound on TikTok because I was curious about the video editor and have almost 3 million views there, which just goes to show it’s all meaningless. Anyway, people seem to like it, and of course I like it, and I’ve gotten a few questions about specifics like how many eggs, so I finally took some pictures as I made one this morning (sans bacon and cheese) so I could post about it.
Oh, and one other thing, I want to give credit to my two inspirations. The first is my dad, who doesn’t really like sweet breakfasts, so we grew up eating savory egg bread as a special breakfast item instead of French toast. The other is this video of an Indian street food called a bread omelette (among other things, I think?) that also got a lot of attention. It seemed like a smart way to not make a mess with fully dipping the bread and being a born New Yorker, egg sandwiches are always a good thing to me. My “egg bread” gets its name from my childhood and does not involve anything particularly special, but of course you can adapt as you like. If I have flowering garlic chives around, I will use them. The only thing I will say is that I am not open to commentary on the cheese from the original video – a proper New Yorker bacon egg and cheese is made with cheese that is engineered to melt, end of story. 🙂
Gather your ingredients
This process goes pretty fast, so gather your necessary materials:
Two slices of bread
A nonstick or cast iron pan that closely fits them side by side
Neutral oil or butter (I personally do not like the taste of cooked butter with eggs, which is why I use oil)
A mixing bowl
Two eggs, or three if you’re hungry or your bread is large
Milk (also optional, for a little extra fluff)
Heat up the pan while you beat the eggs
Heat your pan up over medium to medium-high-ish heat. If you like your eggs creamier, use lower heat. I like mine fluffier and slightly browned, so I use higher heat. It’s all preference. Beat the eggs with about the same amount of salt you’d use for scrambled eggs and some pepper if you like until foamy across the top, then beat in some milk (or water, or chicken stock, or leave that out, whatever).
Add oil to your hot pan
Drizzle a bit of oil in the bottom of your pan and swirl it around. You are welcome to try making it with less oil, but here’s a tip from Chinese cooking: we use at least enough oil to coat the bottom of whatever pan we’re using to scramble eggs in and heat it up hot because it makes them fluffier. If you like creamy eggs, don’t do that. Again, it’s up to you to figure out how you like things. Anyway, let the oil heat up until it shimmers a bit.
Pour in the eggs and dip+flip the bread
This is the part that most frequently seems to be missed upon recreation, so here’s a regular speed GIF. Since I’m using a regular sandwich loaf that has defined sides and is wider than it is tall, I want the the bottom sides to be facing each other post-flip, so I start with the top side facing the middle for the dip. Hope that makes sense. If you use square bread, that’s much easier.
After I’ve dipped and flipped, I scrape any remaining egg out of the bowl to cover any remaining dry spots on the bread. You don’t have to, but you have to let the eggs cook for a moment anyway so you might as well not have any waste. Cook the eggs until they’re mostly set – you can move the edges in and swirl the egg around if you want.
Flip the whole thing
Next you want to get your spatula under the bread and flip the entire thing over. It might make a small mess if the egg is still super runny. Let the remaining egg set for a few seconds over the heat and then fold the edges of the egg in like so.
Fold and flip
Now you’ll want to fold it so that the slices are stacked like a sandwich. Remember in the beginning where I said I wanted the bottom sides to face each other? That’s why. They’re flat so the fold is easier to manage. Anyway, toast each side until it’s lightly golden brown. I also like to prop it up with the help of another utensil and toast each edge a bit, that’s up to you.
The most important part!! It doesn’t need to look pretty if it tastes good! I use a knife and fork but I guess you could pick it up with your hands if you really want.
Masterclasses are not unique to classical music, but they do form a central and critical component of music study. A masterclass is a format in which musicians perform a work for an established artist and the artist then gives them feedback rather like a lesson, except that all of this happens in front of an audience. You might also hear about “studio class” in music school settings, which are similar except that it is not an open audience but instead one made up of your peers who share the same primary professor. For big artists coming to a school or a region, you might have to audition (compete) for a spot to be criticized publicly on your performance. Put that way, it might not sound very appealing, but it is foundational in how to function and succeed as a musician and really in any profession, including as a part of a software team, which is what I do today.
Managing feedback in group settings
The first experience in managing professional feedback is typically how you receive it. Sometimes you might not immediately agree with what you’re being asked to do, and that’s okay. What’s important is to respect the time and effort of the person giving you the feedback and show them that you understand it, even if after synthesizing that information you decide it’s not the direction you want to go. In music, that means acknowledging what you’ve heard by demonstrating the requested change on the spot. This might be a specific request, like “play this section softer”, or something that requires more interpretation, like “don’t lose momentum by getting stuck before the high point of this phrase”. This kind of flexibility is itself a skill, and one that is of high value.
In software, your feedback sessions might not involve direct and immediate action in the same way, but it can be very helpful to show that you understand a concept. For instance, you might say “I hear you, and I need to think about it some more; I’ll start by trying out a different way of structuring this file”. Do be careful not to just repeat back verbatim all the time or come across as explaining back in a condescending way.
As you progress through your career, you will likely find yourself in the position of also giving feedback in a group setting. For many people who are just beginning this part of the journey, this can be quite intimidating because you have not previously had experience in doing this. You also may have had bad experiences in the past with feedback that was not delivered in a constructive way. This is where an early culture of group feedback comes in so handy, notably in the studio class setting: professors are asking your peers to also learn how to process, structure, and deliver feedback in real time. You hear from your professor every week; this is an opportunity for students to deliver a polished performance, receive feedback, and give feedback all at once.
That said, peer groups can also be intimidating. This is not unlike having to give a talk or demo some code in front of your coworkers – it can feel like more pressure than a large room of strangers because these are people whose opinions you are exposed to on a near-daily basis and hopefully care about. Remember that we are all learning all the time, and your peers may also need to work on their delivery! Some strategies you may have encountered are to use “yes, and” instead of “but”, or to begin feedback with related praise.
I highly recommend that teams actively solicit peer feedback at various stages throughout a project and also workshop methods of requesting and giving feedback, something that can be facilitated by an engineering manager. An EM might even want to structure some team meetings much like a studio class, where people present on something they’re working on so that not only do they have a chance to share about something they might not otherwise get to talk about, but the team also has a mechanism built-in for giving and receiving feedback. Soliciting feedback is also a skill in its own right – a culture of regular and expected feedback goes a long way toward building that in all levels of team members.
Another major difference between masterclasses and lessons is that you are expected to present a polished product at a masterclass, whereas lessons are to workshop that polish. In a masterclass setting, you and any collaborators enter the stage, bow, and perform to applause before proceeding with the feedback from the masterclass artist. Some professors, especially at the conservatory level, also require performance attire when performing in studio class (though perhaps not black tie).
Working on a software team typically does not involve building something in a vacuum until you’re ready to release it to the world – you hopefully have team checkpoints that are more equivalent to music lessons. But there is a lot to be said for knowing that even though you’re ready to share your work publicly and have met your deadline, there’s still more that can be done, rather like a software beta. And even for something you’ve been performing for a long time, a fresh perspective can change not only how you’re approaching that piece, but how you think about your craft in general. Always be prepared to show your best and recognize that true mastery is in knowing that there’s always another level to reach for.
While masterclasses are typically with an individual artist who specializes in an instrument, many works involve other musicians, such as a string quartet or a piano trio. These are things that are worth bringing to masterclasses too! Related, it’s also valuable to have lessons from people who might normally be considered outside of your discipline – one of the best lessons I’ve ever had was with a jazz professor who spent 2 hours pushing me to express myself more and more.
Not only do your collaborators need to be equally prepared, you need to work together to really achieve artistry. All too often you will see lower-level instrumental masterclasses where the pianist is an afterthought, plunking their way dutifully through concerto reductions, and it shows. Sometimes the masterclass artist will also dutifully ignore them, but more often they have to involve all collaborators in their feedback. No amount of telling a vocalist to evoke the dreamy sparkling of Debussy’s Nuit d’Etoiles is going to work if the pianist is heavy-handed on those rolled chords, or vice versa. (This is also why collaborative pianists have to study lyric diction and multiple languages and can specialize in vocal coaching, but I digress.)
Not only does feedback need to be inclusive of a group while also targeted to each individual, it needs to be clearly contextualized. In music, that means including music history and theory as well – the performance practices of the era, specific notational quirks of the composer, what harmonies are and how do they drive the piece, and limitations of instruments and how they interact together. So when giving feedback to a software team, be sure to continually frame things within broader feature or product goals, and tie the various disciplines together to create that cohesive whole.
In both giving and receiving that style of feedback, you will find that you need to have some amount of understanding of disciplines outside of your own. That doesn’t mean that you need to be an expert; in fact, you will probably be received poorly if you try to instruct somebody on how specifically to accomplish something you don’t normally work on. Instead, much like framing within broader goals, think about how you might inspire somebody to look at something a different way, or contextualize within your own discipline so that they can understand you better as well.
Bonus: watch a masterclass!
Here’s a 45 minute masterclass session with Benjamin Zander, the music director/conductor of the Boston Philharmonic Orchestra and the Boston Philharmonic Youth Orchestra, and Amanda Chi, the cello section lead of the youth orchestra. I promise you don’t need to be a musician to get something out of this – at one point, Maestro Zander acknowledges non-musicians in the audience and gives them a brief explanation of what he means by the direction and pull of harmonies. But even outside of that, you’ll see some real mastery of not only the musical material from both parties, but also how to address both audience and performer, contextualize the feedback, and deliver that feedback in a constructive and suggestive way rather than making it into a personal demand. I also really enjoy what he talks about at the end, differentiating between what you need to do as a performer of this solo piece versus what you need to do as the leader of your group.
I have tried probably every todo app under the sun and they all suffer from the same fatal flaw for me: the window/tab/app gets buried and I stop referring to it. Now, if I was rich with unlimited space, maybe I’d get a monitor just for a todo app. But, I’m not! And I also embrace the small child in me who still loooooooves stickers and an endless supply of gel pens.
My basic planner method is the same no matter what the actual paper product is:
A weekly overview of things I need to accomplish or focus on that week along with a summary of how I felt about last week and things I’m grateful for (I think this is corny and I am here to admit that it is a nice thing to do for mindfulness).
A section for each day where I write down the top 3 things I have to get done that day (or more realistically, really should get done) and any other todos that come up.
Somewhere to take notes.
Some additional nice things to have are: tracking various kids’ activities, food management, and keeping memories.
In the layout above, I’ve repurposed some sections to fit whatever I needed, and ended up using the 3-part box that typically would be last week summary/this week summary/gratitude for some notes on my sister’s wedding instead, but it’s a good overview of how I use things. On the left there are things that really about the week or some specific item of planning (trips, in this case) that isn’t really tied to a given day. I also like to use a quote/phrase sticker down at the bottom, and eventually added a photo of an actual spontaneous girls’ night in an empty area.
On the right there’s one box where you have a line per day, and I split that in half to put my workout schedule – currently following P90X 3 – and the main meal I need to plan each day. After that there’s one box for each day of the week, where I was pretty good about writing down my top 3, if not actually getting through them. It was my first week back at work after sabbatical, I’ll forgive myself. The Saturday box is covered by another photo I printed out of a special memory I wanted to keep of that day, which perfectly fits inside the box. I use an HP Sprocket I picked up for super cheap for little photo stickers and I’m pleased with it, full price is perhaps a little steep but it’s really fun to have, especially because I only have a black and white laser printer at home.
Each Monday morning I sit down and get things mostly set up – drawing 3 circles for each day, reviewing the fridge, reflecting on the past week, transferring any continuing projects or todos, picking out some stickers, etc. I don’t really go for color schemes or any particular theme with stickers, but it’s a fun way to repurpose or define sections and emphasize things.
So how did I end up going from a dot grid notebook to this fancy thing? And what is the deal with the stickers? Well… last fall, I went to Target, as one does, and randomly picked up a pad of planner stickers that jumped out at me because they were really well-designed, nice paper, and the bulk of the stickers were for writing down your top 3-5 things to do in a cute little box. Perfect for how I set up my days!
I really enjoyed the stickers so I went online to try to find more of them and… couldn’t. Turns out they were a limited Target-specific release that I lucked upon. But it did lead me to the company and their core product – the Happy Planner. I’ll be honest – I got completely sucked in to browsing stickers because again, I LOVE STICKERS, but didn’t really find the planners all that appealing because most of them focused on more of a sticker-centric artsy layout, rather than writing on lines. I ended up ordering some sticker books to pick up from a craft store on my next trip to the US, and when I went, I browsed their planners in person and found this one with a layout and relatively understated design that actually appealed to me.
Here’s the thing: this ecosystem of products can really suck you in. There’s an entire world of YouTubers dedicated to showing how they sit down each week to do “spreads” and explaining the pros and cons of the different layouts (mine is called a dashboard layout, apparently) and flipping through sticker books and buying dedicated planner totes. I am perhaps not at that level (though turns out of my beloved friends is at the cutting-custom-stickers level so I mostly just text her about this), but I did get a couple other things that are worth mentioning.
I also picked up a pack of project planning paper in a bigger size and figured I’d try them out before committing to the whole disc-bound system. I ended up enjoying it so much I bought one of their notebooks in that size with a cover I like a lot to hold that paper. I really like being able to customize the contents of that particular notebook without it being a hardcover binder, so it currently has a combination of project sheets and regular lined paper.
And finally, besides the ever-growing pile of sticker books, I have one of their recipe organizers. I have a pretty sizeable collection of cookbooks that I use a lot, and the internet is a treasure trove, but I find myself continuing to write down favorites we make constantly and I’m tired of digging out a giant book for, recipes from friends and family, and modified versions of things that I’ve figured out over several iterations. There’s this funny orange journal I’ve had for almost 20 years that’s become the place I write recipes down (after cutting out several pages of teenage angst at the front), but I figured a structured recipe keeper that still lets me just write stuff down would marry the desire to have something polished with my preference to not futz with my computer any more than I already do. To be fair, I do end up printing the recipe names and foiling them (another post someday, maybe!), but that’s it for the computer involvement 🙂 The disc-bound system also comes in handy again there, because I’ve added a page for common weights and conversions that I use frequently and are spread out between several different books.
Anything else you want to know? Just ask! And I’m sure I’ll change my mind again 6 months from now, because I’m always trying to manage myself better.
You know how everybody hates on recipe blogs that start posts with stories even though a) it’s good for copyright and b) stories can tell you a lot of things about humans and the why and how of their food, well if that’s you then you’re going to hate this tech recipe! Or you’ve already scrolled past this.
So. Last year, I saw this tweet:
I have never done any hardware tinkering, but I immediately wanted to make one of these for my kids. The oldest is pretty good with making requests from voice assistants, but the little one isn’t there yet and we have some other problems anyway: preferring edited or specific alternate versions, difficulty requesting things that aren’t in English, and often a lot of people in the house making a lot of noise, which leads to yelling and garbled results. (See what I did there, I defined the problems I was trying to solve for, it’s like I’m good at my job or something.)
Since I have a few Raspberry Pis I’ve acquired as conference speaker gifts, I wanted to try to use as many existing parts as possible. My first thought was that I would like to play audio through an unused Google Home Mini, but it doesn’t have aux-in and honestly I just could not decipher the documentation around Google Assistant+Actions and those type of generic names and entangled services make things highly unsearchable. I decided to go with regular audio output and figure I can keep iterating with software and/or hardware over time.
The original maker doesn’t seem to have ended up doing a write up of what he did, so I took a look at other similar things people have built. I found this blog post, which took me to their code on GitHub. Availability and pricing as well as a love for the more tactile experience told me I still wanted to use swipe cards rather than RFID, and I don’t really know Python and wanted to make something with as little configuration or dependency management as possible so I figured I was on my own code-wise. That said, that blog post gave me a general direction for approach and led me to Pi MusicBox, which also serves as the base for my player.
I finally ordered the materials off Amazon mid-December for my spouse to bring back from his trip to the US, and got to work because I only had a week to get it all done. Here’s my planner page I worked on to get a head start while I waited:
First up was testing the card reader and setting up the writer, which was not a smooth process. I had to find the writer software online, because who has a CD drive anymore? The driver took forever to finish installation for some reason, but once it got there it seemed to work. Except that the card reader wasn’t returning anything. I tried a regular old bank card (I used one for a defunct account just to be extra safe) and only got numbers, no name, even though having done my time in retail I knew my name should show up in the magstripe data. I tried writing data to a fresh card in all 3 tracks and would only get tracks 2 and 3 from the reader, or sometimes even just track 3. Seems like a malfunctioning card reader (I’ve also occasionally noticed ghost input now that the jukebox has been running for a few days). Update in 2020: I got a second card reader and it works correctly.
Because tracks 2 and 3 can only contain numbers, I decided that the best route to go would be to just encode numbers sequentially and grab that line from a list of Spotify URIs for playback. My first few tests got nowhere – successful write, but wouldn’t read. I tried finding a new card reader in person but to no avail. I tried test data again and… it worked? That’s when I realized that my test data had three numbers, so I tried putting 001 and voilà, that fixed it. After thinking through it a bit, I actually realized that this was the best route anyway – if a Spotify URI stops working, I can swap it out, and the usual ISO encoding for cards is all-caps anyway, and the URIs are case-sensitive.
I decided to put the number on all 3 tracks since the reader seemed to unpredictably read either one or both of tracks 2 and 3 and I might replace it later. This was pretty easy in the card writer software, which allows you to create cards from a file, which I generated using a quick and dirty Bash script. I also made a card with 999 as a special case for toggling playback – there is also a local web server you can access for various functionality including shutdown/reboot, but a basic toggle seemed useful for the kids.
The script itself is extremely small – it does a little Bash magic (parameter expansion!) to extract the first number it comes across, strips off any leading zeroes, and then gets the indicated line from a list of song URIs if it’s not a special case card and plays said song. I stressed about it for a long time but in the end, my first working run was less than 10 lines of code.
For labels, the initial inspiration indicated that they made a React app that pulled in the data to make printables, which is super cool! I, however, am a weirdo who despite being a programmer is still often faster knocking stuff out in Photoshop/Illustrator as opposed to writing a whole app. I also wanted to use artwork besides album covers for many of the cards so that my 2 year-old can differentiate between tracks from a Mother Goose Club or El Reino Infantil album and pick what she wants – this has already proven successful 🙂
I did not hand-make a fancy box, though I might end up 3D printing something eventually, but I did discover that some of the drawer organizers I use were a great size and are good enough for now. Here’s what I ended up with for Christmas morning:
I enjoy posting about the process of building or learning things, and I’ve had a lot of people asking me about this, so I think it makes sense to blog about the process and the result. So now that you know why I decided to build a jukebox and how I arrived at the choices I made, let’s get into the step-by-step.
Magnetic stripe card reader that emulates keyboard input (mine, the first one I had so you can avoid that one because of the issues)
Spotify Premium account (protip if you have kids: use a family account and set up individual accounts for devices so you don’t run into playback limitations and you keep your recommendations somewhat more sane, I name them things like Alexa so if you ever see a reference to an Alexa Sandí associated with me please know that is not my actual child and somebody has sold or stolen my data)
A computer that can flash SD cards, run the card writer driver and software (I’m on a 12″ MacBook), and if you want to use my templates, access Adobe Illustrator
USB keyboard and HDMI monitor for initial setup (I used my Magic Keyboard with a cable and a TV)
Whatever you need to print 2×3″ labels (I had them printed onto adhesive sheets at Office Depot and cut them to size myself)
Set up Pi MusicBox. I found their documentation to be perfectly adequate, just note that when setting up Spotify you have to authorize and generate tokens that are copied into the config file.
Boot up the Raspberry Pi with the card reader plugged in and log in. Test Spotify playback by running mpc add spotify:track:7GhIk7Il098yCjg4BQjzvb && mpc play
Optional but recommended: fork my GitHub repo so you have your own copy and can keep your song list edits there. After forking, be sure to edit jukebox.sh to point to the songs.txt in your own repo.
Run curl https://raw.githubusercontent.com/helen/swipe-jukebox/master/jukebox.sh > jukebox.sh (substitute in your own username if you’ve forked the repo above).
Set root to auto-login on boot and /root/jukebox.sh to run after login so the setup can live headlessly going forward. These instructions work well, noting that the user for MusicBox is root, not pi.
Run bash jukebox.sh; this will download the song list referenced in the script as songs.txt. Enter a number like 1 at the prompt that says Swipe: to ensure the script is working as expected. If you want to quit the script, hit ctrl-c.
Edit songs.txt to your liking. I have found the easiest way to do this is to create a Spotify playlist and then select-all, right click, go to the Share menu item, select Copy Spotify URIs, and paste the result into the file. I also decided to paste the results into a Google Sheet along with the titles and artists extracted using a playlist converter tool so I have them conveniently numbered and saved separately.
Encode the cards. I found the easiest way to do this was to write them from a file, which just loads up each record sequentially and writes it to the next card you swipe. There’s both a sample file that goes up to 250 in the repo, as well as the Bash script I used to generate that file in case you want to go higher or if you get interrupted and need to make a subset. I wrote the number for each card on the back and also tested every card in the reader after writing, which at this point should trigger the appropriate playback.
Create the labels for the cards. I recommend you make them 2″ x 3″. There is an Illustrator template in the repo for those of you who are graphically-inclined. The intended artwork area is 1.5 inches square.
Print the labels for the cards and stick them on – I tested each individual one again before putting the label on because I am extremely particular, but if you make a mistake it’s fine, you can change the order of the URIs in the songs.txt file (and your playlist, if using one).
Shut down the Raspberry Pi – I find it easiest to do this by navigating to the web interface (typically at http://musicbox.local).
Box everything up and plug it in again to test the whole experience. When it’s headless, you’ll want to wait a minute or two for the green light to stop blinking so much for everything to be ready to go.
If you build one, please let me know! I’d also love to hear any tips or tricks or issues you come across if you try following along with this – I’m a software developer, as far as I’ve ever experienced there are always going to be bugs 🙂