// AStringConverted -> a_string_converted function toUnderscoreStyle($s) { $f = function ($match) { return "_" . mb_strtolower($match[1]); }; return preg_replace_callback('/([A-Z])/', $f, lcfirst($s)); } // a_string_converted -> aStringConverted function toCamelCase($s) { $f = function($match) { return mb_strtoupper($match{1}); }; return preg_replace_callback('/_([a-z])/', $f, $s); }
Download Twitch Videos in Full (Mac)
There is no cloud
It’s just somebody else’s computer.
Arguing on the Internet
“Don’t read the comments” is a pretty good warning. You can waste a lot of time shouting at strangers in comment threads or fighting with friends-of-friends on Facebook. But if you feel like you do have to engage I really like these rules from Anatol Rapoport by way of Daniel Dennett to give you a fighting chance of changing a mind rather than just blowing hot air.
How to compose a successful critical commentary:
- You should attempt to re-express your target’s position so clearly, vividly, and fairly that your target says, “Thanks, I wish I’d thought of putting it that way.
- You should list any points of agreement (especially if they are not matters of general or widespread agreement).
- You should mention anything you have learned from your target.
- Only then are you permitted to say so much as a word of rebuttal or criticism.
Remember the Milk Alfred Plugin that Respects Double Quotes, Single Quotes, Backslashes and Anything Else You Throw At It
I’ve used various Remember the Milk plugins for Alfred but none of them cope with any input and reproduce it faithfully in the resulting task. Here’s a plugin that does. You need Alfred’s Power Pack to use this.
$ sudo gem install rumember $ ru # Agree to authenticate rumember, then press Enter in the terminal when authenticated
Now install this plugin. It’ll use “todo” as the keyword by default but that’s easily changed under ‘Workflows’ in Alfred’s settings should you wish.
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.
- Launcher (Alfred)
- App Switcher (Witch) set to nonmiminized windows only.
- A way to send tasks to rememberthemilk.com from Alfred
- bunnylol plugin for Alfred (internal to Facebook)
- Set Desktop to “Sort By Kind”.
- solarized theme for iTerm2
- Make left Alt work as +Esc in iTerm2
- atom with vim-mode and ex-mode.
- MacPorts installing gpg for passwords, apache2 and MySQL for webdev.
A Very Short But Complete Guide to Sending a Pull Request to a github Project
- Clone the project
$ git clone https://github.com/OWNER/REPO.git
You may need to fork the project and clone your own forked version.
- Make a branch and switch to it
$ git checkout -b YOURBRANCH
- Make your changes
- Add your changes to the index
$ git add -p
- Commit your changes
$ git commit -m "My commit message"
- Push your changes
$ git push --set-upstream origin YOURBRANCH
- Visit https://github.com/YOURUSERNAME/REPO/tree/YOURBRANCH
- Click on New Pull Request
- Write something sensible
- Click on Send Pull Request
Grade Between Two Hex Colors
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!
lint: @! 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:
lint: @! 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:
HTML/CSS is:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <style> * { border: 0; margin: 0; padding: 0; } body { margin-top: 50px; font-family: "Gill Sans", sans-serif; text-align: center; } .book { background: rgb(255, 102, 0); border: 1px black solid; margin: auto; width: 390px; height: 594px; display: inline-block; } .details { background: #fff3d3; } .metadata { text-transform: none; } h1, .author, .banner, .details { text-transform: uppercase; } h1 { font-size: 36px; letter-spacing: 7px; padding-top: 20px; padding-bottom: 10px; } .section { height: 198px; margin: 0; border: 0; } hr { border: 1px rgb(255, 102, 0) solid; margin: auto; width: 18%; } .banner { display: flex; justify-content: center; } .publisher { background: rgb(255, 102, 0); font-size: 24pt; text-align: center; align-self: center; } .publisher img { vertical-align: middle; } .author { font-size: 18pt; margin: 10px; } .logo { display: flex; justify-content: center; } .colophon { align-self: center; font-variant: small-caps; text-transform: uppercase; } .colophon img { vertical-align: middle; } /* 3D */ .book { position: relative; -moz-perspective: 100px; -moz-transform: rotateY(-3deg); -webkit-transform: perspective(100) rotateY(-3deg); outline: 1px solid transparent; /* Helps smooth jagged edges in Firefox */ box-shadow: none; margin: 0; } .book:before, .book:after { position: absolute; top: 1.5%; height: 97%; content: ' '; z-index: -1; } .book:after { width: 5%; left: 100%; background-color: #ded2b2; box-shadow: inset 0px 0px 5px #aaa; -moz-transform: rotateY(20deg); -webkit-transform: perspective(100) rotateY(20deg); } </style> </head> <body> <div class="container"> <div class="book"> <div class="banner section"> <p class="publisher"><img src="penguinbooks.png" width="162" height="111"></p> </div> <div class="details section"> <h1>The Kraken Wakes</h1> <hr> <p class="author">John Wyndham</p> <p class="metadata">Author of <i>The Day of the Triffids</i></p> </div> <div class="logo section"> <p class="colophon">Complete <img src="penguin.png" height="100" width="80" alt="Penguin Logo"> Unabridged</p> </div> </div> </div> </body> </html>
You can see it on it’s own page at bluebones.net/penguin.