GET hash fragments with JavaScript

function getHashParameters() {
    var prmstr = window.location.hash.substr(1);
    return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
}

function transformToAssocArray( prmstr ) {
    var hash = {};
    var prmarr = prmstr.split("&");
    for ( var i = 0; i < prmarr.length; i++) {
        var tmparr = prmarr[i].split("=");
        hash[tmparr[0]] = tmparr[1];
    }
    return hash;
}

var hash = getHashParameters();

Teaching SpamAssassin with sa-learn (works with cPanel)

Training SpamAssassin is super easy to do with `sa-learn`,  but working out the best way to get all the spam emails to it can be a bit time consuming if done manually. The below line of code tells `sa-learn` to get all emails from all spam folders for all mail accounts.

/usr/local/cpanel/3rdparty/bin/sa-learn --progress --spam /home*/*/mail/*/*/.spam/*

The following figure shows the path components.

  Use common home directory names 'home', 'home2', 'home3'.
┌─┴─┐
/home*/*/mail/*/*/.spam/* └┬┘ Include all user folders within the home directories. Mail directory, nothing special going on here. ┌─┴─┐ /home*/*/mail/*/*/.spam/* └┬┘ Wildcard to include all domain folders. Wildcard to include all user folders. ┌┴┐ /home*/*/mail/*/*/.spam/* – Wildcard to include 'cur', 'new', 'tmp' folders. └─┬─┘ Go for spam, that's what we're here for.


Slick carousel - Fix broken height / appearance within tabs

Fix for when a slick slider has broken positioning from being previously hidden.

jQuery(function($) {

    $(document).on( 'click', '.tab', function() {
        $('.slick')
            .find('.news-item')
            .css({ height: '' }) // Remove the height calculated when hidden
            .find('.news-item__title')
            .css({ height: '' }); // Remove the height calculated when hidden
        $('.slick').slick('getSlick').checkResponsive(); // Trigger same internal functions as `orientationchange` event.
        $('.slick').slick('getSlick').setPosition(); // Trigger same internal functions as `orientationchange` event.
    });

});

Mount remote FTP drive on CentOS 7

Recently I needed to mount a remote backup drive via FTP in order to recover an account within WHM, I found the following package which is an FTP filesystem based in cURL and FUSE.

This worked effortlessly and is now my "goto" for FTP mounting.

The package is called CurlFtpFS and is available via Yum:

yum install curlftpfs

Mounting an FTP account is as easy as:

curlftpfs ftp://username:password123@example.org /mnt/ftp-example
Note: CurlFtpFS hasn't been updated since 2008 and is presumed to be a dead project.

Composer install suggestions

With Craft CMS 3 Beta, there's a fair amount of packages to install via Composer, there's also a sizeable list of suggested packages (mostly for use with sources). Usually I'd just include whichever suggestions I'd want to install by copying and pasting each package into a `composer require X`, but there's a quicker way to go from suggestion to require; the following line will add all suggested packages as a requirement to your Composer project.

composer suggests | xargs -i composer require {}

This may be overkill for some (most?) projects but for Craft CMS 3, I want to ensure these packages are available should a user or plugin later require it, or if a suggested package is just more efficient! Like the `ext-gmagick` package for use with P&T's Imagine editor.

Open Google Chrome in Kiosk Mode on Mac

set strUrl to "https://example.org"
do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --app=" & strUrl tell application "Google Chrome" to activate
tell application "System Events"
keystroke "f" using {command down, control down}
end tell

Remove all .DS_Store files

.DS_Store  files aren't much of a problem to your Mac, these small files provide information about how you want to see the directory laid out, the position of icons within the folder. However, if they disturb your chi you can remove them recursively from /  using the following command:

sudo find / -name ".DS_Store" -depth -exec rm {} \;

These files will of course be regenerated whenever you enter a directory without one via Finder.