Things I Absolutely Must Do On A New Mac

I try to stick to “default is better than configuration”. But there’s some stuff I absolutely must have on a Mac to be useful.

A Very Short But Complete Guide to Sending a Pull Request to a github Project

  1. Clone the project
          $ git clone

    You may need to fork the project and clone your own forked version.

  2. Make a branch and switch to it
          $ git checkout -b YOURBRANCH
  3. Make your changes
  4. Add your changes to the index
          $ git add -p
  5. Commit your changes
          $ git commit -m "My commit message"
  6. Push your changes
          $ git push --set-upstream origin YOURBRANCH
  7. Visit
  8. Click on New Pull Request
  9. Write something sensible
  10. Click on Send Pull Request

Grade Between Two Hex Colors

CSS colors gradation example

Yesterday I wanted to gradually shade between two hex colors. To perform artihmetic/math on hex colors in PHP you need to break them apart, turn them into decimals, change them back into hex and then put them back together.

Here’s what I came up with:

function hexColorToRgb($color) {
    return [hexdec(mb_substr($color, 0, 2)),
        hexdec(mb_substr($color, 2, 2)),
        hexdec(mb_substr($color, 4, 2))];

function colorGrade($p, $start, $end) {
    $start_rgb = hexColorToRgb($start);
    $end_rgb = hexColorToRgb($end);
    $rgb = [$start_rgb[0] * (1.0 - $p) + $end_rgb[0] * $p,
            $start_rgb[1] * (1.0 - $p) + $end_rgb[1] * $p,
            $start_rgb[2] * (1.0 - $p) + $end_rgb[2] * $p];
    return dechex($rgb[0]) . dechex($rgb[1]) . dechex($rgb[2]);

// Example:
$start_color = 'c4dbf5';
$end_color = '333333';
echo colorGrade(0.25, $start_color, $end_color); # 9fb1c4
echo colorGrade(0.5, $start_color, $end_color);  # 7b8794
echo colorGrade(0.75, $start_color, $end_color); # 575d63

PHP Lint in Makefile

I ran into a little problem adding php -l to a Makefile. PHP lint is a little verbose outputting “No syntax errors detected” for every file that has no problems. I don’t really want that output but getting rid of it with grep -v means that make treats no errors (grep didn’t find any lines to show) as a failure and errors (grep found some lines to show) as a success. make then terminates in the success case and continues or exits with success in the failure case!

	@! find . -name "*.php" | grep -v "^./vendor" | xargs -I{} php -l '{}' | grep -v "No syntax errors detected"

The trick is to negate the exit code of the entire pipeline like so:

	@! find . -name "*.php" | grep -v "^./vendor" | xargs -I{} php -l '{}' | grep -v "No syntax errors detected"

A Penguin Book in CSS

I was reading about Gill Sans and I looked at the sweet Penguin cover in that article and I wondered if I could do the same in CSS.

Here’s my attempt:

You can see it on it’s own page at

CSRF Protection in PHP

All the libraries I found via $ composer search required coding to work. But csrf-magic only requires that you include the project file and everything else happens magically. (Behind the scenes it adds a hidden __csrf_magic form element to all forms). This does mean that error handling is by default kind of ugly, but there’s a hook to change that should you wish.

History (Third Time)

[zarquon ~] history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
1772 vi
1727 c
1496 php
1458 git
1394 ssh
1303 cd
887 ls
711 pass
380 sudo
379 ruby

Compare to nearly four years ago. New: c, ruby [but was there in 2008], pass, sudo. Climbers: vi, php, ssh. Fallers: git, cd, ls. Old: mate, rsync, cat, make.

Run MacVim Inside a Terminal

MacVim is the de facto standard vim for OS X now. But you don’t necessarily want to run it as a separate GUI application. If you’re making a quick edit in a terminal you want to stay in the terminal environment.

You can achieve this with mvim -v {filename} where mvim is this shell script.

Use System Clipboard in vim

  • Install a version with vim with +clipboard. You can check your current setting with :echo has('clipboard'). “1” is good, “0” is bad. This lets you access the system clipboard with (for example) “+p to paste.
  • Add clipboard=unnamed to .vimrc and restart vim. You are now using the system clipboard by default for all cut/copy/paste operations.

Mustache Templates in PHP

I’ve always admired the simplicity of Mustache templates but the complication of internationalization support has always prevented me using them until a recent project. I used them in my Magic: the Gathering tournament software.

Mustache templates look like this:

<h2>Create Event</h2>

<form action="{{formAction}}" method="post">
  <label for="format">Format</label> <input type="text" name="format">
  <label for="cost">Cost</label> <input type="text" name="cost">
  <input class="btn btn-primary btn-block" type="submit">

You can see a bunch from the project at

As long as you have { "require": { "mustache/mustache": "~2.5" } } in your composer.json using them is as simple as:

$loader = new Mustache_Loader_FilesystemLoader('path/to/templates');
$engine = new Mustache_Engine(['loader' => $loader]);
echo $engine->render('template_name', $arguments);

I wrapped this up in a class (Template) and a global (T()) so I could make calls like this:

echo T()->signin($args);