Shared mobile network tethering

Right now there are millions of people with mobile data plans that allow tethering and are being unused. There are also many people in need of an Internet connection.

Fon” sllows people to share their home / business WiFi connection publicly and monetize it. What if Fon (or a similar service) allowed you to share your mobile data (3G or 4G) publicly and securely? This could lead to WiFi access being available wherever there was mobile data access.

A few problems:

  • needs a critical mass (Fon already has this)
  • needs to work on smartphones (it would work on rooted Android devices)
  • needs devices with good batteries
  • needs data plans that allow tethering
  • needs to have really good pass-off between hotspots (there’s lots of interesting research happening in this area)
  • it isn’t long term (eventually everywhere will have WiFi / WiMax)

Unlimited passion

In this digital society we are so fortunate. We have tools and services available to us that allow us to build almost anything our imagination can think of. Not only that but we can share these creations with thousands of like-minded people in seconds.

The proliferation of low cost computing devices and ubiquitous Internet connections over the last couple of decades means that billions of people in the world now have access to a device they can use to create “stuff”. The increase in breadth and quality of Open Source software has also played a large part in this.

As developers we have all the tools available to us to write code and put it on the web. We’re limited primarily by our own time and our passion to learn. Not only does the web have all the educational resources required for us to program available for free but services like Github allow us to show others the things we create and foster collaboration and community.

In some ways technology and the web is creating a level playing field for people who build things. The passion developers have for their craft is what shines through.

Conway’s Game of Life in Canvas

I haven’t done much with Canvas, so I thought I’d experiment by making Conway’s Game of Life with a little JavaScript. Conway’s Game of Life is based on a grid of cells, which are either alive or dead. It has 4 simple rules rules:

  1. Any live cell with fewer than two live neighbours dies, as if caused by under-population.
  2. Any live cell with two or three live neighbours lives on to the next generation.
  3. Any live cell with more than three live neighbours dies, as if by overcrowding.
  4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction
These simple rules allow anything to be created. For example:

Gliders in Conway’s Game of Life (from Wikipedia)

You can see the code on GitHub. It’s very basic but works OK and isn’t too bad for a couple of hours whilst watching TV (it may eat up your CPU a little, sorry). Pull requests, ideas and suggestions welcome.

You can see it in action in the header of this blog. If you move your mouse over it then it will leave a trail of blocks. Clicking on the canvas will add lots of random cells.

Bitcoin: the cryptographic currency

Bitcoin is a digital currency without any central control. It was introduced 4 years ago today (3rd January 2009). 1 Bitcoin (BTC) is currently worth around $13. Last year Bitcoin grew considerably in market cap (now about $150 million) and popularity, with many organisations accepting Bitcoin as a form of payment.

As a software developer interested in security, the idea of a distributed digital currency with foundations in cryptography is fascinating. Read on if you want to find out more about Bitcoin or just have 5 minutes to spare.

Continue reading

Generators in PHP 5.5 (with PDO)

As the first alpha of PHP 5.5 has been released, now is a great time to play with its new features. The first new feature is generators. Generators are like very simple iterators.

PDO’s PDOStatement class implements Traversable, which means you can iterate over it with foreach:

$sth = $dbh->prepare("SELECT * FROM users");
$sth->execute();

foreach ($sth as $result) {
	print_r($result);
}

This is great as it abstracts away much of retrieving result sets from a database and gets you straight to an array-like structure. This iterator is great as PDO only retrieves the results as they’re requested, reducing memory usage.

You can recreate this by making a class that implements Iterator and its abstract methods. Whilst this is quite simple, PHP 5.5 brings generators, which allow you to create iterators using a single function.

Here’s an example, using PDO again. First, some boiler plate code to set up:

$dbh = new PDO('sqlite::memory:'); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec("CREATE TABLE users (
	id INTEGER NOT NULL,
	name VARCHAR(255),
	PRIMARY KEY (id)
)");

$dbh->exec("INSERT INTO users (id, name) VALUES (1, 'tom')");
$dbh->exec("INSERT INTO users (id, name) VALUES (2, 'dick')");
$dbh->exec("INSERT INTO users (id, name) VALUES (3, 'harry')");

$sth = $dbh->prepare("SELECT * FROM users");
$sth->execute();

If we wanted to, we could now iterate over $sth using foreach like so:

foreach ($sth as $result) {
	print_r($result);
}

Instead, lets create a generator that fetches rows from $sth, but passes control back to the foreach:

function fetch($sth, $fetchMode) {
    while ($result = $sth->fetch($fetchMode)) {
        yield $result;
    }
}

The key here is the “yield” keyword, which can be thought of as “start returning an item from an array”. The foreach can then loop through the results like this:

$results = fetch($sth, PDO::FETCH_OBJ);
foreach ($results as $result) {
	echo $result->name . "\n";
}

Whilst this example is a bit pointless (as PDO already provides an Interator), you can see that generators are a simple way of creating iterators.

Enabling and fixing suPHP on Ubuntu

I use suPHP on the VPS that runs this blog as it’s great for performance and security. After updating Ubuntu, suPHP somehow got disabled. Fixing it was a bit of trial and error but in the end this is what worked:

  1. Make sure everything is installed
    sudo apt-get install libapache2-mod-suphp
  2. Edit the end of /etc/suphp/suphp.conf
    [handlers]
    ;Handler for php-scripts
    ;application/x-httpd-suphp="php:/usr/bin/php-cgi"
    application/x-httpd-php="php:/usr/bin/php-cgi"
  3. Edit /etc/apache2/apache2.conf
    suPHP_Engine on
    suPHP_AddHandler application/x-httpd-php .php
  4. Make sure suPHP is enabled and restart Apache
    sudo a2enmod suphp
    sudo service apache2 restart

That should be it.

Batch converting images with ImageMagick

Every now and then I need to batch resize or change the quality in some images. Photoshop and the GIMP let you do this, which is fine if you’re happy using your mouse or lots of RAM. The most efficient way of processing images is with ImageMagick. ImageMagick is the canonical way to do image manipulation and many GUI tools are based on it. ImageMagick is a useful tool to know and learning the basics of it will hopefully save you lots of time.

Continue reading