The Tech Behind My Wedding

I got married in April of this year. I’d like to share the tech we used to make planning and communicating a little easier. Then I will get all mushy at the end.

Project Management

Setting up any large social event takes a bit of planning. We were initially pretty overwhelmed by the amount of things that needed to be done (invitations, ceremony planning, cake tastings, music coordination, and the list goes on and on.) It felt like every time we talked with someone else, there was another thing to consider, and we figuratively chased our tails a lot. What’s more, remembering key deadlines and keeping ourselves on track and motivated was pretty important.

So I thought to myself, “what tools do I know that can help with this?” We need some sort of tool to see what needs to be done and to keep us organized. Pivotal Tracker came to mind, but seemed a bit too geeky and software-specific.

Then I thought of Trello. That seemed lightweight enough, and would provide us with a good dashboard of what needed to be worked on. So step one was to take our list of tasks that started to pile up and put them into Trello.

The next step was figuring out what sorts of columns to do. After some experimenting, we went with the following, from left to right:

  • two months after the wedding
  • every month leading up to the wedding, in reverse chronological order
  • what we are doing this week
  • all done tasks

When a new task came to our attention, we tried to slot it based on the other tasks or when it really needed to be done by. For example, getting a dinner tasting needed to precede deciding which dinner options to choose. Then all tasks hopefully flowed from their month to “this week” or “done”. When a given month was over, we could see what tasks still were not complete and to move them to the subsequent month.

A picture of our Trello Board after the wedding

Trello was a great fit for our situation. It allowed for us to see what the progress on various things was pretty quickly. When you comment on a card, the other person gets a notification, which facilitates asynchronous work. It was easy to use and visually appealing.

The nice thing about keeping cards that could be done later was that we didn’t have to think about them much. “Don’t worry, we don’t need to finalize the DJ until March, let’s focus on something else.” Also, the visual nature of the board allowed us to see that a lot was getting put in the March bucket, so we should probably get some more things done this month to clear some room.

Some Getting Things Done strategies helped to organize things. GTD-aficionados will recognize some of the following. Capturing everything in our trusted system (“If it isn’t in the Trello, then I don’t know about it.”) Asking “what is the next action on this task?” helps to clarify how to unblock a ticket or break it down into sub-tickets. Having a dedicated weekly review so we can review how things are going and reassign or reprioritize tasks.

Overall, I think this approach was a big win. I secretly both loved and hated taking a project management approach to the wedding.

Logistics

A basic flow of keeping track of guests with addresses and formal names, responses, gifts, thank you cards, and so forth was fairly challenging. To manage this, we ended up using some shared Google Docs spreadsheets. Arguably I could have made some sort of web app, but I think that this got the job done in a decent manner.

At one point, our caterer asked for a list of guests at each table, with what meal they were having. However, we had this information spread across a few spreadsheets. So I copied them to a plain-text file and made a Ruby script to join the lines together. I have no idea how long it would have taken or how many errors I would have made doing this manually, but the Ruby script just generally worked and I was able to do this in like half an hour.

There were probably dozens of times that I cursed the lack of better free tools for these problems (that I could find.) However, I can understand why developers probably don’t want to spend too much time working on things like this.

Wedding Website

One of the tasks was to create a wedding website to give guests a way to see more information about the event. Being the software developer of the couple, I happily fell on that grenade.

There were various wedding website generators out there, but I was not happy with the look of any of them. Since the content of the site seemed simple enough, I decided to try my hand at using a static site generator. I don’t think that I had used one up to that point before, and it was a positive experience.

Quick overview of using a static site generator: basically you write in markdown or some other markup language, and then the generator takes your markup and converts it to plain HTML, CSS, and JavaScript. The benefit of this is that you get extremely fast page load times since you can serve static assets that can be cached or served over a CDN.

A picture of the wedding website

Overview

I used Jekyll because I know Ruby and it seems like the best static site generator for Ruby. Jekyll was very easy to develop with, and definitely beat setting up yet another WordPress site. I hosted it on S3, which is pretty easy to do and is very cheap.

One of the use cases of the website was to be viewable on mobile devices. I have too often tried to go to a wedding and look up details on the way and the site was hard to use. Using a style framework ensures that the site remains responsive to different screen resolutions. Skeleton seemed to be a very basic but functional set of CSS files to ease responsive development.

The site lacked style for a little while, and then I embedded some Google Web Fonts to spice things up a bit. Basically this was the styling for the “logo” of the site (just swirly text that I gave a bit of offset to to make it run together a bit.) You can actually select text from the “logo” and it kind of looks funny, but I thought it was a pretty cool effect overall.

Awesome Controller sprite art creation taught me how to use Pixen, so I used that tool to create a custom favicon that looks like two rings that go together. Maybe not the best favicon ever, but hey, it was fun.

Dynamic elements

It was interesting to me how many things on the static site were actually interactive or dynamic. Most of these were taken care of by using JavaScript libraries to do the work on the client-side, or to offload work to another service.

The navigation was actually handled by a Jekyll script that looks at the current URL and sets the selected page correctly at compile-time. I found a decent responsive JavaScript slideshow plugin to show off our engagement photos.

We wanted to ask people what their music choices for the reception were, but I couldn’t think of an easy way to do this at first. Then it hit me. Use a Google Docs Form! Then the answers would be aggregated and I didn’t need to set up any sort of form handling.

Mushiness

OK, so enough technical stuff. :)

I am very excited to be married to a wonderful woman, and we had a fantastic day. It was everything we had hoped for. I think the day was very emotionally memorable, in a positive way. I think the planning helped us to grow stronger together as a couple. I think that it is great to be married, and I love Monica more every day!

A picture at the wedding

Quick Tip: Audio Reminders for Better Posture

Basically the tip is: find some way of playing a sound every fifteen minutes or so, and when this happens, check my posture. I have found this useful for better ergonomics and posture while using my computer.

I’m using the Mindful Mynah app on Mac, and have it set to chime every fifteen minutes or so. When I hear the chime, I quickly check my posture and often find that I can improve it. I think this increases my mindfulness of how I type and sit, as the bell reminds me to check it more often. Even without the bell, I realize that I have incorrect posture more often. The nice thing about automating this process is that I just need to have the intention to have better posture once, and then I can automatically lock in that benefit over time without needing to expend much effort.

The chimes do sound strange to others if I am on a non-headphone Skype call, and sometimes I forget to turn the app on or have the volume high enough, but for the most part it works. I actually notice sometimes when it has been a long time since I have heard the chime and then I remember to turn it up or on.

I’m sure there are other apps on other systems like this, and you could probably set your phone to vibrate to do the same thing. The nice thing about that is that you can practice better posture wherever you are.

The 20% Difference

Today I want to talk about something I read about in GTD-creator David Allen’s book Ready For Anything.

A key quote for me from his book is: “Nobody will even try to absorb and manage two hundred percent of what they can do. But they will take on enough to let themselves get ten percent behind their curve. And when you are ten percent behind, you feel like crap. But on the other hand, if you can manage to get ten percent ahead, you’re transformed and on top of your world.”

The idea he presented was that there is only a twenty percent difference between being ten percent ahead and ten percent behind, but the difference is huge*. Allen suggests that this 20% difference leads to feeling a general sense of ease and also the ability to think more strategically. Fighting fires does not lead to giving time to think more holistically.

My Thoughts

Compare: “Well, I said this milestone would be done on Wednesday, but really it is not going to be done until Friday” to “I said this milestone would be done on Wednesday, but I actually got it done today on Monday.” If you’re an hourly and/or standard weekly person, the difference between having Friday afternoon to work on personal projects or thinking great thoughts instead of being behind at work.

The idea can be useful when applied to projects. Asking which projects are slightly ahead of schedule, and which projects are slightly behind schedule and the acceptability of that state can clarify priorities in organizations and life.

The quote from the book above is useful for also realizing that we are for the most parts responsible for the amount of work that we choose to take on. Sometimes the right thing to do is to consciously drop a project or put it on the back burner to free up energy to get ahead on key projects.

I think the tone of the quote also suggests that each of us has our own curve. A state that is ten percent ahead to me might be fifty percent behind or ahead of another given person.

Sometimes now when I feel like procrastinating, I ask myself: “Would I rather be working toward ten percent ahead, or ten percent behind?” That usually helps me either get back to being on track, take a step back to unblock myself mentally, or take a dedicated break.

Ready For Anything Itself

As for the book itself, I recommend it because it covers ground between tactical, strategic, and philosophical. I found it easily readable and it had useful insights for my general approach to being more organized about the “stuff” in my life. It is best used as a supplement after you have read the GTD book. It has fifty-two very short chapters (about 3 pages each.) When I finished the book I left it around the house and would randomly open it up and read a chapter, which led me to a better sense of Allen’s thinking and writing styles. Plus, it’s like a penny used on Amazon (plus shipping, of course.) It’s pretty useful for figuring out what fundamentals I am goofing up. “Oh yeah, I guess if I didn’t do my weekly review, then I would have some things that got missed.”

End Note

Mathematicians: There are probably many ways to slice the percentages here. However, just focus on the high level concept. :)

How to Set Up Local HTTPS Development

I spent a little time during the last week figuring out ways to debug HTTPS issues locally, and wanted to share. My end goal was to run HTTPS with valid wildcard SSL certificate on a Rails server locally (most of this is not Rails-specific.)

Why this is useful

I wanted to do this so that I could see which pages had partially insecure content or looked incorrect when using HTTPS. If your “secure” page loads a stylesheet or image or JavaScript file in an insecure manner, you could leak private user information, etc. You can see whether you are really secure by looking in the URL bars of modern browsers.

However, we only had a valid SSL certificate in production for a client project that I was working on. If I tried to look at the staging server or a local server with HTTPS, I would get a pretty ugly error and the browser would just tell me that the certificate was not accepted. Plus, I wanted to be able to make changes and see the effects locally without needing to push to staging (increasing the feedback loop speed is always high on my list of priorities.)

Setting up the SSL certificate

I followed the instructions at Heroku’s Self-Signed SSL Certificate post. I created a script which looks like this (to automate):

#!/bin/sh

# See https://devcenter.heroku.com/articles/ssl-certificate-self for overview

ssl_dir='ssllocal'
mkdir -p $ssl_dir
openssl genrsa -des3 -passout pass:x -out $ssl_dir/server.pass.key 2048

# be sure to use *.lvh.me as the common name, allows us to hit admin.lvh.me, etc.
openssl rsa -passin pass:x -in $ssl_dir/server.pass.key -out $ssl_dir/server.key

rm $ssl_dir/server.pass.key
openssl req -new -key $ssl_dir/server.key -out $ssl_dir/server.csr
openssl x509 -req -days 365 -in $ssl_dir/server.csr -signkey $ssl_dir/server.key -out $ssl_dir/server.crt

A bit of explanation: you are going to be generating keys into an ssllocal directory. Presumably this would be inside your Rails app, although if you used it for multiple apps, you could put it somewhere else. The openssl-related lines are just creating the keys, and I pulled all of that from the Heroku post.

Pointing to lvh.me will redirect you back to 127.0.0.1. This might not seem all that useful at first, but you can also use subdomains. So www.lvh.me will work in a way that www.localhost or www.127.0.0.1 will not. You could change your hosts file for each subdomain, but some sites have dynamic subdomains (consider one for each customer.) For my case this was the situation, so I needed to find a solution to create an SSL certificate that would work across all subdomains. I found Justin’s explanation of using wildcard subdomains, which says to be sure that you pass *. before the domain name to resolve any subdomains. I think that this will result in not being able to hit multiple nested subdomains with SSL (say, foo.bar.baz.lvh.me), and naked domains (you’ll need to use www.)

Running a local server with SSL

Next, you need to run a server with SSL. I used thin, with the command:

thin start --ssl --ssl-key-file ssllocal/server.key --ssl-cert-file ssllocal/server.crt

This says to use SSL, and to use the key/certificate that we generated above. Standard HTTP connections will not be allowed, and HTTPS ones will be. Next, hit the server by going to https://www.lvh.me:3000. You should be greeted with the standard error message when you are presented with an invalid certificate:

Certificate Error in Chrome Browser

Trusting the self-generated certificate

Now you want to tell your computer/browser to trust your certificate so you don’t get the error message when you hit the page. Without doing this, mixed content issue will be masked, since the browser will only tell you that there is a huge error with SSL. Since I’m on a Mac currently, I found this article quite helpful for downloading the certificate and trusting it, and I recommend following it closely.

When you are done, you should be able to hit the server again (probably after restarting your browser) and see:

Certificate Success in Chrome Browser

Cleaning up

To find issues with my site, I looked around at the browser and when it didn’t have the secure lock, I looked in Chrome’s developer tools to figure out what the offending resource was. In my case, I needed to tell Paperclip to use the secure version of images stored on S3, and generally changed any other includes. One helpful tip is that you can remove the protocol of a resource so you don’t need to check whether you are using http or https.

The generated key files are still around, you may want to git ignore those

If you later try to access localhost from a HTTP URL, your browser may remember the HTTPS setting. In this case you need to clear cookies for localhost.

This solution worked for me and I’d be interested in hearing if there are ways around some of the edge cases with subdomains.

Using Asocial Media Effectively

I found a hack recently that allows me to provide value to people following me on social media without actually interacting with them. I call it “Asocial Media.”

The tip

I may sound like Buffer’s number one fan after this post, as today’s tip basically boils down into: buffer your social media posts in times of great productivity, so that you don’t get sucked in and waste a lot of time looking at cat pictures.

This tip is for when you don’t want to get out of the flow of what you are doing but feel a burning need to share something. Basically, if you find a cool link, instead of tweeting it out right away, I put this in my Buffer queue and then it automatically gets tweeted out. If I’m churning through email or blog post reading and I find something noteworthy, same deal. Basically it allows me to continue with what I am doing and not accidentally lose twenty minutes by looking through status updates.

Same for facebook, but I don’t really share as much there. Mostly using photos and collaborating with a few Ultimate groups that I belong to.

Some of the value comes in not remembering what it was that you tweeted about when someone responds. It could be the next day, after all. So there’s less incentive to have a conversation about it.

I find this strategy a good filter for determining the value of a resource I find. There’s a saying: if you’re not sure if something is good, tweet it out, and if it gets retweeted back to you, you know it was true love. Well, something like that. Basically the number of favorites or retweets is indicative of quality. It’s like my own personal crowdsourcing. Plus, then often I will re-read the post and catch something I didn’t see the first time. It’s kind of like a bookmarking service that I actually use.

So what does it all mean?

I agree with many of the points in Matt Swanson’s post about evaluating technical arguments. I talked about some of these ideas in an older, dense post on meta-information. A good quote:

For example, if I am following various entrepreneurial types and remember a technique for increasing sales, it is crucial to be able to remember who gave the advice because of the differences between bootstrapped and VC-backed startups. Trying to apply advice from one category to the other will likely have deleterious, if not disastrous, effects.

I should probably go a little further in that most of the “news” or things that seem important on a given day are probably not that important to me personally or professionally. I mean, really, how many of the articles that I have read in the last month:

  • did I actually read most of the way through?
  • could I cite the major points of?
  • would I actually use at any point in the near foreseeable future?
  • would be useful or noteworthy to me in five years?

You can see that many of things to read fail to pass these tests in this bucket. Not to say that they aren’t worth reading, as there might be some useful points. I think the biggest thing once you’ve gained an overview of a field is to see when things are actually changing.

I’m not really sure if this means that social media is less useful to me than other people, just that I use it as a way to get more broad research. I have no interest in the “flaps” of the day unless they reveal a greater trend.

Really, if anything, I want a dampening filter. I want the biggest, best, and most important things to stand out, and perhaps a summary of the lesser things to stay in touch. If it captivates the blogosphere for three days, it is not something that I’m interested in. I’d rather read ten pages of useful political summary once a year than try to follow the political process every day for a year. Anyway, turning into a bit of a rant, so going to wrap this post up.

I really like high signal-to-noise ratios of information sources, due to less time needed to find useful information. With asocial media at least, I’m contributing a high signal source. If you’ve read this far and are interested in said high-signal posts, you can follow me at @panozzaj. Because I coined the term, you can consider me an “Asocial Media Guru ®.”