Using Redirect Args to Display Errors

if ($error) {
    add_filter('redirect_post_location', function( $location ) use ( $error ) {
        return add_query_arg( 'my-plugin-error', $error->get_error_code(), $location );
    });
}
if ( array_key_exists( 'my-plugin-error', $_GET) ) { ?>
    <div class="error">
        <p>
            <?php
                switch($_GET['my-plugin-error']) {
                    case 'an_error_code':
                        echo 'The post failed to save because problems.';
                        break;
                    case 'another_error_code':
                        echo 'The post failed to save because reasons.';
                        break;
                    default:
                        echo 'An error ocurred when saving the post.';
                        break;
                }
            ?>
        </p>
    </div><?php
}

Using Transients to Display Errors

if ($error) {
    set_transient("my_save_post_errors_{$post_id}_{$user_id}", $error, 45);
}
if ( $error = get_transient( "my_save_post_errors_{$post_id}_{$user_id}" ) ) { ?>
    <div class="error">
        <p><?php echo $error->get_error_message(); ?></p>
    </div><?php

    delete_transient("my_save_post_errors_{$post_id}_{$user_id}");
}

Shell script to install Netatalk 3 on Ubuntu 14.04

# Get root:

sudo su

# Install prerequisites:

apt-get install build-essential pkg-config checkinstall git avahi-daemon libavahi-client-dev libcrack2-dev libwrap0-dev autotools-dev automake libtool libdb-dev libacl1-dev libdb5.1-dev db-util db5.1-util libgcrypt11 libgcrypt11-dev

# Build libevent from source:
cd /usr/local/src
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xfv libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure
 make
checkinstall --pkgname=libevent-2.0.21-stable --pkgversion="$(date +%Y%m%d%H%M)" --backup=no --deldoc=yes --default --fstrans=no
cd ../

# Download src:
git clone git://git.code.sf.net/p/netatalk/code netatalk-code
cd netatalk-code
./bootstrap

# Configure install

./configure --enable-debian --enable-zeroconf --with-cracklib --with-acls --enable-tcp-wrappers --with-init-style=debian
make

# Build!

checkinstall --pkgname=netatalk --pkgversion="$(date +%Y%m%d%H%M)" --backup=no --deldoc=yes --default --fstrans=no

# Config is in /usr/local/etc/afp.conf
;/usr/local/etc/afp.conf
; Netatalk 3.x configuration file
;
 
[Global]
; Global server settings
vol preset = default_for_all_vol
hostname = TimeCapsule
log file = /var/log/netatalk.log
log level = default:info
uam list = uams_dhx.so,uams_dhx2.so
save password = no
disconnect time = 168
dsireadbuf = 96
sleep time = 24
tcprcvbuf = 524288
tcpsndbuf = 524288
dircachesize = 131072
keep sessions = yes
mimic model = Xserve
 
[default_for_all_vol]
file perm = 0664
directory perm = 0774
;cnid scheme = cbd
valid users = @tm
 
[Homes]
basedir regex = /home
cnid scheme = dbd
home name = Home: $u
 
[TimeMachine]
path = /home/tm
time machine = yes
;vol size limit = 953674

CMB2 as Composer Library

{
 "require": {
    "php": ">=5.3.0",
    "composer/installers": "v1.0.12",
    "webdevstudios/cmb2": "dev-master",
  },
  "autoload": {
    "files": ["vendor/cmb2/init.php"]
  },
  "extra": {
    "installer-paths": {
      "vendor/{$name}/": ["webdevstudios/cmb2"]
    }
  } 
}

A Better WordPress Singleton

class PluginClass
{
    public static $instance = null;
    
    public static function init()
    {
        if ( null === self::$instance ) {
            self::$instance = new PluginClass();
            self::$instance->boot();
        }

        return self::$instance;
    }
    
    protected function __construct()
    {
        // Startup
    }
    
    protected function boot()
    {
        // Boot
    }
}

PluginClass::init();
class PluginClass
{
    protected static $instance = null;
    
    public function __construct($file)
    {
        if (static::$instance !== null) {
            throw new Exception;
        }

        static::$instance = $this;
    }

    public static function get()
    {
        return static::$instance;
    }
}
call_user_func(array(new PluginClass(__FILE__), 'boot'));

Get list of apps missing from Kitchenplan

var exec = require('child_process').exec;
var grep = require('grep1');

var callback = function(error, stdout, stderr) {
    if (error) {
        return console.error(error);
    }

    installed = stdout.split('\n');

    installed.forEach(function(app) {
        if (!app) {
            return;
        }

        grep(['-nr', app, '/opt/kitchenplan'], function(err, stdout, stderr) {
            if (err) {
                console.log('* ' + app);
            }
        });
    });
};

exec('brew list', callback);
exec('brew cask list', callback);

Facebook Post Debugger

<?php
/*
Plugin Name: Facebook Post Debugger
Version: 0.1
Plugin URI: https://jamesdigioia.com/
Description: This plugin runs the bit.ly shortlink through the Facebook debugger upon publishing.
Author: James DiGioia
Author URI: https://jamesdigioia.com/
*/

add_filter( 'publish_post', 'fb_debug_link' );

function fb_debug_link( $post ) {
  $short = wp_get_shortlink($post['id']);
  $url = 'https://graph.facebook.com/?id='.$short.'&scrape=true';
  wp_remote_post( $url );
}