Blog


  1. Posting Raw Data with Curl


    This week I've been working on a feature which handles an incoming API call from an external source (actually Paypal's IPN service). Making external calls into my development platform isn't how I usually work, so instead I captured the body of the request that was being sent, and replayed it …

    Read more

  2. The Quest for a Payment Gateway


    Although I've been "making websites" for a lot of years, I've mostly avoided the kind where people actually pay for anything. The result of this is that I built Bitestats (elevator pitch: sign up and get a printable summary report of your web stats every month by email) but then got busy and never built the bit where people can actually pay to use it.

    I recently carved out some time to correct this situation, and fell into an absolute pit of confusion when I tried to figure out what my options even were. My requirements are that my customers are global, I am UK-based, people will set up a regular subscription, and I don't have (and I think I don't want) a merchant account at this point. I'm not PCI compliant and have no intention ever to attempt that. This post is an attempt to round up some things I found out along the way.

    Read more

  3. Skills Allied to PHP


    This post is mostly about a tutorial I will be delivering at PHPNW on October 5th in Manchester, UK, and why I think a tutorial that contains no PHP belongs at a PHP conference

    phpnw12 logoIn October, I'll be delivering a tutorial at the mighty PHPNW Conference which contains very little PHP. Why? Because I think, as developers, it's our other professional skills that suffer. As a consultant, I work with lots of different teams, and it is very rare for code to be the problem (and the one time it was, it wasn't the only problem!).

    In web development, our biggest challenges are not writing code, we can do that. But getting the code safely from one place to another, with many people's work preserved, having our platform(s) correctly configured and understanding how to use them, making use of the tools in the ecosystem which will help us improve the quality of our code; these are the big challenges we face, and that's why I proposed this workshop and why I think all these topics are important.

    Read more

  4. Validating Email Addresses in PHP


    A very quick snippet today because I've told two people to use this approach in the last few days and both of them told me they didn't know about it. How to check if an email address is valid in PHP: use one of the Filter functions, like this:

    $email1 …
    Read more

  5. Two Years of Trading


    Two years ago I quite literally gave up the day job. I had no clients, no experience of being anything other than a salaried employee, but I did have an urgent need for change! Two years on I've just done the end-of-the-year reporting and I'm struck by how far I've come and how much the numbers surprise me (there are no actual numbers in this post, it doesn't feel appropriate somehow - but there are graphs!).

    Read more

  6. Installing PEAR Packages Offline


    As with most tools that work really well, I know very little about PEAR. I mean, I use it all the time, and I love it for getting all the extensions installed that I need for the work I do. But I've never made a PEAR package, or channel, and I've been happy to leave all those things in the hands of the smart people who have created what we have today.

    However I'm now in a situation where I might need to install PEAR packages with a connection that may or may not be working, and I'm not sure exactly which packages I might need, so I wanted to know whether I could use PEAR as my packaging tool even when I wasn't able to reach the usual channels. And guess what? I can!

    Read more

  7. Speaking at CakeFest 2012


    image1I'm delighted to announce that the nice people over at CakePHP have very kindly invited me to speak at their event in Manchester in September - CakeFest! They brought this event to Manchester last year and I wasn't able to make it, so I'm super-excited to be there this year.

    Read more

  8. PHP 5.4 Benchmarks


    Today I'm giving my first ever talk at OSCON - about PHP 5.4 (I'll also be giving my second ever talk at OSCON, about RESTful services; it's a busy day!). My talk includes some benchmarks which I thought I'd also share here.

    Read more

  9. Lesson Learned: Look in the Pull Request Queue


    If you follow me on twitter you might have seen some overexcitement when I managed to edit and compile a vala application recently. I use a great deal of open source tools, but many of them don't seem open to me, because I don't have the skills to modify the code. Regardless of that, it's still vitally important that it is open (this is a whole other post and I'll avoid that tangent right now).

    Read more

  10. PHP's Magic __invoke() Method and the Callable Typehint


    PHP has a variety of magic methods; methods named with two underscores at the start, which get called automatically when a particular event happens. In PHP 5.3, a new magic method was added: __invoke().

    Read more

  11. Monday Git Tips


    One project I'm working on at the moment involves finding my way around changes in a codebase that isn't mine - and it's quite large. I was doing pretty well with a combination of git log and git show and in particular two of my favourite existing tricks:

    Read more

  12. Pushing to Different Git Remotes


    Just a quick tip because I'm working on a different git workflow at the moment with one of my clients, and it struck me that this usage pattern is something I don't usually write or speak about at all. Most git setups have one "main" repository, and either:

    • there is a gatekeeper that manages merging to here

    • all developers have write access

    In this case, I'm working with the second option, so I'm pushing to the upstream repo. I'm also pushing to a live repository as well, so I thought I'd outline the commands I'm using. The setup here is the main github repo, and I have my own fork of that, which is cloned onto my laptop. I can push to both that main repo, which I'll call "upstream" (because the github documentation does and it makes sense!) and another repo that I'll call "live". All in all it looks something like this:

    image1

    Read more

29 of 92