DC4D 6: Not-Programming for Programmers

In case you haven't seen the news, the next episode of Day Camp 4 Developers is coming up on Friday 26th July. This edition is about getting beyond being awesome at the code, which we know that you are, and picking up some other skills to complete you as a profesional. Whether you work in a large international corporation, a smaller company, or alone, we've got content that will make a difference.

Day Camp 4 Developers is a virtual conference, and it's $40 (about 25 quid for UK people). If you can't make it on the day, just get the video ticket and download the recorded sessions later. What I'm trying to say in this paragraph is that there are quite literally no excuses for missing out on this :)
Continue reading

Are Subqueries RESTful?

Twitter is great for one-liners, but it's very difficult to carry on any kind of advanced conversation there. Therefore when I saw this tweet yesterday, I knew I'd be picking a different medium to reply:

The blog seems like a good place, as I can put examples and all kinds other things here, and waffle at length (which is really why I like it!). Because when condensed to tweet form, the answer is really "it depends".

The Problem(s)

REST is all about representations of resources. They might come in different formats, and they might appear at their own URI as well as in one or more collections, but essentially you just get a representation of a thing. This is great, apart from when it isn't.

  • What if you want a smaller result set with only a limited number of fields?
  • What if you want related data? For every resource in a collection?

Continue reading

PHP Version Adoption

PHP runs over 75% of all websites whose technologies are known (source: w3techs), which makes for a really REALLY long tail of users who once installed wordpress, phpmyadmin, or some other open source project that helped their business needs at the time. What they don't do is upgrade. PHP's current usage statistics look like this (source and raw numbers are if you want them):

PHP Version Adoption

What's alarming about this is that the left half of this graph represents unsupported versions of PHP. PHP 5.2 has been end of life since January 2011. This doesn't mean that you can't use it any more, but it does mean that in terms of security updates, you are out of luck. Some distributions will try to retro-fit some of the fixes but essentially your PHP applications seem a bit lacklustre because, well, you're using technology from 2006. Continue reading

Simplest PHP Generator Example

I really like the generators feature that's arriving in PHP 5.5, and since we're now into release candidate releases, it's actually not that far away. I've been speaking on this topic and I thought I'd share my trivially simple code example from my slides.

Writing a Generator

The generators use the yield keyword to feed values out as they are iterated over. In code, they really look a lot like a function (or method):

< ?php
function getValues() {
    // totally trivial example
    yield "Apple";
    yield "Ball";
    yield "Cat";
}

Continue reading

Setting Multiple Headers in a PHP Stream Context

Last week I tried to create a PHP stream context which set multiple headers; an Authorization header and a Content-Type header. All the examples I could find showed headers built up as a string with newlines added manually, which seemed pretty clunky and not-streams-like to me.

In fact, you've been able to pass this as an array since PHP 5.2.10, so to set multiple headers in the stream context, I just used this:

<?php
$options = ["http" => [
    "method" => "POST",
    "header" => ["Authorization: token " . $access_token,
        "Content-Type: application/json"],
    "content" => $data
    ]];
$context = stream_context_create($options);

The $access_token had been set elsewhere (in fact I usually put credentials in a separate file and exclude it from source control in an effort not to spread my access credentials further than I mean to!), and $data is already encoded as JSON. For completeness, you can make the POST request like this:

<?php
// make the request
$response = file_get_contents($url, false, $context);

Hopefully this will help someone else doing the same thing next time (or at least I know I can come back here when I can't remember!), the array approach seems more elegant and maintainable to me.

What Goes in Source Control?

Short answer: everything! However we need some good directory structures and source control configuration to make that a really practical answer, so this article is a quick outline of my usual advice for a good source control structure for a standard web project. The examples are for a PHP project but I'm sure you could apply this to your own language of choice, also. Continue reading

The Mathematics of Recruitment and Training

The PHP jobs market is hot, very many people find it hard to recruit the skilled staff that they need to achieve the goals of their organisation. I meet a wide variety of organisations in this technology space, and they all tell me the same story: it's really difficult to get good, qualified people. And I believe that this is true, I know plenty of developers too and although I'll usually try to put people in touch where it makes sense to do so, it's not as if there is a great reservoir of hidden PHP talent somewhere.

This isn't a rant about salaries, the skills of new graduates, or the trials of dealing with recruiters, although each of those is worth a post in itself. It's about the mathematics of providing your organisation with the talent it needs at the time that it needs it. Continue reading

Pretty-Printing JSON with Python's JSON Tool

Today's quick tip is something that was widely retweeted after my "Debugging HTTP" talk at the ever-fabulous WhiskyWeb conference last weekend. When working with JSON on the commandline, here's a quick tip for showing the JSON in a nicer format:

curl http://api.joind.in | python -mjson.tool

You need python installed, but the JSON extension is probably included, and that's all you need for this tool. The result is something like:

python-mjsontool

You can also use this approach to present JSON data that has been captured to another file, for example, it's a handy trick that I use often when developing something with JSON as a data format.

Video Course on Learnable: OOP PHP

I'm delighted to announce that my new video course on Object-Oriented PHP is now available on Learnable! It's very much an introduction, aiming to cover WHY objects are so cool as well as how to declare and use one. The course is a mix of video (filmed in my kitchen, welcome to my home everyone!), screencast, a couple of exercises for you to try, and also plenty of sample code to download. If you are just looking to get started with OOP, or know someone who is, then hopefully this will help you out.

On a related note, I'm also doing a Sitepoint "Talk with the Experts" session on 11th April (early morning UK time, as a special treat for everyone in Europe and further east, that doesn't happen often!). There are more details here: http://www.sitepoint.com/forums/showthread.php?1012242-Talk-Object-oriented-PHP-with-the-Experts and I hope you can join me then.

Ideas Of March: Don't Read The Comments

It's that time of year again, time for an "Ideas of March" post (you can read more about this initiative on Chris Shiflett's blog). Most years many bloggers pledge to write more often, start or restart their blogs, and generally embrace the idea that some thoughts are worth more than 140 characters. Chris himself wrote this year about the demise of google reader, and about blogging as a way of curating and retaining ownership of your ideas, which I thought was an excellent point to make. Continue reading