Using $_SESSION to Display Errors

if ( !session_id() ) {
    session_start();
}
start-session.php
if ($error) {
    $_SESSION['my_plugin_errors'] = $error->get_error_message();
}
save-errors-session.php
if ( array_key_exists( 'my_plugin_errors', $_SESSION ) ) {?>
    <div class="error">
        <p><?php echo $_SESSION['my_plugin_errors']; ?></p>
    </div><?php
    unset( $_SESSION['my_plugin_errors'] );
}
display-session-errors.php

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 );
    });
}
add-redirect-args.php
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
}
display-get-errors.php

Using Transients to Display Errors

if ($error) {
    set_transient("my_save_post_errors_{$post_id}_{$user_id}", $error, 45);
}
save-transient.php
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}");
}
display-transient-errors.php

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
1_netatalk-3-install-on-ubuntu-14.04.sh
;/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
2_netatalk-3-afp.conf

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"]
}
}
}
composer.json

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();
normal-singleton-and-boot.php
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;
}
}
improved-singleton.php
call_user_func(array(new PluginClass(__FILE__), 'boot'));
improved-boot.php

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);
new-cask.js

Recursive Closures in PHP

"kind"
/
"type"
/ | \
widget widget widget
graph
var widgets = [...arrayOfWidgets];
var remove = function(widgetId) {
widgets[widgetId].getChildWidgetIds().forEach(function(childWidgetId) {
// `remove` is defined and accessible
// at the time this is called
remove(widgets[childWidgetId]);
});
delete widgets[$pageId];
};
remove(widgets[pageId]);
recursion.js
$widgets = [...arrayOfWidgets];
$remove = function($widgetId) use (&$widgets, &$remove) {
foreach ($widgets[$widgetId]->getChildWidgetIds() as $childWidgetId) {
$remove($widgets[$childWidgetId]);
}
unset($widgets[$widgetId]);
};
$remove($widgets[widgetId]);
recursion.php

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 );
}
fb-debugger.php