In: , On: 2013 / 01 / 13 Short URL: http://ozh.in/vw

I have a new face! Move your mouse over me to see, hoo, look, no more glasses! At the end of 2012 I decided I had enough of wearing glasses and went for some laser eye surgery, pew pew. Before: short sighted to the point I would not recognise someone 50 centimeters away when not wearing my glasses. Now: I feel like an eagle with infinite vision!

I've been wearing glasses since the age of 13 and I can tell you It's awesome. New places to discover! Like, at the swimming pool or inside the shower! :) But the best side effect is that, whenever I just remember that I don't need glasses anymore, it brings a big smile on my face and I'm all cheered up for the next minutes :)

My last "new face" was in 2006. Time to change all the gravatars and stuff again!

Open Source Do you know that logo? It's the logo of the Open Source Initiative, a non-profit formed to advocate for the benefits of open source, and de facto, the logo for open source stuff in general.

Personally, I rarely see that logo used anywhere, which is a shame. For the sake of promoting Open Source, and because I like that logo (sort of an open lock, see?), I think it would be great if that logo was much more common that it is today.

Anyway, the other day I stumbled upon the Green Lantern logo and the similarities with the Open Source logo immediately occurred to me. I thought it would be fun to make a mashup of the two, which I did. But then, why stop? So, during the last few days, I've been having some Photoshop fun and made, so far, ten Open Source Super Hero logos. Can you name them all?

shirts

They're all available as nifty Open Source Super Heroes tshirts from Redbubble, an tshirt company responsible for a large share of my wardrobe and provider of awesomeness (seriously, can you handle that coolness?)

Feedback, criticism and suggestions for other Super Heroes welcome!

I was having a look at my Profile page on WordPress.org and wondered how many downloads all my plugins had. Start Menu, Accessories, Calculat.. HEY? What am I doing here?

Bookmarklet Fun

The following Javascript snippet will do the job for you:

javascript
< view plain text >
  1. (function () {
  2.     var total = 0,
  3.         count = 0;
  4.     jQuery('p.downloads').each(function (i, e) {
  5.         count++;
  6.         total += parseInt(jQuery(e).text().replace(/,/g, ''));
  7.     });
  8.     total = total.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  9.     alert(count + " plugins and " + total + " downloads");
  10. })();

Which makes that bookmarklet: Plugin Count. Drag to your bookmarks or right click and bookmark it, head to your wp.org profile page and trigger the bookmarklet!

plugincount

More Bragginess: Tweet It!

Yeah, a humble alert box won't make the world and your Mom proud of you, right? Tweet Plugin Count!

FYI

Bookmarklets are fun. Two tools will help you:

Have fun!

In: , On: 2012 / 12 / 19 Short URL: http://ozh.in/vq

I wrote a simple WordPress plugin to address a simple problem: every 2 weeks, on every computer I'm working on, I have to login again to my blogs and, oh the annoyance, click the "Remember Me" checkbox because by blogs can't remember to remember me.

remember

Longer auth cookie expiration (one year instead of 2 weeks) and always checked checkbox: that's Always Remember Me.

In: , , On: 2012 / 11 / 30 Short URL: http://ozh.in/vm

I said the other day that I wanted Git t-shirts, because when I like something, I want t-shirts of it. I couldn't find any. So I made some: Git t-shirts

The Git logo by Jason Long has a very permissive license (CC BY) that allows practically anything as long as the author's name is mentionned. And to be extra sure, I also asked him and he confirmed :)

I've ordered numerous shirts from Redbubble and I really like them: tshirt quality and lastability (?) are excellent, there are plenty of awesome designs to chose from, and it's dead easy to upload your own. Ditto.

I've set the Redbubble commission to a low percentage to keep the t-shirt as affordable as possible (I don't give a flying damn about making dollars of money from this, I primarily made that for myself). What are you waiting for? I'm sure a Git t-shirt would look nifty on your Christmas wish-list! :)

In: , , On: 2012 / 11 / 27 Short URL: http://ozh.in/vl

I think I've set up a pretty efficient Git environment on Windows and, as promised in a previous post about my Git initiatic journey, I'm sharing it, hoping it'll be useful to someone. Another quite lengthy post I'm afraid, feel free to grab a cup of something before you start reading.

Read More

In: , , , On: 2012 / 11 / 21 Short URL: http://ozh.in/vk

I've been speaking lately with folks from Spamhaus about anti spam measure in YOURLS and a YOURLS plugin for this. Currently the #1 result in Google for "spamhaus PHP" is a post on Lockergnome which gets it totally wrong and provides a script that does not work, so here is a PHP script that does work.

This script checks a URL (its domain part, in fact) against the 3 major black lists: Spamhaus, SURBL and URIBL.

The script:

  1. /**
  2.  * Check a URL against the 3 major blacklists
  3.  *
  4.  * @param string $url The URL to check
  5.  * @return mixed true if blacklisted, false if not blacklisted, 'malformed' if URL looks weird
  6.  */
  7. function ozh_is_blacklisted( $url ) {
  8.  
  9.     $parsed = parse_url( $url );
  10.  
  11.     if( !isset( $parsed['host'] ) )
  12.         return 'malformed';
  13.        
  14.     // Remove www. from domain (but not from www.com)
  15.     $parsed['host'] = preg_replace( '/^www\.(.+\.)/i', '$1', $parsed['host'] );
  16.  
  17.     // The 3 major blacklists
  18.     $blacklists = array(
  19.         'zen.spamhaus.org',
  20.         'multi.surbl.org',
  21.         'black.uribl.com',
  22.     );
  23.    
  24.     // Check against each black list, exit if blacklisted
  25.     foreach( $blacklists as $blacklist ) {
  26.         $domain = $parsed['host'] . '.' . $blacklist . '.';
  27.         $record = dns_get_record( $domain );
  28.        
  29.         if( count( $record ) > 0 )
  30.             return true;
  31.     }
  32.    
  33.     // All clear, probably not spam
  34.     return false;
  35. }

Usage:

  1. if( ozh_is_blacklisted( $url ) ) {
  2.     // do something brutal (eg die() your script, yell at user, etc...)
  3. }
  4.  
  5. // all is fine *for today*, do your regular stuff.
  6. // This said, it'd be nice to recheck every couple of days

Feel free to steal.

In: , , , On: 2012 / 11 / 13 Short URL: http://ozh.in/vj

I'm a SVN user.

Nowadays, all the cool kids have a Github account where they host stuff and use Git as their primary Source Control tool, and prefer it over the usual SVN you've probably got to use.

I'm not a cool kid and for the last few years (since WordPress started the plugin repository using SVN I think — more or less 8 years ago), I've been happily using SVN. You know SVN, right? Easy to use and to understand, right? Does the job simply, right? So, why switch, right?

I'm regularly pestered to move YOURLS from Google Code to Github, to which I responded more or less that I was happy with SVN and I didn't want to spend time learning a new complicated tool. Because, Git is complicated, right?

But I wanted to be a cool kid anyway, so I gave Git a few looks and tries.

Read More

There's a really nice post that's getting shared all over the intarnets right now, showcasing useful keyboard tricks in various editors, but I thought it missed Notepad++ which does support most of those tricks out of the box.

I decided to list a few quick keyboard tricks in Notepad++ I use daily, and there are really a few cool ones.

Delete whole words

Delete previous word: Control + Backspace
Delete next word: Control + Delete

Actually I think that works in any Windows application since it works right here in my WordPress Write interface.

More power: you can delete from carret to start of line or to end of line adding Shift in the combo:

Delete to start of line: Control + Shift + Backspace
Delete to end of line: Control + Shift + Delete

Duplicate or delete current line

Duplicate current line: Control + D
Delete current line: Control + L

I use the first one pretty often, especially when wanting to test something slightly different: duplicate line, comment first one out and slightly alter second one. Which goes along really well with next trick:

Comment or uncomment one or several lines

Comment or uncomment: Control + Q

That one toggles a leading // in current line or for a line selection. You can also add "stream comments" (ie /* stuff */) with the following key combo:

Add stream comment: Shift + Control + Q

Move that line

Switch current and previous line: Control + T
Move whole line to another place: Shift + Control + Up or Shift + Control + Down

The totally cool stuff is, that second trick works with a multiple line selection. This works great to move an entire small function or CSS declaration.

Column Editing

I've always thought that one was insane :) Pretty usefull if you want to edit several lines of a file where the same text is repeated, such as a CSS file.

Column selection: Alt + Left Click

Where does that code block starts or end? Find matching brace

Go to matching brace : Control + B

Of course the highlighting helps but when the block is taller than your screen, it's not enough. That one is one of my favorites, it makes navigation in if then else or function blocks really easy.

Automatic indentation

Select several lines and move them to the right (indent) or to the left (unindent? outdent?) in a blink

Indent several lines: Tab
Unindent several lines: Shift + Tab

Scroll through the document without using your mouse

Scroll without changing carret position: Control + Up or Control + Down

More !

That's just a few quick and useful keyboard tricks I use all the time, but there are a lot more. Notepad++ has also a gazillion plugins to do just anything you'd think of. The ones I use all the time are Function List (displays a function list in the sidebar, very handy to quickly navigate) and Finger Text, one of the many snippet plugins available.

In: , , , On: 2012 / 10 / 17 Short URL: http://ozh.in/vh

Ho haï, blog, long time no see! :)

I was checking stuff on various URL shorteners and noticed is.gd has one interesting feature: you can generate short URLs that are "pronounceable" (no "vgfhgt"). This is a great little touch: a random but pronounceable word will be more memorable and the probability for typos is reduced, which makes it a killer feature for random generated passwords for example.

Generating pronounceable random words isn't difficult :

  • start by a vowel or a consonant
  • alternate and add letters till proper word length

Simple, but this generates words that are too simple maybe: 'abuco', 'misolo', 'xulanipo', etc… Natural words also use a few consecutive consonant combinations as well as vowel combos ('cheepo', 'bergam', …)

I ended up with this simple piece of code that gives more natural words:

  1. <?php
  2. /**
  3.  * Generate random pronounceable words
  4.  *
  5.  * @param int $length Word length
  6.  * @return string Random word
  7.  */
  8. function random_pronounceable_word( $length = 6 ) {
  9.    
  10.     // consonant sounds
  11.     $cons = array(
  12.         // single consonants. Beware of Q, it's often awkward in words
  13.         'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm',
  14.         'n', 'p', 'r', 's', 't', 'v', 'w', 'x', 'z',
  15.         // possible combinations excluding those which cannot start a word
  16.         'pt', 'gl', 'gr', 'ch', 'ph', 'ps', 'sh', 'st', 'th', 'wh',
  17.     );
  18.    
  19.     // consonant combinations that cannot start a word
  20.     $cons_cant_start = array(
  21.         'ck', 'cm',
  22.         'dr', 'ds',
  23.         'ft',
  24.         'gh', 'gn',
  25.         'kr', 'ks',
  26.         'ls', 'lt', 'lr',
  27.         'mp', 'mt', 'ms',
  28.         'ng', 'ns',
  29.         'rd', 'rg', 'rs', 'rt',
  30.         'ss',
  31.         'ts', 'tch',
  32.     );
  33.    
  34.     // wovels
  35.     $vows = array(
  36.         // single vowels
  37.         'a', 'e', 'i', 'o', 'u', 'y',
  38.         // vowel combinations your language allows
  39.         'ee', 'oa', 'oo',
  40.     );
  41.    
  42.     // start by vowel or consonant ?
  43.     $current = ( mt_rand( 0, 1 ) == '0' ? 'cons' : 'vows' );
  44.    
  45.     $word = '';
  46.        
  47.     while( strlen( $word ) < $length ) {
  48.    
  49.         // After first letter, use all consonant combos
  50.         if( strlen( $word ) == 2 )
  51.             $cons = array_merge( $cons, $cons_cant_start );
  52.  
  53.          // random sign from either $cons or $vows
  54.         $rnd = ${$current}[ mt_rand( 0, count( ${$current} ) -1 ) ];
  55.        
  56.         // check if random sign fits in word length
  57.         if( strlen( $word . $rnd ) <= $length ) {
  58.             $word .= $rnd;
  59.             // alternate sounds
  60.             $current = ( $current == 'cons' ? 'vows' : 'cons' );
  61.         }
  62.     }
  63.    
  64.     return $word;
  65. }
  66.  
  67. ?>

(bleh, just noticed the fuckingfancy curled quoted are back in code blocks. pastebin for cut'n'paste code)

Play with the demo: random pronounceable words.

Nothing elaborated enough to help you create an alien language for your next sci-fi movie, but I'm rather pleased with the random words it creates. It's also easy to implement this in another language: modify the group of consecutive vowels and consonants to match what exists in your language.