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.

Queueing jQuery scripts before the library

When trying to queue jQuery scripts to run before loading the library itself, this usually results in that code not working. If you want to load jQuery at the end of your page (or asynchronously) but you may need to include jQuery within a template part way through the page the following code allows you attach and queue up scripts to run when jQuery initialises.

if ( ! window.deferAfterjQueryLoaded ) {
    window.deferAfterjQueryLoaded = [];
    Object.defineProperty(window, "$", {
        set: function(value) {
            window.setTimeout(function() {
                $.each(window.deferAfterjQueryLoaded, function(index, fn) {
                    fn();
                });
            }, 0);
            Object.defineProperty(window, "$", { value: value });
        },

        configurable: true
    });
}

window.deferAfterjQueryLoaded.push(function() {
    //... some code that needs to be run
});

What this does is:

  1. Defines deferAfterjQueryLoaded  lazily, so you don't need to inject that into head .
  2. Defines a setter for window.$ . When jQuery loads, one of the last things it does is assign to the global $ variable. This allows you to trigger a function when that happens.
  3. Schedules the deferred functions to run as soon as possible after the jQuery script finishes (setTimeout(..., 0);) .
  4. Has the setter remove itself.

For complete cleanliness you could have the scheduled function remove deferAfterjQueryLoaded  as well.

--

This answer is provided from StackOverflow.

GET parameters with JavaScript

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

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

var params = getSearchParameters();

Source: StackOverflow

iOS 9: -canOpenURL: failed for URL

If you're receiving the following error in Xcode:

-canOpenURL: failed for URL: "<scheme>://" - error: "This app is not allowed to query for scheme <scheme>"

Apple changed the canOpenURL method on iOS 9. Apps which are checking for URL Schemes have to declare these Schemes as it is submitted to Apple. More info here.

Simply open your app's .plist (usually platforms/ios/<appname>/<appname>-Info.plist ) with an editor and add the following code with your needed Schemes.

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>tweetbot</string>
    <string>twitter</string>
    <string>googlechromes</string>
</array>

Placeholder for HTML Select box

Select boxes don't currently support the 'placeholder' attribute, so here's a workaround that works just as well.

<select>
    <option value="" disabled selected hidden>Please Choose...</option>
    <option value="0">Open when powered (most valves do this)</option>
    <option value="1">Closed when powered, auto-opens when power is cut</option>
</select>

The Disabled option stops the <option> being selected with both mouse and keyboard, whereas just using display: none allows the user to still select via the keyboard arrows. The display: none style just makes the list box look 'nice'.

Note: Using an empty value attribute on the "placeholder" option allows validation (required attribute) to work around having the "placeholder", so if the option isn't changed but is required; the browser should prompt the user to choose an option from the list.

This method is confirmed working in the following browsers:

  • Google Chrome - v.43.0.2357.132
  • Mozilla Firefox - v.39.0
  • Safari - v.8.0.7 (Placeholder is visible in dropdown but is not selectable)
  • Microsoft Internet Explorer - v.11 (Placeholder is visible in dropdown but is not selectable)
  • Project Spartan - v.15.10130 (Placeholder is visible in dropdown but is not selectable)

Update:

When the select element is required it allows use of the :invalid CSS pseudo-class which allows you to style the select element when in it's "placeholder" state. :invalid works here because of the empty value in the placeholder option.

Once a value has been set the :invalid pseudo-class will be dropped. You can optionally also use :valid if you so wish.

Most browsers support this pseudo-class. IE10+. This works best with custom styled selectelements; In some cases i.e. ( Mac in Chrome / Safari) you'll need to change the default appearance of the select box so that certain styles display i.e. background-colorcolor. You can find some examples and more about compatibility at developer.mozilla.org.

Native element appearance Mac in Chrome:

Select box native Mac in Chrome

Using altered border element Mac in Chrome:

Altered select box Mac in Chrome

Rebuild Spotlight Index on Mac OS X

Sometimes after several months Spotlight doesn't work very efficiently and starts to slow down your Mac. Fortunately there's a way to reset the Spotlight Index so that it reindexes your drives which may also lead to a smaller index file size.

Just open Terminal via Spotlight or go to Applications > Utilities > Terminal and copy in the following:

sudo mdutil -E /

This will clear everything from Spotlight and the reindex will start immediately.

If you're having problems (or suspect you're having problems) with a particular drive you can reindex only that drive by using the following command:

sudo mdutil -E /Volumes/[DriveName]

Just replace [DriveName] with the actual path or omit the path; drag and drop the drive from Finder to insert it.

You can exclude drives from Spotlight by going to System Preferences > Spotlight > Privacy.

Measuring PHP page load time

When you want to measure the actual page load time of a PHP page most developers will get the microtime at the top of the page, whilst this does measure the page load time of the scripts running on the page it doesn't accurately measure the page load time of the script.

To do so you can use $_SERVER['REQUEST_TIME_FLOAT'] to get the actual start time of the page request. Which can differ by 0.01 second or so.

$total_time = ( ( explode(' ', microtime())[0] + explode(' ', microtime())[1] ) - $_SERVER['REQUEST_TIME_FLOAT'] );

If you're just looking for a timer function then this is the most accurate way to do so.

class Timer {
	private $start;
	
	public function __construct() {
		$this->start = ( explode(' ', microtime())[0] + explode(' ', microtime())[1] );
	}
	
	public function stop() {
		return ( explode(' ', microtime())[0] + explode(' ', microtime())[1] ) - $this->start;
	}
	
	public function reset() {
		$this::__construct();
	}
}

$timer = new Timer();
$total_time = $timer->stop();

Avoid ad blockers with Piwik Analytics

For many reasons you may want to circumvent an Ad Blocker that's blocking your analytics script. Ad Blockers may block these scripts to curb invasive marketing tracking from third party advertisers i.e. Google. If you're using Piwik Analytics (or most other self-hosted systems) then you're in luck, you can rewrite the url to avoid the Ad Blocker.

Image: Google Analytics & Piwik Analytics requests blocked


We'll rewrite the url in .htaccess, you can change the path to anything you want. (Make sure you set the "analytics" text sections to your actual path where Piwik is installed).

RewriteEngine On
RewriteRule ^proxy-analytics/(.*) /analytics/piwik.$1 [L]

Then we'll need to update the tracking code for Piwik to work with the rewrite, here's what your code should look like before the change.

<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="//www.example.com/analytics/";
    _paq.push(['setTrackerUrl', u+'piwik.php']);
    _paq.push(['setSiteId', 2]);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<noscript><p><img src="//www.example.com/analytics/piwik.php?idsite=2" style="border:0;" alt="" /></p></noscript>
<!-- End Piwik Code -->

And here's the lines to change: (Replace "analytics" text sections to your actual path where Piwik is installed).

<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="//www.example.com/proxy-analytics/";
    _paq.push(['setTrackerUrl', u+'php']);
    _paq.push(['setSiteId', 2]);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<noscript><p><img src="//www.example.com/proxy-analytics/php?idsite=2" style="border:0;" alt="" /></p></noscript>
<!-- End Piwik Code -->

Line 7: You'll need to update the url to the path that is your directory rewrite from the htaccess file.
Line 8 + 11: Remove piwik. from these lines, ad blockers may target piwik.[php/js] or like ABP they may target just the word piwik.
Line 14: Lastly, you'll need to update the path like on line 7, and again remove piwik. from the image source. The htaccess rewrite prefixes the path with piwik. so that everything still works.

Once you've made this change you should immediately be able to collect Piwik Analytics data through most Ad Blockers.

Image: Google Analytics blocked & Piwik Analytics request not blocked


This method has been tested and verified for use with 'Adblock Plus' but should work with most other Ad blockers. If you have any questions about Piwik with Ad Blockers, leave a comment or tweet me @WilliamIsted

Update: Interestingly I've just noticed that ABP is actually stopping all of the screenshot images with piwik in the name from displaying. That seems like rather aggressive filtering.