WP-CLI live presentation, like a pro

I recently gave a talk about WP-CLI at WordCamp Israel 2016. I thought it would be interesting to actually demo WP-CLI in real time, rather than use boring slides.

I used OS X split screen mode, with a terminal window on one side, and a browser on the other showing the site I’m creating and editing:

The tricky part was to not have to type the commands I wanted to demo (which would be boring, and slow). Luckily, I’ve found doitlive, which takes a bash script and types the commands in a simulated window.

By default doitlive echos the characters one by one: the presenter just has to type randomly on his keyboard (like a Madman!).

But I wanted to be able to move on stage, and control the presentation using a remote. So I set doitlive’s speed option to a large number, and each command appeared with a single key press. I still needed a return to execute the command, a key not present on my remote. I worked around this by using TextExpander to replace ‘b’ (from the ‘Black Screen’ button) with a newline.

The result: each command required just two button presses. (The truth: I forgot to turn on TextExpander,  so I had to go back to the lectern for every single command. Bah.)

Some tips that might help if you’re planning to do something similar:

  • Use the `-g` param when opening a url in the browser to keep the focus on the terminal window
  • Write a cleanup/prep script that sets up your environment the way you need it before the demo (empty the db, delete or rename files, etc)
  • Rehearse. A lot. This is true for every presentation, but is a must with live demos.

Here’s the script I’ve used, split into commented sections. I’ll link to the video once it’s up on WordPress.tv.

#doitlive shell: /bin/bash
#doitlive prompt: l33t {r_angle.red}{r_angle.yellow}{r_angle.green}
#doitlive commentecho: true
#doitlive speed: 1000
cat name.txt
cat wp-cli.txt
open http://wp-cli.org -g
clear

open http://wpcli.dev -g

#Download
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

# Permission and move to path as 'wp'
chmod +x wp-cli.phar

sudo mv wp-cli.phar /usr/local/bin/wp

# Test
wp --info
wp
cd mdocs
mv index.html index.old
clear

wp core download

ls -l

open http://wpcli.dev -g

wp core config --dbname=wpcli --dbuser=root --dbpass=root --dbhost=localhost --dbprefix=wpcli_

cat wp-config.php

wp core install --url="http://wpcli.dev" --title="WP-CLI Demo" --admin_user=yoav --admin_password=mypassword --admin_email=yoav@farhi.org

open http://wpcli.dev -g

wp core language install he_IL --activate

open http://wpcli.dev -g

wp core update

wp core language activate en_US

clear
wp option update blogname "l33t wp-cli demo"

open http://wpcli.dev -g

clear
wp package install aaemnnosttv/wp-cli-http-command

wp package list

clear
wp http get https://wpcom-themes.svn.automattic.com/demo/theme-unit-test-data.xml --scheme=https > theme-unit-test-data.xml

wp import theme-unit-test-data.xml --authors=create

wp plugin install wordpress-importer --activate

wp import theme-unit-test-data.xml --authors=create --skip=attachment

open http://wpcli.dev -g

clear
wp option get sticky_posts

wp option update sticky_posts [] --format=json

open http://wpcli.dev -g

clear
wp post generate --count=2

open http://wpcli.dev -g

clear

wp http get http://loripsum.net/api/5 | wp post generate --post_content --count=1

open http://wpcli.dev -g
wp search-replace Lorem WordPress

open http://wpcli.dev -g

clear

wp scaffold child-theme wpcli-child --parent_theme=twentysixteen --author="Yoav Farhi" --author_uri=http://yoav.fr --activate

ls -l wp-content/themes/

ls -l wp-content/themes/wpcli-child

cat wp-content/themes/wpcli-child/style.css

open http://wpcli.dev -g

wp scaffold _s wpcli_s --theme_name=wpcli-s --author="Yoav Farhi" --sassify --activate

ls -l wp-content/themes/

ls -l wp-content/themes/wpcli_s
wp theme list

wp theme activate twentyfourteen

open http://wpcli.dev -g

clear
# wp plugin

wp plugin list

wp plugin install jetpack --activate

wp jetpack

wp jetpack module list

clear
wp export

wp db export l33t-backup.sql

clear
wp core multisite-convert

mv ms-rewrite-rules.txt .htaccess

wp site create --slug=msdemo

open http://wpcli.dev/msdemo -g

wp theme activate twentyfifteen --url=http://wpcli.dev/msdemo

open http://wpcli.dev/msdemo -g

clear
nano example-command.php

mkdir wp-content/mu-plugins
cp example-command.php wp-content/mu-plugins/

wp example hello "Wordcamp Israel 2016"

clear
cd ../

cat thankyou.txt

# Thanks for following! Questions?
# Typed using doitlive http://doitlive.readthedocs.org/

Download the full script.

Trigger actions on OS X using NFC on Android

Having recently started using a treadmill desk, I wanted to automate actions on OS X as I switched from the regular desk to the treadmill. For example, turn on Bluetooth, switch the audio output device, etc. Sure, I can do that by creating an Automator script I’d run somehow, but I was curious to see if I could make it happen just by placing my phone on the treadmill desk.

Here’s how I do that using a few apps and utilities.

Requirements:

Setup

IFTTT

  1. Connect to the Maker and Dropbox channels.
  2. Note your Maker channel secret key
  3. Create a recipe with Maker’s receive a web request trigger and Dropbox’s create a text file action. You can use this recipe as a template. The file name’s and contents don’t matter. Choose a meaningful event name.
  4. Test your maker trigger url in the terminal with
    curl -X POST https://maker.ifttt.com/trigger/{event}/with/key/{key}
    

Android

  1. Launch Trigger and add a new task.
  2. Add an NFC trigger and (in the following screen) any applicable restrictions.
  3. Add an action, and select “Open a URL/URI” under Applications & Shortcuts.
  4. Enter your trigger url, and mark “Open in background”.
  5. When prompted, program your sticker.
    Note: I’ve tried placing the sticker on the mac itself, but that didn’t work. I’m guessing there’s too much RF interference.

    This slideshow requires JavaScript.

OSX

Setup Hazel as follows:

  1. Add your new dropbox sub folder (in ifttt/maker/event_name, by default) to the Hazel folder list
  2. Add a folder rule for new files (see screenshot below). Add any actions you’d like to run: I move the file to the trash, and run an embedded shell script to launch some apps and command line utilities.
    SyF1T9pgqu-3000x3000

That’s it! Every time you’ll place your phone on the NFC sticker, it’ll make an HTTP request, which will cause a file to be created in a dropbox folder. After the brief sync delay, Hazel will recognize the file and launch any actions you’ve told it too.

 

From Runkeeper to Runtastic

I started running a few months ago, with Runkeeper as my running app. The UI made sense, the audio cues were useful, and I liked the fact that friends were using it too and sharing their efforts.

Yet, too often my runs appeared like this:

Screen Shot 2015-11-25 at 12.24.13.png
I can run on water

I’m inclined to blame the phone’s GPS, but I expect the app to be smart and average my position to figure out I didn’t make impossible jumps across the lake. This was especially confusing during runs when I was doing intervals.

After I’ve tested a bunch of the other available apps (Map My Run, Endomondo, Nike+ Running, Strava, and more), I’ve chosen Runtastic Pro, and I’m really happy with it. Not only has the GPS data been flawless, it also supports HR zones alerts which Runkeeper lacks.

While slightly more complex, Runtastic feels much more powerful too – it’s super configurable, and has a bunch of fun and interesting features.

The only downside for me is the lack of community, since all my friends are on Runkeeper. Luckily, there’s SyncMyTracks (and a limited free version) which can automatically sync activities between the different platforms.