Projects and Updates, 2019-01-01

Projects and Updates, 2019-01-01

I moved! And it consumed as much time and energy as you would expect. The new view is great and I'm excited to drink ALL THE BUBBLES on my new balcony, once it stops being cold outside.

Playlist of music in this post: Spotify

I moved!
All things considered the move was very smooth and I'm thankful for that. The most relevant part of the moving process, for this particular post, is that my refrigerator got replaced. The short version of the story: I now know, for the sake of food safety, refrigerators should operate between 32 and 40 degrees Fahrenheit.[1]

While troubleshooting my warm refrigerator, and trying to figure out what exactly the temperature knobs controlled, I was reminded of a section in The Design of Everyday Things where Donald Norman writes about that very thing: one knob controls the temperature, the other knob controls a door that splits the cold air between the freezing part of the fridge and the cooling part of the fridge.

I won't go into conceptual models or a better way to design refrigerators... the book does a fine job discussing it.[2] I just found it funny sad that a refrigerator could still suffer from the same design challenges someone addressed 30 years ago.

Anyway... after 9 years in my old apartment, this place doesn't quite feel like home, yet. (A functional refrigerator will help.) However, I do love it and it's already given me an opportunity to host a mezcal tasting.

Mezcal Tasting
First, some context: I had a mezcal tasting![3] Approximately 40 people attended, we sampled 10+ bottles, nobody died, much fun was had.

A question that I'm often considering is: what does it mean to design real life experiences for people? In software design, you're designing an interaction between a person and your software; you have direct control over 50% of that interaction.

When trying to design something like a party, it gets tricky: the experience of a party is made or broken based on the interactions people have with other people. You can design a (hopefully) useful environment for people to interact with each other, but you have direct control over 0% of the interaction itself.

That problem - trying to influence interactions you don't directly control - is a prime problem of party planning and much of what consumed my attention for the mezcal tasting. Here are some notes from the party.

Tailoring the party to the invitees
As a rule, when I invite someone to something, I do it one-on-one: talking to them in person, sending that person a text, sending them an email. I keep that one-on-one mentality when I'm communicating details, confirming the time and place, etc.[4] There are many good things about this tactic, but there's one main reason I do it: It has created better events and experiences than using mass communications.

A huge opportunity of the tactic is the ability to individually set expectations of what I'd like the party to be, and hear individual feedback on those expectations. As I'm seeing people respond positively or negatively to my vision, I can make real time adjustments to how I'm communicating the vision, or to the vision itself. In short, I'm getting information that allows me to tailor the party to the invitees, one invitee at a time.

Creating a quiet(er) space
As someone who's an introvert deep in his heart, I understand what it's like to be at a Totally Fun Party and, also, desperately need to hide somewhere for like just a few seconds.

At this particular party, I had paper airplane materials in a side area for anyone who needed some quiet time. I thought it was a good way to give people official permission to sneak away for a few minutes while doing something that's still somewhat social, but much more inwardly focused.

Externalizing the experience
I placed Post-its on all the tables, so people could note their thoughts on the offerings. I didn't have enough time to cultivate that idea properly, but I think there's a way to take the idea and use it to increase mingling between friend groups. At the very least, I wish I had a way for everyone to leave with a list of all the bottles, annotated with everyone's tasting notes.

There are a lot of things I'd change if I did it again; in particular, I'd like to facilitate more interaction between people who aren't already friends.

Some things I may explore in the future:

  • Optional(?) name tags, but instead of names, some other factoid, like how long the person has known me or how that person met me.

  • I also thought of asking each person to contribute a song to the playlist and somehow using that to connect people with similar music tastes. (Someone chose U2? I have to find that person!)

And the winners are...
Setting aside design talk for a moment, I did go through all the tasting notes and two bottles emerged as the overall favorites at the party. Here they are, along with a choice Post-it Note quote.

Casamigos Añejo Tequila

"Tastes like George Clooney looks."

Montelobos Mezcal

"I'm stealing this bottle."

Event Planning/Invitation Managing App
I extended invitations to 60ish people for the mezcal tasting, which was a great workout for my invitation tracking app. I made two updates to the app specifically resolving some of the pain points I felt while planning the party.

The detail page for any given invitee already displayed global notes for that person, e.g. Is vegetarian, as well as event level notes that I used to track the snacks and drinks people offered to bring. I quickly realized that navigating to 40ish individual detail pages didn't give me a great sense of the party as a whole: by the time I had navigated to the next person's detail page, I'd forgotten what I'd just read.

Individual Detail Page

My solution was bringing all of that information one level higher in the navigation scheme. The list of names that I use to access a person's detail page now displays global and event notes.
Invitee list with notes

The second major update was adjusting the invitee list so the groupings (i.e. replied yes, replied maybe, haven't contacted, et al.) had visual differentiation.
Invitee list with color differentiation

With over 60 invitees, being able to see the breaks between groups made it easier to find individual invitees and made it easier to consider the blocks as a whole. (e.g. "Who's still a maybe? Do I need to reach out to them??")

Pixel 3
I have a new phone. The Pixel 3 XL is larger than the Pixel 2 and has a better screen than the Pixel 2 XL; I like both of those things. My goal is to keep it for at least 3 years... we'll see how that works out.[5]

More important: The point of this multi-year phone switching project was ditching Verizon and getting with Google Fi. I'm still happy with that decision.[6]

Exporting and importing databases in Flutter/Dart
Because I have a new phone, I needed to quickly figure out exporting my app's database from my Pixel 2 and importing it into my Pixel 3. It's not hard, but also I couldn't find anything online that explicitly said, "Here's how I did it."

As such, here's how I did it...

CURRENT_DATABASE_NAME = "/invitationDatabase.db";
void exportDatabase() async {

    //File to be copied
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String mypath = documentsDirectory.path + CURRENT_DATABASE_NAME;
    File activeDB = new File(mypath);

    //Landing spot for new file
    Directory _externalDocumentsDirectory = await getExternalStorageDirectory();
    Directory _externalDownloadDirectory = new Directory(_externalDocumentsDirectory.path + "/Download");
    String externalpath = _externalDownloadDirectory.path + CURRENT_DATABASE_NAME;

    //The File object sends a copy of itself to the path indicated


void importDatabase() async {

    //File to be copied
    Directory _externalDocumentsDirectory = await getExternalStorageDirectory();
    Directory _externalDownloadDirectory = new Directory(_externalDocumentsDirectory.path + "/Download");
    String externalpath = _externalDownloadDirectory.path + CURRENT_DATABASE_NAME;
    File eventPlannerImportDB = new File(externalpath);

    //Landing spot for new file
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String internalpath = documentsDirectory.path + CURRENT_DATABASE_NAME;

    //The File object sends a copy of itself to the path indicated

Downloads folder vs Downloads Manager

Note: When exporting, I threw the file into the Downloads folder so it would be easy to find. As it turns out, sometimes Android phones have two separate "downloads" spots: the Downloads folder is a folder that holds all of the files you put there; Downloads Manager is a virtual folder that only displays files that were downloaded from the internet.

So if you're looking for a file and you know you placed it in the Downloads folder, try to view the folder using the Files app instead of the Download Manager. (It took me a very long time to figure that one out; hopefully this saves someone else some time.)

The Board Game

Working on the board game definitely slid down the priority list in Q4, falling behind: moving, party planning, updating the event planning app, party having, and general holiday season mayhem.

I've gotten as far settling on a 20 node board, and setting up a spreadsheet to estimate how long full games might take, considering variables like number of players, average nodes-advanced-per-turn, average turn length, et al. I'm most excited to design the narrative; however, the most important part of a board game is the game part... otherwise I could just write a story.

I think my next move will be setting up the basic mechanics of the game and running through it by myself, playing all the players and moving the average number of moves each time. Once I create mechanics that, in their most boring essence, are balanced, I can use that as a benchmark when building out the narrative and more advanced rules.

Favorite Five Albums
Finally, because this site clearly needs more music talk, here are my current favorite five albums.

Featured songs: Spotify

  1. Don't worry, I didn't get sick. ↩︎

  2. I believe that section starts around page 28. ↩︎

  3. Similar to how there are many types of whiskey and scotch is a type of whiskey, there are many mezcals and tequila is a type of mezcal. ↩︎

  4. So, for example, if I talked to 40 guests an average of 4 times each, that's 160 individual touches. ↩︎

  5. *Furiously knocks on wood* ↩︎

  6. Let me know if you want a referral link... I think we both get a credit of some sort. ↩︎