Archives

Blog index

Blog

  • Why I Set Personal Deadlines


  • Running Zapier Actions During Business Hours Only

    Two weeks ago I had a problem I wanted to solve with Zapier: Only running a particular Zapier action during business hours and delaying everything that happens outside of business hours until the next day.

    I tried multiple approaches to make this happen, but each one fell short:

    • Filtering up front for business hours meant that everything outside of business hours stopped due to Zapier’s Continue Only If filter.
    • Only checking that the time was before 5pm meant that zaps could go through at 2am.
    • Only checking that the time was after 8am meant that zaps could go through at 11pm.

    Zapier is really great at handling linear workflows (if X happens, then do Y), but it isn’t really set up to handle nested workflows (if A, then 1, else if B, then 2, else if C, then 3). In order to correctly handle only running zaps during business hours, individual zaps would need to have nested logic. This is unlikely to happen on Zapier any time soon, so I thought I was out of luck.

    After thinking about it for a few days, it hit me: Why not use two different zaps simultaneously? As long as the zaps are configured in a way that one always works and the other one always gets filtered so they never conflict and duplicate actions, it can work! Yes, this doubles your zap usage, but it is a great way to get around not having nested logic in individual zaps.

    By combining the Date/Time formatter, Only continue if… filter, and the Delay Until action with different settings in two different zaps, I achieved what I wanted.

    Here is a sketch of the solution I’m using:

    Zap 1: Handling actions between 00:00 and 17:00

    After the trigger (a form submission), I immediately set up three actions:

    1. Zapier Formatter’s Date and Time Formatter to get the time the zap triggered and transform it to a usable format in my time zone.

    2. Zapier’s Only Continue If filter to check the time of the previous step and only allow it to continue if the time is before 17:00. Anything that happens after 17:00 gets to this point in the zap and stops.

    3. Zapier’s Delay Until action to delay actions until 08:00.

    The way that the Delay Until action works is that if the time is before your specified time, the action will be delayed until the time you specified. If the current time is after the time you specified, the action will continue immediately. Understanding this ended up being the key to this workflow design.

    Everything else I want to occur during business hours comes after this step in the zap.

    Zap 2: Handling actions between 17:00 and 23:59

    For 17:00 through 23:59, I use the same three actions and filters, but with different settings.

    1. Zapier Formatter’s Date and Time Formatter to get the time the zap triggered and transform it to a usable format in my current time zone.
    2. Zapier’s Only Continue If filter to check the time of the previous step and only allow it to continue if the time is after 17:00. Anything that happens before 17:00 gets to this point in the zap and stops.

    3. Zapier’s Delay Until action to delay all further actions until 08:00 the following day.

    Here’s how it works

    Both zaps get triggered from the same form submission. The way we’ve set them up, one of the two zaps will always run and the other will always get filtered out by the “Only continue if…” step. Our cutoff point is 17:00. Whatever happens before 17:00 gets handled by Zap 1 and Zap 2 gets filtered. Whatever happens after 17:00 gets handled by Zap 2 and Zap 1 gets filtered.

    Examples:

    • Form submission at 3:21am: Zap 1 kicks in and delays the action until 8am. Zap 2 gets filtered and does not run.
    • Form submission at 8:41am: Zap 1 runs immediately because it is before 17:00, but after 8am, the Delay Until time. Zap 2 gets filtered and does not run.
    • Form submission at 2:15pm: Zap 1 runs immediately because it is before 17:00, but after 8am, the Delay Until time. Zap 2 gets filtered and does not run.
    • Form submission at 6:08pm: Zap 1 gets filtered and does not run. Zap 2 kicks in and delays the action until 8am the next day.
    • Form submission at 11:52pm: Zap 1 gets filtered and does not run. Zap 2 kicks in and delays the action until 8am the next day.
    • Form submission at 12:02am: Since it is now a new calendar day, Zap 1 kicks in again and delays the action until 8am. Zap 2 gets filtered and does not run.
  • HTML and CSS Basics for WordPress


    Here are resources for WordPress users who want to use HTML and CSS to alter the structure, look, and feel of their themes, posts, and pages.

    What HTML and CSS do

    HTML is for structure, CSS is for presentation, and Javascript is for behavioral interaction

    HTML is primarily for structure. HTML is the base level of most what you see right now in your internet browser. In order for any CSS or Javascript to work on content, that content must be first wrapped in an HTML tag.

    CSS is primarily for presentation. CSS is essentially a shorthand way of giving instructions to HTML tags on how they should look and where on they page they should show up. CSS does include some behavioral interactions components like hover and on-click actions.

    Javascript is primarily for behavioral interaction, but its scope has grown significantly in the past few years. We won’t cover Javascript in this guide. It requires its own guide, which will come later.

    Resources

    My favorite resource for learning the basics of HTML and CSS from scratch is W3Schools. Their examples are clear and they have widgets where you can test out the syntax and poke around what already works to learn more.

    Here is the W3Schools HTML tutorial. I recommend completing the HTML HOME through HTML Symbols. This will cover 95% of the HTML you will encounter in WordPress.

    Here is the W3Schools CSS tutorial. I recommend completing CSS HOME through CSS Forms. This will cover the basics of the CSS that you will see in WordPress. Pay particular attention to the Box Model. Once you feel comfortable with the basics, feel free to move on to the CSS 3 section, which builds on the basics.

    After you’ve gotten your feet wet with W3Schools, test your knowledge by working your way through Codecademy’s HTML and CSS course.

    How to use these resources

    The best way to learn HTML and CSS is by actually writing it, refreshing the page, and seeing what happens. A good rule is to spend 3 hours applying for every 1 hour reading/taking notes.

    Get yourself an easy-to-use text editor like Atom, make a new file names hello.html, and then start writing. After you’ve written your first line, save the file and open it in your web browser to admire your handiwork.

    Then go back to Atom, make some changes, save, and then hit Refresh in your browser. Repeat.

    To find which style definitions and HTML tags apply to what you see on your favorite websites, learn how to use Chrome’s debugger to find them. After a little practice you’ll be able to quickly identify the underlying markup and apply your own overrides and fixes.

    Where you’ll use HTML and CSS in WordPress

    You’ll primarily use HTML in the content editor of Posts and Pages. When you are editing a post or a page, the editor has two options: Visual or Text. Visual comes up by default. If you switch over to the Text tab, you’ll see that your headers, lists, etc are marked up with HTML:

    HTML in the WordPress post editor

    CSS is usually defined and applied in the style.css file inside your WordPress theme folder. That said, if you are just starting out, I recommend you leave the style.css file alone and install the Jetpack plugin. It includes a module for adding custom CSS to your theme. There are two benefits for doing it this way:

    1. Beginners should stay away from theme files because you can easily crash your site if you don’t know what you are doing. Changes made in the Jetpack CSS module don’t change your theme, they just apply changes on top of it. These changes are easy to remove, so you don’t have to worry about crashing your site.
    2. These changes are stored in the database, so they’ll bypass cache. Most hosts aggressively cache theme files, so changes made directly to style.css might take some time to show up. Changes applied via Jetpack’s CSS module take effect as soon as they are saved. These changes are also usually applied last, so they take precedent over what is defined in your theme.

    The free version of the Jetpack plugin is all you need. Once it is installed, you can click “enable recommended options” and the CSS module should be included in that. If it isn’t, go to Jetpack > Settings > Appearance and toggle on Custom CSS.

    Once it is turned on, you can go to Appearance > Customize in your WordPress Admin sidebar. In the Customizer you’ll see an area for Additional CSS:

    Jetpack's Custom CSS module in the WordPress Customizer

    Questions

    If you have any questions, drop them below in the comments! Or, you can ask them on Stack Overflow and Quora like the rest of the web does 🙂

  • When is the last time you sent a Thank You note?

    “Send a thank you note” is one of those pieces of common wisdom we always hear, yet an astonishingly low number of people actually do it.

    Let me give a recent example of how a thank you note (even a digital one!) can shape someone’s view of you.

    A Tale of Two Groups

    Over the past few weeks I emailed the same message to two different groups.

    Group A is generally earlier on in their careers. Group B is generally more established in their careers. The email content, open rates, and link clicks were the same, but what stuck out to me was how differently the two groups acted after logging in. Only 2.4% of group A sent me a note afterward, whereas 55.5% of group B sent me a note afterward.

    Building Social Capital

    The majority of group A read and archived the email. The majority of group B took the interaction as an opportunity to build some social capital.

    I didnt expect a reply and I don’t think less of those who didn’t reply. I don’t want to be presumptuous and think I’m important enough to warrant a reply. Heck, there are dozens of emails I just read and archive without responding to every single day.

    That said, those who did reply gained some social capital with me. They stick out because they did something very few others took the time to do: Send me a nice note. With a 30 second email, they changed the way I think about them. I haven’t met any of them in person and I don’t interact with them on a daily basis, but I’m willing to go out of my way for those who did actually reply the next time they need help with something.

    There is a strong correlation between those who replied and career success (even early in their careers). They know that consistently doing little things to build social capital makes asks and connections easier in the future. Most in group B (and a few in group A) have learned this lesson and made doing little things like this part of their standard operating procedure.

    Even though sending a thank you note is common wisdom, few people go through the trouble of actually doing it. With Praxis, I work with a lot of bright young people. Most, even the ones who excel, never send a thank you note. The minority who do stand out.

    What opportunities are you missing because you didn’t take 30 seconds to say thanks?


    A big thanks to Isaac Morehouse for regularly encouraging me to follow this principle and for his notes and suggestions on an early draft of this post.

  • When is the last time you sent a Thank You note?


  • Yes, There are Stupid Questions

    I field a lot of questions. I’m sure you do, too.

    In a single day I might get asked about technology recommendations, programming syntax, software integrations, business processes, locating files, and how to set up WordPress. I don’t mind answering these questions, and I try to do so quickly and politely.

    Here’s the kicker: At least 80% of these questions can be answered with a simple web search. There already dozens of tutorials, Stack Overflow threads, Quora answers, blog posts, FAQs, and documentation sections covering these topics that can be reached in a few clicks. Most of the time the person asking has not made any attempt to answer the question themselves. I consider these stupid questions.

    Back in 9th grade, I asked Mrs. Dispenza a history question while I was doing my homework. She politely asked, “Where have you already looked to find that answer?” I sheepishly admitted that I hadn’t looked anywhere. What she said next has stuck with me ever since:

    “You should never ask someone else a question without first attempting to answer it on your own.”

    Of course there are exceptions to this. Someone assisting a surgeon in the middle of a surgery shouldn’t stop to research the best way to stop bleeding, he should just ask the surgeon. Sometimes asking a veteran staff member the best process for doing something is better than spending an hour figuring it out through trial and error. There are costs and benefits to every decision. Make sure the comparison lands on the “benefits” side of that scale if you are using someone else’s time and energy.

    Do This Before Asking a Question

    Before you ask someone a question in the future, follow this mental checklist to make sure it isn’t a stupid question:

    • Is the answer this question worth taking someone else’s time and energy for? Will I waste social capital by asking this question?
    • Did I make a good faith attempt to answer this question myself?
    • Did I demonstrate to the person I’m asking that I tried to answer the question myself and try to pinpoint the source my confusion?
    • Instead of asking for a solution to this specific problem, can I ask to be pointed to a resource so I can solve it myself? (Documentation, a specific book, a website)

    How to Answer Stupid Questions

    Answer politely and quickly

    If your first instinct is to tell someone they should have looked the question up before asking you, The Dude has a message for you:

    Always answer the question politely and quickly. Be nice and be helpful. Don’t be an asshole.

    A crisis is not a time to teach a lesson.

    Tensions run high when money and reputations are on the line, so clear thinking is rare during a crisis. When there is a crisis unfolding and someone asks you for help, step in, stay calm, and fix the problem. Don’t waste time teaching people how to research and solve issues on their own–you’ll only frustrate yourself and everyone else.

    Follow up afterward with an after action report for the person or team. Detail what happened, what caused it, what the solution was, and what can be done to prevent this issue in the future. Also suggest some resources the person or team can study before the next crisis hits so that they will be better equipped to respond. This report should be added to your documentation or knowledge base. It will likely help everyone in the future.

    Follow up with resources that person can use to dive deeper

    After answering the question, pass along a book, article, video, or a guide where the questioner can learn more and refer to later.

    If the same person asks the same question again in the future, consider responding, “Hey, I remember that we talked about this last week. Did you check out the blog post I sent you? Here is that link again: http://example.com/blog-post/”

    Sometimes a dialogue is the best approach

    Sometimes dialoguing leads people to answer their own question and sometimes it helps me figure out the source of their misunderstanding. I like to ask,

    • “Where have you looked?”
    • “What have you tried?”
    • “What do you think the best solution is?”

    Do you need better documentation?

    If you keep getting the same questions over and over, your company or your project might need better documentation. This can come in many forms: Training materials, FAQs, instruction manuals, user guides, standard operating procedures, a wiki, etc.

    If you have documentation, keep it up to date and make sure that all staff are kept up to date on additions and changes. Everyone needs to know it exists and referring to it needs to become part of the culture. If you don’t have documentation, make it a priority to write some! Documentation is everyone’s responsibility, not just HR’s.

  • Yes, There are Stupid Questions


  • Get the Most out of Your Kindle with These 4 Tools


    Take screenshots, get reading statistics, export your highlights, and remove the ads from your Kindle

    1. Screenshots

    Did you know that you can take screenshots on most recent Kindles? This is useful for quickly sharing a passage, showing an editor or developer a display issue, and sharing tips in an article like this one.

    To take a screenshot, tap on opposing corners at the same time.

    https://gfycat.com/PointlessDistantDiamondbackrattlesnake

    To retrieve these screenshots, connect the Kindle to your computer via USB. The screenshots will be saved in the main folder as .png files.

    2. Reading Statistics with Kindle FreeTime

    I’ve wanted reading statistics on my Kindle for a long time. It wasn’t available in the main settings, so I gave up on it and kept track of my reading on my own.

    I stumbled across an article one day talking about the Parental Control settings on the Kindle. When parental controls are enabled, kids have a completely different reading experience. Only books that are enabled by the parent’s account are available, the parent can set daily reading goals for the child, and the child can earn achievements based on how much they read. Daily, monthly, and total reading statistics are also available!

    The highlights you made in FreeTime are preserved in My Clippings.txt, but you can’t see them on the Kindle unless you are in FreeTime mode. Progress between FreeTime and regular mode are tracked separately, too.

    I now pretty much only use my Kindle in FreeTime mode so that my reading statistics are tracked.

    If you are a data nerd and want to crunch the data on your own, it is stored in a SQLite file on your device under system > freetime > freetime.db.

    3. Export your Highlights and Notes with Clippings.io

    The highlights and notes you make on your Kindle are saved on the device in a file named “My Clippings.txt”. You can access it by connecting to your Kindle to your computer via USB. If you take this file and upload it to Clippings.io, you can edit, search, tag and annotate these highlights. Then you can publish them to Evernote or export them to Word, Excel, plain text, or PDF.

    4. How to Remove the Ads from your Kindle

    The price of Kindles are partially subsidized by ad sales. They show up on your lock screen when the device is turned off and you get special offers based on what you’ve read recently.

    I find these ads annoying. Thankfully, you can turn them off! It costs $20, but I think it is worth not seeing them ever again.

    To remove ads from your Kindle, go to Amazon.com, click on Your Account, and click Manage Your Content and Devices. Select the Kindle you want to remove ads from. You’ll see your Kindle’s email address, serial number, etc. There will also be a section that says, “Special Offers / Offers and Ads” — Hit edit there and click unsubscribe.

    Make sure your Kindle is connected to a network and has synced, then the ads will be gone! Instead you’ll see cool photos on your lock screen.

  • Taking a Day Trip to Joshua Tree from LA


    Photo courtesy of the National Park Service

    Are you visiting LA for a few days and want to get out to see Joshua Tree? Taking a day trip from Los Angeles to Joshua Tree National Park is completely doable as long as you plan ahead. Here is what you need to know.

    What you’ll need

    • A full day: Joshua Tree is 2–3 hours East of LA and you’ll want at least 5 hours to go through the park. Add in meals and you’ve used a full day.
    • A rental car: A car is the easiest way to get to the park and see things on your own schedule.
    • Water and snacks: The desert is very hot, so water is necessary and salty snacks will help replenish those electrolytes. We purchased a couple gallons for the car and refilled our water bottles before each hike. These things aren’t readily available in the park, so plan ahead.
    • Sunscreen: The sun is intense. Get some good sunscreen and reapply often.
    • Comfortable clothes and shoes: You’ll want to get out and do some hiking. Even if you only take short, established trails, good footwear and breathable clothes will make your day more pleasant. Take a light hat if you don’t want to burn your forehead like I did.
    Click here for a printable version of this map

    Itinerary

    Amanda and I took this trip last weekend. Here is the itinerary we used. Feel free to use it as a base!

    Mid-Morning: LA to Coachella Valley

    Leave LA by 8am. Grab some coffee and a breakfast sandwich on the road, and set your GPS for Palm Springs or Indio. Turn on some tunes and settle in for a 2–3 hour drive. Cross your fingers that LA traffic won’t be too bad.

    When you stop in Palm Springs or Indio, fill up your gas tank, pick up the water, sunscreen, and snacks if you haven’t already done so. Grab a quick sandwich if you are hungry because the park doesn’t have food.

    Make sure to wrap up any cell phone communications before driving into the park. There is pretty much zero reception in the park, so plan accordingly.

    Late-Morning: Cottonwood Spring

    Enter the park from the south entrance at Cottonwood Spring. There are a few cool things to do there:

    • Pick up some park merch at the visitor center.
    • Check out the wildflowers and cacti around the visitor center.
    • Drive down the road off to the right to Cottonwood Spring and do the short Mastodon Loop hike. You see some incredible views and the hike isn’t strenuous.

    Early Afternoon: Ocotillo Patch and Cholla Cactus Garden

    After your hike, hop back in the car and start driving north. Your first stop will be the Ocotillo Patch. These plants aren’t cacti, but deciduous shrubs. We saw hummingbirds visiting the flowers!

    After the Ocotillo Patch, drive a little further north to the Cholla Cactus Garden. This is a dense area of cactus with a nice walking path. Pick up a guide at the trail entrance to learn about all the different Cholla varieties.

    After admiring the Chollas, drive up to the White Tank campground. If you’ve been drinking enough water to stay hydrated, you’ll probably need to hit the restroom. There are primitive restrooms at most camping areas in the park.

    While at White Tank, take a walk around the rock formations. Arch Rock Trail is a short half-mile loop.

    This area is in the middle of where the park starts to transition from the Colorado desert environment to the Mojave desert environment. You’ll spot your first Joshua Trees around here!

    Mid-to-Late Afternoon: Scull Rock, Jumbo Rocks, Desert Queen Mine, Sheep Pass, and Hidden Valley

    After White Tank, drive a little further north, then turn West (left) at the main intersection toward Joshua Tree. There are a variety of things to do along this stretch of road:

    • Climb around Scull Rock and Jumbo Rocks
    • Admire the thousands of Joshua trees
    • Go down a dirt road and hike up to the Desert Queen Mine
    • Take a walk around Sheep Pass
    • Hike around Hidden Valley

    Take your time and take in the scenery. Have a few snacks between stops. This is one of the busiest areas of the park, but as long as you can find parking, you are just a short hike from solitude. We stopped many times along the road to admire cacti and Joshua trees.

    Late Afternoon: Keys View

    After a fun afternoon climbing on rocks and taking photos of Joshua Trees, hop back in the car and drive a few miles south to Keys View. It seems a little bit out of the way, but you get incredible views up here of the entire Coachella Valley. If you’ve timed your day correctly, you can admire the beginnings of a sunset from up here.

    Evening

    After Keys View, you can drive back to the main road and continue heading toward Joshua Tree and the park’s West entrance. Stop at Quail Springs for one last desert romp and then pull over to snap a few more photos of the incredible rocks as the sun is setting.

    As you exit the park from the west entrance, resist the urge to stop at the first restaurant you see in Joshua Tree. Keep driving west for a few more miles to Yucca Valley. There are a ton more food options here and they are less likely to be packed with tourists. You can also drop by the Walmart or Walgreens to pick up some aloe for your sunburn.

    Make sure you get the driver some caffeine for the journey back to LA. We expected it to take roughly two hours like on the way out, but we got caught in unexpected Sunday night traffic and it ended up taking three and a half hours to get back.

  • My WordPress Stack


    I’ve been building sites on top of WordPress and developing WordPress themes for the past five years. Here are the tools, hosts, themes, and plugins I use to build WordPress sites quickly and get the most out of them after they launch.

    Total Theme

    For the past two years, I’ve used the Total theme as the base I build off of. I’ve used more themes and theme frameworks than I can count, but Total is the one I keep coming back to.

    I chose the Total theme because it is highly configurable, it has solid documentation, includes a bunch of premium plugins, and it has tons of hooks and filters that you can use to add in custom programming. Pretty much everything in the theme is modular, so it can be quickly customized and reused without cascading effects.

    It is great to prototype with! All of the demos on the theme’s main site are built from the same theme with different configurations. You can install these demo options through the theme’s interface and build off of them. All of the customizations are able to be exported at JSON from the WordPress admin area, which makes it super easy to copy changes from staging to live.

    The custom post types Total has included for Staff, Portfolio, and Testimonials are super useful. I’ve expanded them to work for many things besides their traditional uses: job talent profiles, a collection of videos, a cocktail library, and book quotes.

    Here are some sites I’ve made using Total: Cook Like Chuck, AmandaKate.me, Nasty Design Co, MichaelMalice.com, RyanSosnow.skiArchived Link, The Commonwealth Partners, and Strong Roots NebraskaArchived Link.

    Plugins

    Here are the plugins that I use most often:

    • Jetpack: This is built by Automattic, the same company that builds WordPress. It has a ton of useful features. I use their stats, image galleries, image CDN, brute force protection, spam filter, CSS editor, Markdown support, and the desktop and mobile apps. All of these features are free, but they will also back up your site and give you access to support if you pay for it.
    • Visual Composer: This is the best WordPress page builder I’ve come across. I’ve used five different ones so far and this blows the other four out of the water. I also love that it has an API so that you can add your own features to it. It will work with almost any theme and it comes pre-loaded with the Total theme I mentioned above.
    • WP Super Cache: WordPress is pretty heavy on server resource use. One way you can cut down on that is with caching. If you are a server admin like Eric Davis and have direct access to Apache, you can tweak your Varnish settings. If you are on a shared host, you’ll need to install a caching plugin like WP Super Cache. This one is built by Automattic, the company that develops WordPress. The plugin builds static versions of your posts and pages, which are served directly to users instead of loading up the whole PHP engine for each pageview. Underpowered hosts and sites with heavy traffic will benefit most from this.
    • Page Duplicator: This plugin allows you to make exact copies of posts, pages, and custom post types. This is super useful when you want to keep the layout and custom field values you’ve created. I’m surprised it doesn’t come standard in WordPress.
    • Yoast SEO: This is the best plugin out there for technical search and social metadata optimization. The free version is more than adequate. This isn’t an SEO magic wand: 80% of SEO depends on having great content people actually want to consume.
    • Ninja Forms: This is very well designed, easy for non-technical people to use, and has a ton of extensions that allow forms you create to send data too the major tools you use.

    Development

    Development Environment

    I primarily develop on virtual machines to keep my work from affecting my main machine. If something screws up, I can just delete the virtual machine and start over.

    I use Virtual Box to run the VMs, Vagrant to manage them, and Laravel Homestead as my base development environment. WordPress’s famous five minute install instructions work perfectly on Homestead.

    Staging and Production Environment

    For large sites that I work on, I always make sure we have two separate environments running at all times: Staging and Production. The production site is the live one that customers access. The staging site is a copy of the live site where all major changes are applied and tested first (function additions, template changes, plugin testing, etc). The production site should never have code on it that hasn’t been tested on the staging site first. Hosts like WPEngine include a staging area with every install by default. On shared hosting services like A Small Orange or Bluehost, you’ll need to set up a subdomain install to act as your staging environment.

    IDE

    Coda by Panic is my IDE of choice. I’ve been using it since it first launched and I stuck through the major 2.0 (and subsequently 2.5) release. It has highlighting, remote editing and publishing (via FTP/SFTP/SSH), previewing, SQL connectors, Terminal, regex search, and git support built in. Tons of third party add-ons available. I’ve written AppleScripts for it and know most commands by heart, so I’m unlikely to jump ship any time soon.

    Use a Child Theme

    Whenever you make any code changes to a WordPress theme, you should always do them from a child theme. Child themes allow you to change functions and templates and still preserve changes when the base theme is updated. Here is a child theme for Total.

    Hosting

    For Low Traffic

    For low traffic sites, a shared hosting account is all you need. This means your site is hosted from a server that hosts multiple sites at once.

    I use A Small Orange. I host Cook Like Chuck, AmandaKate.me, Nasty Design Co, and a theme staging area all on one of ASO’s Small accounts, which I pay $50 a year for. I’ve had up to 100 distinct users on Cook Like Chuck at the same time without an issue (thanks, Reddit!). I’d probably feel comfortable up to 200-300 distinct users on an ASO site at the same time without sweating as long as things are properly cached (see plugins below). Anything more than that and you’ll want to jump to something like WPEngine.

    Never opt for the “Tiny” version at A Small Orange. It is on cheaper, slower infrastructure, which is why the price is so low. It probably won’t even handle up to 100 concurrent users.

    ASO has great customer service. They are always available, even in the middle of the night!

    For High Traffic

    For high-traffic sites, I use WPEngine.

    Praxis had a huge traffic surge at the beginning of March when Isaac Morehouse went on Tucker CarlsonArchived Link. At the peak of the surge, we had around 7500 concurrent users (i.e. 7500 different people hitting the site at the exact same time) and we had no decrease in performance on WPEngine. They aggressively cache and have super fast servers. Cook Like Chuck (on an A Small Orange Small account) would have crashed under that load, even with caching plugins.

    WPEngine also has great customer support. They don’t let you tweak caching settings yourself, but a support agent will take care of it for you in minutes.

    For the Server Admin

    If you want to build out your own hosting environment, tweak caching settings, set up load balancers, etc, you can build out your own WordPress hosting environment on Amazon Web Services.

    At eResources, we had a great experience with hosting high traffic WordPress sites on Rackspace. Their support is top-notch.

    Backups

    Hosts like WPEngine automatically make backup points every night. On shared hosts, I have a recurring task scheduled to download a backup every Friday. I keep weekly backups for a month and monthly backups for a year. I store these on an external drive that is synced up to Backblaze.

    Domains

    I use Hover for buying and managing domain names and most DNS management. I use Cloudflare for DNS management on domains that need SSL because I love their Flexible SSL plan.


    What are your favorite WordPress tools? Let me know in the comments!

  • The Afternoon Check-in

    On January 5, I started using Exist.io to rate each day from 1–5 and jot down a few notes about the day. The scale is pretty simple:

    • 1: Terrible
    • 2: Bad
    • 3: Okay
    • 4: Good
    • 5: Perfect

    At the end of the month I looked back at the data I collected and I was a little bummed to see that there were so many 2 (brownish) and 3 (yellowish android green) days.

    My Exist.io mood dashboard for January 2017. Brown is 2, yellowish green is 3, light green is 4, darker green is 5.

    I’ve always heard that your mood depends a lot on how you choose to interpret and react to situations. This means that we have a profound influence over moods, so I decided to take action and see how I can improve my mood ratings.

    Starting February 1, I took a moment to pause each afternoon and ask myself two questions:

    1. What is today’s mood rating so far?

    2. What can I do to increase or maintain that rating?

    Any time I found myself saying that today would be a 2 or a 3, I resolved to do whatever I could for the rest of the day to increase that rating to a 3 or a 4. If I thought today was a 4 or a 5, I resolved to spend the rest of the day doing things that would maintain that rating.

    Data scientists typically don’t like it when active viewers influence the outcome of their collected data, but this isn’t science. The goal here is to be happier, so intentionally influencing your mood data for the better is a good thing.

    The Results

    Over the next two and a half months, these two questions have eliminated the #2 (bad) days, decreased the #3 (okay) days, and increased the #4 (good) and #5 (perfect) days.

    Mood data from Exist.io. Yellowish green is 3, light green is 4, darker green is 5.

    Yes, there are still 3s on this chart. February in particular was a frustrating month. But every single one of those 3s were brought up from a would-be 2 that I intercepted with my mid-afternoon check-ins. This made February so much better than it would have been.

    How you can implement an Afternoon Check-in

    1. Subscribe to Exist.io or use your current favorite journaling/tracking system to rate you mood from 1–5 every day. You can even use a calendar for this. Something with the ability to see the overall trend is helpful.
    2. Set a reminder on your phone or a calendar alert for 3:30pm every day. When it goes off, as yourself these questions: What is today’s mood rating so far? and What can I do to increase or maintain that rating?
    3. When you encounter anything lower than a 4, write down three things you can do to improve that rating by the time you go to bed. When you encounter a 4 or 5, write down three things you can do to maintain that rating by the time you go to bed. The goal is to make a bad day better or to continue having a good day.
    4. Right before you go to bed, write down the final rating for the day and write down a few notes about the day.
    5. Review your ratings once every two weeks. If you aren’t seeing an overall mood improvement, it might be time to reassess and take a look at the underlying causes of stress, anxiety, and frustration in your life. Then make removing those things the focus of your afternoon check-in.

    Remember that you are in the driver’s seat of your own mood, not the passenger’s seat. Take the wheel.

  • The Afternoon Check-in


  • How to Hit Reset and Keep Going

    We’ve all been there: It is 4:30pm, our energy is low, we have at least four hours of work left to do, and we feel like giving up and taking a nap.

    In that moment, we must make a critical decision: Do we keep going and get our work done or throw in the towel, knowing we will pay the price later?

    If it were five hours earlier, the work would be no problem. A fresher, more energetic version of ourselves earlier in the day had what it took to knock this stuff out. The trick is to get back into that earlier state of mind.

    Here is what I do to hit reset and keep going:

    Change the body, change the mind

    “The difference between peak performance and poor performance is not intelligence or ability; most often it’s the state that your mind and body is in.” — Tony Robbins

    One of the things Tony Robbins talks about is the connection between your body and your mind. Your physical state has a huge impact on your mental state.

    When your mind is feeling in a slump, your posture is likely slumped over, too. Your breathing is probably shallow. If you change these two things, your mindset will shift, too.

    Here is the physiological checklist I go down when I’m feeling sluggish:

    • How is my posture? Stand up straight, move from the chair to the standing desk.
    • Do I need to roll my back? If my posture has been off for a few hours, I like to get out my foam roller and arch my back for 90 seconds and then roll it out for another 90 seconds.
    • How is my breathing? Am I breathing deeply enough? Do I need to do 2–3 minutes of box breathing? Try breathing in sync with this gif. Breath in, hold, breath out, hold, repeat.
    • Do I need to stretch? Try doing 30 seconds each of your favorite stretches.
    • Do I need to get my blood pumping? Try running some stairs, swinging a kettlebell, doing some burpees, or doing some old-fashioned jumping jacks.
    • Do I need to rehydrate? I’m terrible about drinking enough water. Sometimes I’m just dehydrated and need to drink a glass of water.
    • Do I need to do a power up? After reading Super Better by Jane McGonigal, I was sold on power ups: Little things that are easy to do and make you feel better. Mine are 1) Stretching my arms to the sky for ten seconds (physical) and 2) Watering and the house plants (emotional).
    • Do I need to take a cold shower? A cold shower will radically shift your state of mind. At the end of a normal shower, I like to turn the temperature as low as it will go and stand there for two minutes. It gets me ready to start the day. It will also pull you out of the fog of malaise.

    Get a change of scenery

    Sometimes working at the same desk all day just doesn’t work well for me. Being in a physically different place helps.

    • Try moving from your desk to a conference table. Or, if you are like me and both live and work in a small one-bedroom apartment, switch to your kitchen table instead of your desk.
    • Go work from a coffee shop. Getting out will be nice and and extra caffeine boost won’t hurt, either. I don’t have any good coffee shops within walking distance of me, so when I can’t take the time to drive to one, I go work from the local brewery. I have the wifi password and I order the lowest ABV % beer on the menu and nurse it. Always leave the bartender a hefty tip since you are taking up a seat.

    Sometimes a break is necessary. Just make sure the break is helping you reset instead of just prolonging the struggle.

    • Go for a walk. Sometimes a break is necessary. Just make sure the break is helping you reset instead of just prolonging the struggle. Going for a walk is more likely to get you in a better frame of mind than watching Netflix and surfing Facebook. While you walk, breathe in fresh air, take in some different sights and sounds, get your blood pumping, and let your struggles go for 15–30 minutes. You’ll come back ready to work.

    Remove distractions

    Our lizard brains love to be distracted by anything and everything. Removing them and making them harder to reach will lower the barriers to focus.

    • Put your cell phone out of reach. Mine sits on a table out of my normal reach while I’m working so that I don’t mindlessly surf Instagram all day.
    • Install a social media and news site blocker. I use WasteNoTime in Safari and Chrome.
    • Close email, Slack, and Skype. Keeping in touch is great, but sometimes you need to disconnect to get real work done.

    Get into work mode

    Think back to the last five times you’ve had to buckle down and get some work done? Is there something you do that signals “it’s time to work”?

    For me it is putting my headphones on and turning on Beaucoup Fish by Underworld. I only listen to this album when I’m working. I’ve done the same thing f0r the last 15 years. It has a Pavlovian effect on me now.


    Make a plan

    Now that your body is good to go, you’ve gotten a change of scenery, you’ve removed your distractions, and you’ve put yourself in work mode, it is time to make a plan to dig yourself out of this hole.

    • Pare your task list down to essentials. If you don’t have a task list, make one. Your tasks will seem must more doable once they are on paper and not just lurking around like monsters in your head. If you do have a task list already, put things into two categories: What absolutely needs to get done today? and What can actually be done later? Sometimes we think things must get done today, but in reality there will be no consequences if they are pushed to the next day. Figure out what must be done today so you can focus on that.
    • Figure out the best order to accomplish these items in. I’m a big fan of eating the frog (doing the most important and difficult thing first), but sometimes things need to be done in a specific order.

    Build momentum

    Take the first step, then the second, then the third. The whole journey is composed of simple steps.

    Once your list is made, take the first step to completing the first item. Then the second step. Then the third. Then the fourth.

    Once the first item is completed, don’t take a break to check your email. Keep your momentum rolling and take the first step on your second item. Then the second step. Then the third.

    Once a ball is rolling, it doesn’t stop easily. You’ve got this.

  • How to Hit Reset and Keep Going


  • My Setup and Tools

    I often get asked about what I use to get my work done. This post will be updated regularly with my current toolkit and setup.

    Last updated: April 11, 2017

    This list is broken into these major categories:


    Web Development

    Coda and TextWrangler

    Coda by Panic is my IDE of choice. I’ve been using it since it first launched and I stuck through the major 2.0 (and subsequently 2.5) release. It has highlighting, remote editing and publishing, previewing, SQL connectors, Terminal, regex search, and git support built in. Tons of third party add-ons available. I’ve written AppleScripts for it and know most commands by heart, so I’m unlikely to jump ship any time soon.

    TextWrangler is the text editor I launch if I just need to take a peek at something or quickly clean up some formatting. It is built on the BareBones engine and is ancient, but awesome.

    Virtual Box + Vagrant + Homestead

    I primarily develop on virtual machines to keep my environments separate. I use Virtual Box to run the VMs, Vagrant to manage them, and Laravel Homestead as my base development environment.

    Jekyll & WordPress

    This site is powered by Jekyll and cooklikechuck.com is powered by WordPress.

    A Small Orange, WPengine, and Amazon Web Services

    • This site is hosted on Amazon S3 and Cloudfront.
    • Most of my various WordPress sites are hosted on A Small Orange. On ASO, go with the Small version, not the Tiny version.
    • Praxis’s high-volume WordPress sites are hosted at WPengine.

    Hover and Cloudflare

    I use Hover for buying and managing domain names and most DNS management. I use Cloudflare for DNS management on domains that I need SSL on because I love their Flexible SSL plan.

    Homebrew

    I use Homebrew for package management.


    Desktop apps

    Backblaze & Carbon Copy Cloner

    I use Backblaze for my offsite backup solution and Carbon Copy Cloner with miscellaneous Western Digital and Seagate drives for my onsite backups.

    CleanMyMac and Hazel

    I use CleanMyMac once a week to clean out the junk that accumulates. I keep Hazel rules running constantly to automate organization on my Mac. The MacSparky Hazel Field Guide will teach you everything you need to know about it.

    1Password

    I use 1Password for secure password management. I’ve also tried LastPass and Dashlane, but nothing can beat 1Password, both in terms of security and easy of use. I’ve also use 1Password for Teams and it works just as well.

    TextExpander

    TextExpander has radically changed the way I work. If you ever type something more than once, make a snippet for it and save your keystrokes. I also launch scripts and templates from a few keys with this tool. We also recently adopted it at Praxis to keep our customer service answers consistent across staff members.

    Raindrop.io

    I’ve searched for years for good bookmark management. Raindrop.io is exactly what I’ve been searching for. I dropped Pocket and Instapaper entirely in favor of this.

    Private Internet Access

    We all need a good VPN, both for privacy and for development QC testing. I’ve been using Private Internet Access for the past four years and am happy with it.

    Setapp

    Setapp is a subscription tool for Mac apps. $10 a month gets you access to a ton of great apps. Here are the apps I regularly use from the Setapp bundle:

    • Paste
    • Gifox
    • CleanMyMac
    • Gemini
    • Marked
    • CodeRunner
    • Expressions
    • Sip
    • Squash
    • Ulysses
    • Blogo
    • SQL Pro Studio
    • Forecast Bar
    • Be Focused
    • Capto
    • Base
    • Unclutter

    Miscellaneous macOS apps

    • Flycut for clipboard management
    • Sip for color picking and management
    • Bartender for menu bar organization
    • Little Snitch for monitoring my computer’s network traffic and Micro Snitch for monitoring microphone usage.
    • Unclutter for taking quick notes
    • Spark for desktop email
    • RescueTime for app usage statistics
    • iA Writer for general writing. I almost always write in Markdown and export to HTML or PDFs.
    • Amphetamine is the app I use to keep my Mac awake. I use this over Caffeine because it has more triggers and automation options.
    • Screenshot PlusArchived Link for taking screenshots, automatically uploading them to Dropbox, and then copying the URL directly to my clipboard.

    Browser Extensions

    I use Safari, Chrome, and Firefox on a daily basis for browsing and testing. Here are plugins I use that make my life easier:

    • Hubspot Sales for email open tracking in Chrome
    • What Font? for font identification in Safari and Chrome
    • Ghostery to prevent tracking in Safari and Chrome
    • AdBlock to block ads in Safari and Chrome
    • Wappalyzer to identify web technologies in Chrome and Firefox
    • DownThemAll for bulk file downloading in Firefox

    Hardware

  • Adding Full Width Front Page Widgets to Genesis Themes

    The Genesis Framework is super useful out of the box, but what if you want to color outside the lines?

    Two weeks ago my coworker Derek Magill asked me to take a look at this awesome full width box on GrooveHQ’s website that has a testimonial box on one side a video on the other. This goes edge-to-edge, which means that it is impossible to make in most Genesis themes out of the box.

    GrooveHQ Video Testimonial Box

    The Solution

    We want this to display on the front page, which means it needs to be a front page widget. I prefer hardcoding as little design details as possible in order to leave things as flexible and as reusable as they can be. This means that that architecture decision I chose is to not build the widget with dedicated area for the testimonial and video, but to just make the widget span the width of the full window instead of being constrained to the container. Everything else is going to be handled by HTML and Javascript inside the widget. That way we can reuse the full width widget for something else later if we no longer want the video.

    1. Register the widget area

    In WordPress, you register things inside functions.php. Make sure you do it in your child theme, not the main Genesis parent theme. Since Genesis typically comes pre-loaded with 5 widget areas, I opted to give this one the ID front-page-6. You can choose whatever you want, but make sure you carry the same ID all the way through:

    genesis_register_sidebar( array( 	'id'          => 'front-page-6', 	'name'        => __( 'Front Page 6', 'showcase' ), 	'description' => __( 'This is the 6th section on the front page. It is full-screen.', 'showcase' ), ) ); 

    2. Output the widget area on the front page

    In Genesis themes, the front page template is usually named front-page.php. This is where we’ll be putting this snippet. Find where the other front page widgets are output and add your new one in where you want it. Remember that in hard coded theme templates, the order matters. If you want it before all the other widget areas, you need to put the code that runs it first.

    A normal widget area that doesn’t go full width would look like this:

    genesis_widget_area( 'front-page-6', array( 	'before' => '
    . showcase_widget_area_class( 'front-page-6' ) . '">', 'after' => '
    '
    , ) );

    But if you want to remove the padding around the edges of the widgets that keep them vertically in-line with the rest of the content, you’ll need to remove the

    and one of the closing

    tags. Also remove the flexible-widgets class.

    genesis_widget_area( 'front-page-6', array( 	'before' => '
    . showcase_widget_area_class( 'front-page-6' ) . '">', 'after' => '
    '
    , ) );

    3. Add the classes you created to your theme’s style.css

    Here is what I opted to add:

    .front-page-6 {   background-color: #d64745;   color: #fff; }  .Aligner {   display: flex;   align-items: center;   min-height: 24em;   justify-content: center; }  .Aligner-item {   flex: 1; }  .Aligner-item--top {   align-self: flex-start; }  .Aligner-item--bottom {   align-self: flex-end; }  .Aligner-item--fixed {   flex: none;   max-width: 70%; } 

    I took the flexbox aligner styles from Philip Walton’s Github. I started using CSS back in version 1, so I’m still not used to this flexbox voodoo.

    4. Add the content to the front page widget

    The widget won’t become active until content there is a widget added to it. If you are going to put HTML and Javascript in it, choose a Text widget. Paste your code in there. Here is what I cooked up for our video testimonial box:

     class="two-fifths first Aligner">    class="Aligner-item Aligner-item--fixed">     

    Diana loves Praxis. Here's why...

    "Praxis gave me the skills and experience needed to run a sales team at the age of 18, when the rest of my peers were sitting in classes."
    class="three-fifths">Responsive video embed here

If you are looking for a great video hosting platform with a ton of options (like responsive embeds and private access), check out Wistia.

The Result

This isn’t ready to go live on the site yet because we are working on new videos to put in the block, so here is a screenshot with demo content. You’ll notice that I made the video a little larger than the text box (2/5 vs 3/5) because I wanted the focus to be on the video.

Diana's demo full width video testimonial box

  • Moving your Jekyll Site to Amazon S3 and Cloudfront with Outside DNS

    If you are using a static site builder like Jekyll, Amazon S3 is one of the cheapest hosting solutions around. To speed up delivery time for a little extra cost, I recommend using Cloudfront in front of S3.

    A few months ago I decided to serve my static assets from S3, but yesterday I decided to take the full jump. Here is what I did to make the move.

    This full guide will be most useful for static sites on existing hosting solutions that you are moving to AWS while using outside DNS services. This guide uses s3_website, Amazon S3, Amazon Cloudfront, and a non-Amazon DNS service.

    If you are setting up a site from scratch, use Amazon’s guide instead.

    0. Back up your stuff

    The steps below worked for me, but I can’t guarantee everything will work for you. Back up your stuff so you can roll back. You’ve been warned.

    Really, before you make a mistake and mess a bunch of stuff up, make sure you have a back up of everything:

    • Your local Jekyll site
    • The content on your existing webserver
    • Screenshots of your current DNS settings

    1. Set up your AWS account

    Set up an account at Amazon Web Services.

    2. Download and configure s3_website

    s3_website is a very useful tool for automatically setting up buckets on S3 and a Cloudfront distribution to host a static site. It also helps easily deploy updates to your static site with a few commands.

    Follow the tool’s instructions on Github.

    • Run s3_website cfg create. This generates a configuration file called s3_website.yml.
    • You’ll need to make an AWS user for the tool with access keys and set your configurations in the s3_website.yml file.
    • Run s3_website cfg apply. This will configure your bucket to function as an S3 website. If the bucket does not exist, the command will create it for you. When you run this, it will ask you whether you want to deliver your website via CloudFront. If you answer yes, the command will create a CloudFront distribution for you.

    Handling non-Jekyll content

    If you have content on your webserver that doesn’t exist in your Jekyll site, you’ll need to set some extra configurations for those things in the s3_website.yml. For example, I serve a bunch of PDFs that are separate from my actual Jekyll instance. If you do, too, make sure you take advantage of the ignore_on_server section of the configuration. Make sure to uncomment it (remove the # in front of it) and list the folder paths from the root that you want the tool to ignore on the server. Otherwise folders not on this list and not in your Jekyll site will be removed.

    I added these:

    ignore_on_server:   - justanswer   - illum 

    Reminder: Don’t use tabs for formatting in YAML files. Use spaces.

    3. Deploy your website using s3_website

    Run a new build on your Jekyll site: jekyll build

    Then, push up to the AWS environment: s3_website push

    Don’t worry, even though the s3_website.yml gets added to your _site folder, it won’t get uploaded to S3. The tool skips it. I triple checked this because I didn’t want to publish my access keys online.

    Wait 15 or 20 minutes for your site to propagate across Cloudfront (the Cloudfront dashboard shows the propagation status.) Once it does, check your Cloudfront domain (or public S3 domain if you aren’t using Cloudfront). The s3_website tool gives you both domains during your initial setup, or you can always get them from your AWS console at any time. For example, my Cloudfront domain for this site is d27zm8z2abfvhn.cloudfront.net and my S3 domain is http://cagrimmett-jekyll.s3-website-us-east-1.amazonaws.com.

    Check the domains and make sure everything seems to be live and working correctly.

    4. Add your own domain to Cloudfront or S3

    First, add your domain, including the www, as a CNAME on your Cloudfront distribution. This allows Cloudfront to serve requests to this domain once it is point there. This is the easy part.

    Pointing your domain at Cloudfront without using Route 53 as your DNS provider

    I have a bunch of DNS records on cagrimmett.com, so I didn’t want to migrate my DNS over to Amazon’s Route 53. That means I had an hour of trial and error (as well as a consultation from my friend Eric DavisArchived Link) figuring out how to get things to work. Also, the typical A record pointing won’t work because the IP addresses to Amazon’s servers change regularly.

    The solution we settled on is: CNAME the www subdomain to Cloudfront and forward all cagrimmett.com requests to www.cagrimmett.com.

    To CNAME your www subdomain to Cloudfront, just log in to your DNS service and add a new CNAME record for www (or change the existing one if you have it) and point it to your Cloudfront domain, which is the one that looks like this: d27zm8z2abfvhn.cloudfront.net.

    You have two options for forwarding non-www requests to the www subdomain:

    A) If you aren’t using your domain for anything except this site, you can use your DNS service’s domain forwarding tool if it has one. Set it up to forward domain.com to http://www.domain.com. Note: If you are using your domain for anything else or if any subdomains point to the @ record, don’t use this option. I tried this and took down my other sites, which are served from subdomains of cagrimmett.com.

    B) Use Apache or nginx to rewrite requests. This means that you still need your original hosting, but it will only be used to rewrite your domain requests. This isn’t an issue for me because I still need my hosting to serve cooklikechuck.com, amandakate.me, and my dev and staging areas for WordPress development. This option isn’t ideal, and definitely not what I would have designed from the beginning, but I don’t want to burn everything down and start over. So Apache it is. Here is what my rewrite rule looks like in my .htaccess file:

    RewriteEngine On RewriteRule ^(.*) http://cagrimmett.com/$1 [QSA,NC,NE,R,L] 

    This takes any non-www requests and rewrites them to the www subdomain, preserving the whole query string, making sure existing links to your content around the web don’t break.

    Wait an hour for all changes to take affect and you should be good to go!

    5. Deploying updates

    Since we used s3_website, deploying updates and new posts to your site will be super easy:

    Navigate to your Jekyll site folder and build your Jekyll site: jekyll build

    Then push up to the AWS environment: s3_website push

    That’s all!

    A note on SSL

    I opted to not use SSL for my site right now because there are a ton of extra steps and extra cost involved. I’ll probably revisit this later when Google starts penalizing non-secure sites, but for the time being I’m sticking with plain http. I’m not collecting any user-submitted data.

  • 3 Lesser-Known Hubspot Tools

    Hubspot is an easy-to-use marketing and sales CRM. It is a lightweight alternative to Salesforce and Microsoft Dynamics that has a ton of marketing and sales functionality.

    This week I dug in to it and found some lesser-known features:

    What if your workflow involves emailing contacts to get them to fill out a form, like an Application form? It is annoying for the user to fill out information you clearly already have, such as Name and Email Address. Smart Forms are a partial solution to this problem, but don’t work if people fill out one form on their computer and another on their phone three days later.

    After some digging, I found out that Hubspot allows you to assign information about your contact to variables and append them as query strings on URLs.

    This means you can set up email templates to make it unnecessary for your customers to type information over and over. Awesome.

    Any time you drive someone to a form via email, you should use query strings to automatically fill things for them.

    COS URL redirects

    Hubspot’s Content Optimization System (COS) is essentially a landing page and content platform hosted on Hubspot. You usually set it up on its own domain or subdomain and it is useful for tracking user interactions. Let’s say you are no longer using a COS page, but it is linked somewhere and people keep hitting it. What do you do?

    I found the solution buried a few levels deep into the Marketing platform. There is a URL redirect tool built in.

    Leverage connections to other apps via Zapier

    Hubspot connects with Zapier, so it connects automatically with 750+ apps. New contacts, contact updates, calendar tasks, social media messages, and form submissions can kick off workflows.

    For example, you can:

    • Text someone a download link after they fill out a form
    • Pipe notifications of new sign ups or form fill-outs to Slack so you know about them
    • Copy contacts over to Google so you can make a personal email contact
    • Sync Hubspot lists with Mailchimp
    • Copy Sumo leads over to Hubspot
    • Add sales customers from Shopify or Stripe to your Hubspot contact list
    • Create Hubspot contacts from Facebook Ads Leads
    • Create tickets in Zendesk from Hubspot forms
  • At Praxis, Commitments Are Better Than Rules


  • LER on Light


    There is but one cure for ignorance: enlightenment! Lesser treatments, such as ‘selling the masses,’ political activism, and the like, are an utter waste of time; as well try to bring daylight by cursing the darkness!” (To Free or Freeze, p. 18)

  • The Great American Road Trip

    I got the chance to spend a week driving from coast to coast with my parents last summer. We started just north of Seattle, took Route 2 across Washington, Idaho, Montana, North Dakota, Minnesota, and Wisconsin, then went across the UP and drove down through Michigan, then across Ohio and Pennsylvania on I-80 to NYC.

    The route we planned. We deviated slightly on where we stopped.

    Day 1: Bellingham to Coeur d’Alene

    We left Bellingham after meeting a friend for an early lunch and decided to cross Washington all in one day. It went like this: The Cascades, apple orchards, then endless wheat fields. Somewhere in the middle of apple country we found an awesome burger shack and decided to stop for dinner. The cheeseburger and a banana shake hit the spot.

    We thought we’d drive to Spokane and just Priceline a hotel when we got there. Rookie mistake. Since it was the summer season and there was an unforeseen issue at the airport that grounded all flights, literally every hotel within 50 miles was booked. Even the casinos were booked. Thankfully, some gracious friends from college, the Herseys, offered to let us stay with them an hour away in Coeur d’Alene, ID.

    Days 2–3: Coeur d’Alene to Glacier & Waterton

    The first thing we did the next day was book hotels for the rest of the trip. We weren’t going to get lucky with nearby friends while going across the plains. We then took a leisurely route through the mountains to get over to Glacier National Park. We explored Lake McDonald, the Trail of the Cedars, and Avalanche Creek.

    The next day we got up early, went across Going To The Sun Road, and drove up to Waterton, Glacier’s sister park in Canada.

    The drive took longer than expected, so I had to sprint to buy us tickets for the boat tour of Upper Waterton Lake. It was well worth it. We saw some incredible scenery and caught a glimpse of a momma black bear and her cubs. I got a proper sunburn, got my shoes wet, and took hundreds of photos. A good day, all in all.

    Upper Waterton Lake

    Day 4: Glacier to Minot, ND

    We got up early, drove around the southern edge of Glacier, saw a moose, and settled in for a long drive across the plains. We set Minot, ND, as our destination for the day, which was a 15 hour drive across hot, dry, flat, featureless land. Thank goodness for podcasts! Lunch options were slim, so we found a grocery store and bought stuff for sandwiches, which we assembled and ate in the parking lot.

    Dinner options were slim, too. The plains are an empty place. We had dinner at The Taco Shack in Glasgow, MT, the only town we saw for hours. I got their special, “The Emmet”: a plate of tater tots covered in taco meat and cheese.

    The look on my parents’ faces pretty much sum it up.

    Day 5: Minot, ND, to Marquette, MI

    After a short night of sleep (we arrived late in Minot), we got back on the road and made for Marquette, MI. After about an hour and a half on the road, we cruised through Rugby, ND, and made a quick stop at the geographical center of North America.

    The geographical center of North America is in the middle of a parking lot.

    I had to work for the last four days of the trip, which was challenging. I got up early, stayed up late, took phone calls at rest areas, and answered emails in the back seat when I wasn’t driving.

    We stopped at Duluth TradingArchived Link in Duluth, MN, then kept on trucking. I was exhausted by this point, so all I remember is 1) how many bugs hit our windshield in the UP and 2) how flat the UP is. I expected it to be more hilly for some reason. We rolled in to Marquette around 1:30am and passed out immediately.

    The next morning, we realized that there were so many bugs splattered across the windshield that we had to wash it at the next gas station.

    Day 6: Pictured Rocks to Cleveland, via Zingerman’s

    We had planned on spending the day exploring Pictured Rocks and the Sleeping Bear Dunes, stay the night up there, and drive to Cleveland the next day, but we were so exhausted that we opted to skip the dunes and drive to Cleveland that day. We took our time around Pictured Rocks, then I shot a hyperlapse of going across the Mackinac Bridge and we cruised all the way down to Zingerman’s in Ann Arbor for dinner. After stuffing our faces with fantastic sandwiches, we drove the last two hours back to the Cleveland area.

    The Muffaleo at Zingerman’s

    Days 7–8: Cleveland to Yonkers

    I stayed at my parents’ house for two nights, which was just enough time to visit with family and get my favorite pizza.

    Left: Dad drawing with my goddaughter. Right: Yala’s Pizza.

    I took I-80 across Pennsylvania back to NY by myself on day 8, completing the trip. I’ve taken that 8 hour trip dozens of times over the past 5 years, but after driving 12+ hours a day for the previous week, I was ready to get out of the car. I didn’t even take any photos!

    Tips for planning your own trip

    • If you plan to do a trip like this, Road Trip USA has a great guide that you can use as a starting point.
    • Make sure you build in rest time along the way.
    • Get off work entirely. Juggling deadlines while driving is stressful.
    • Take snacks.
    • Get fuel when you can. The plains are desolate.
    • Book hotels in advance so you don’t get stuck somewhere.
    • To document the trip, make sure you do something fun like shooting little video clips or doing panoselfies (our medium of choice) along the way.
  • The Great American Road Trip


  • Do More. Improve on it. Repeat.

    Do you want to be on top in your field? The bar is lower than you think, but few people even attempt to jump it. They will talk about jumping over it, but when it comes time for them to make the leap, they step back.

    You don’t have to be smarter than your peers, start out with more money than the other people in your class, or have better tools than the competition.

    You just have to be more persistent than them. Show up and do the work every single day. Keep pushing forward when others stop.

    Attributing success to luck is an excuse we tell ourselves. Saying, “You are lucky to have made that huge sale!” ignores the reality that sales are more likely to happen when someone puts in the work to generate and follow up with leads.

    Whatever it is you want to be the best at, go out and do more of it. Take it a day at a time. Move forward in a meaningful way each day.

    It takes a lot of work. Determination won’t be enough. You’ll need to build habits and design systems that keep you on track. On the days when you are sick, didn’t sleep enough, and just don’t feel like doing it, you’ll need routines to turn to that allow you to keep moving forward.

    What you have going for you is that very few people are willing to do this. If you actually show up, push through, and ship more work than everyone else, you’ll be surprised at how much easier it is to reach those rungs above you on the ladder.

    It doesn’t matter whether you are a manual laborer, financial analyst, server at a restaurant, executive, budding author, carpenter, or musician. The path to the top is the same:

    Do more. Improve on the things that don’t work. Repeat this process every single day.

    • Build more apps. Streamline their architecture and increase your user base.
    • Write more blog posts. Tighten up the language and work on your SEO.
    • Paint more paintings. Become more efficient with your brush and find the best paint.
    • Stock more shelves. Optimize the order in which you stock items in your section.
    • Take more photos. Improve your framing and use of light.
    • Fix more cars. Repair each transmission with fewer steps. Leave your shop cleaner than it was the day before.
    • Shovel more manure. Optimize the size of each scoop to minimize the strain on your muscles. Learn the best way to fill each wheelbarrow.
    • Follow up with more leads. Figure out what language works the best and which channels they are coming from.
    • Cook more meals. Be more creative to make the most of what you have on hand. Learn how to clean as you go.
    • Brew more beer. Make each batch taste a little better than the last one.
    • Build more tables. Refine the edges and cut each board with more precision than the last.
    • Write more journal articles. Refine your arguments and provide more proof.
    • Make more sales calls. Keep improving those introductions and do more research on each lead.
    • Play more chords. Improve your timing with each play-through.
    • Market in more channels. Cut the weak ones and double down on the strong ones. Test new channels each week.
    • Run more miles. Cut one second off of your route each time you run it. that is less time than it took you to read this bullet point.
    • Wait on more tables. Improve your people skills to get more tips and repeat customers.
    • Clean more bathrooms. Become a little more efficient each day.
    • Write more content. Improve your wording, explain things better, and make it a better fit for your audience.
    • Throw more pottery. Work on your trimming precision and the steadiness of your hand.
    • Make more cocktails. Memorize the recipes, learn which tastes work well together, and work on getting your proportions right without measuring.
    • Read more books. Take better notes, read faster, and work on your retention and recall.
    • Create more videos. Work on your timing, transitions, angles, and lighting.
    • Plant more seeds. Learn which depths, soils, temperatures, and weather conditions lead to the best crop, then double down.
    • Deploy more code. Be more efficient with CPU and memory usage, minimize the number of bugs you ship, and improve your automated testing.
    • Write more songs. Improve your melodies, word play, and length.
    • Install more cabinets. Improve the fluidity of each hinge. Sand each rough edge more judiciously.

    Get the picture?

    You know what you need to do. Stop wishing you were doing it and go out and do it. The only thing standing in the way is you.

    These ideas aren’t original, but they are worth repeating. The ideas in this post came from listening to a Design Matters podcast with Seth Godin, chatting with Isaac Morehouse, watching a Gary Vaynerchuk video, talking with my Dad, and observing Derek Magill.

  • Do More. Improve on it. Repeat.


  • How to Serve Static Website Assets from Amazon S3


    Earlier this week I looked at my web hosting’s usage stats and decided that I needed to move a bunch of static assets (mostly PDFs) somewhere else because they were eating my available bandwidth. A bunch of hot links around the web caused some usage spikes.

    I’m a firm believer in learning by doing, so I decided to use this opportunity to learn a bit about Amazon Web Services and set up an S3 bucket from which to serve my static assets. To my surprise it took less than an hour to get everything up and running.

    This guide is for people who want to use S3 to host some static files to lower their hosting costs. If you want to host your whole static site (Jekyll, Hugo, etc) on S3, follow this guide. If you are using WordPress and want to host your images on S3, follow this guide instead.

    Setting up S3

    Set up an account with the Free Tier. If you are getting a decent amount of traffic, you’ll quickly run over the free limit of 5 GB of Standard Storage,20000 Get Requests, and 2000 Put Requests. It took me about a week to pass it up. Thankfully, S3 is much cheaper than paying for additional bandwidth on A Small Orange, so I’m still ahead.

    One note that I’ll expand upon later: By checking the logs, I discovered that the majority of the hits are coming from 5 IP addresses that all resolve to Cloudflare. I have Cloudflare running on my site for caching and SSL, which means they regularly crawl my site and cache the assets. This ate through my Free Tier limits in just one week. If you use Cloudflare for caching, I suggest turning it off unless you know you need it.

    Create a new bucket. The region mostly doesn’t matter unless you know that the bulk of your traffic comes from one place. If it does, pick the closest region. Make sure you enable logs when it prompts you. This will be useful for tracking & analytics later.

    Uploading Assets

    Now that you have your first bucket, it is time to put stuff in there. If you have a local backup of your website (and you should), identify the directories where you store static content like images, PDFs, HTML, CSS, Javascript, etc. No files ending in .php or .rb – those are server side files that can’t be executed on S3.

    You can upload straight from the browser or you can set up access keys to connect via a file transfer client. I use Transmit for my file transfer needs, but CyberDuck is a good free alternative. Both have options for connecting to S3 buckets.

    When you upload files, try your best to keep the same folder structure from your website root. That will make writing redirects to S3 easier.

    Once you’ve uploaded some files, make sure you can access them through the browser by setting the permissions to Public. You can do this on a file-by-file basis or by selecting all of your files, clicking the “More ↓” dropdown, and clicking “Make Public”. Now verify that you can reach your asset by going to http://s3.amazonaws.com/[YourBucketName]/[filepath]. For example, my website’s avatar is available at http://s3.amazonaws.com/cagrimmett/img/avatar.png

    If that worked, your assets are now available on S3. Now it is time to redirect traffic to them.

    Redirecting Requests

    I’m assuming here that your server is using Apache and you have access to your .htaccess file. If you are using IIS instead, refer to this.

    Remember, always make website backups before doing anything that some guy on the internet tells you to do.

    Here are the rewrite settings I’m using in my main .htaccess file:

    RewriteEngine On RewriteRule ^justanswer/(.*) http://s3.amazonaws.com/cagrimmett/justanswer/$1 [QSA,NC,NE,R,L] RewriteRule ^img/(.*) http://s3.amazonaws.com/cagrimmett/img/$1 [QSA,NC,NE,R,L] RewriteRule ^static/(.*) http://s3.amazonaws.com/cagrimmett/static/$1 [QSA,NC,NE,R,L] 

    Here is what each line does:

    • RewriteEngine On – Turns on the ReWriteEngine so we can use it.
    • RewriteRule ^justanswer/(.*) http://s3.amazonaws.com/cagrimmett/justanswer/$1 [QSA,NC,NE,R,L] – Takes any request to any file in http://cagrimmett.com/justanswer/ and forwards that request to http://s3.amazonaws.com/cagrimmett/justanswer/. Since I kept my folder structure, this works perfectly. The other two entries are similar. – QSA = Query String Append – NC = No Case – NE = No Escape – R = Redirect – L = Last – More info here: https://wiki.apache.org/httpd/RewriteFlags

    After I turned it on, I gave it a few minutes to update and then checked my site. When I right clicked to open images in a new tab or tried to download an existing PDF, I got forwarded to AWS! Success!

    Tracking & Analytics

    If you enabled logging back in the setup step, you can plug in some third party tools to parse the logs into useful analytics. I’m currently trying out two tools: S3Stat and Qloudstat.

    Pros/cons:

    • S3Stat is designed better and easier to use than Qloudstat.
    • Qloudstat is cheaper than S3Stat for small-time use.
    • I prefer using S3Stat, but right now I can’t justify spending $10/mo on it when there are other options.
    • I might roll my own with one of the many log parsing scripts on Github and my knowledge of D3.js. We’ll see.

    Questions? Issues?

    First, check out the docs.

    If you still have questions or run into issues, drop a comment below and I’ll get back within a few days to help.