Archive for May, 2012

PHP Namespaces and Exceptions

Thursday, May 31st, 2012 | Programming

Recently, I was trying to catch an exception that was raised when someone entered an invalid date string. Every time I tried it however, it would continue to throw the standard Symfony2 error information, rather than executing my catch block.

try {
    $date = new \DateTime($str);
    return $this->setDateOfWork($date);
} catch (Exception $e) {
    return false;
}

After a good thirty minutes of being puzzled, we eventually worked out what it was – because we were working within a namespace, we needed to call the Exception object, which is after all just another object, from the global namespace.

try {
    $date = new \DateTime($str);
    return $this->setDateOfWork($date);
} catch (\Exception $e) {
    return false;
}

This applies to any other types of Exceptions you’re trying to catch too – make sure you’re in the correct namespace!

Essential Drupal modules

Wednesday, May 30th, 2012 | Limited, Programming, Tech

Drupal is a great PHP-based CMS (content management system), but its true power is only unleashed when you use the modules system. Out of the box, Drupal provides basic functionality for creating and publishing content with additional functionality that can be added by installing modules, you have a far more powerful system.

In fact, most of the core functionality of Drupal is provided via modules as well. Drupal ships with a series of “core” modules which, should you wish to, you can disable. So if you don’t want the menu system, search, taxonomy or the help system, you can turn all of these off.

Beyond that though, Drupal can be extended significantly thanks to its reach ecosystem of modules (or plugins if you will) that provide significantly more functionality than the core system ships with. While you’ll need to find the right modules to match your needs, there are several that are considered the staple diet of Drupal developers.

Chaos Tool Suite
It may not look like anything special to get started with, but CT Tools provides an expensive range of APIs and systems which make developing with Drupal easier. It’s a platform to use when developing your own modules but also serves as a dependency for many other modules.

Views
The most installed module of any on the Drupal website, and it’s easy to understand why. Views is an incredibly powerful module which allows you to create custom pages that do various tasks – such as listing out a content type, sorting things a certain way, creating archives and many other tasks.

Entity Reference
At some point you will probably want to reference one entity to another. For example, on the Know Leeds website we have places and we have restaurant reviews. For each restaurant review we write, we want that to be linked to a certain restaurant (a place), and we do this with Entity Reference.

Pathauto
If you think you’re getting an exciting Greek named module, think again – it’s just the words path and auto put together. But it’s still a very useful module as it automatically creates friendly URLs without you having to type something in.

By default, Drupal won’t create a node reference for an article, it will just use the ID. You can override this by typing in something like article-title, but Pathauto will do this automatically. It’s good to install this from the start as it allows you to set up patterns for articles, categories and other systems so that you have uniform URLs across your site.

CAPTCHA and reCAPTCHA
reCAPTCHA is a fantastic took that stops spam and helps translate books at the same time. Using these two modules you can add reCAPTCHA to your site to stop spam bots registering accounts.

Taxonomy menu
This allows you to build an automatic menu out of a taxonomy set. So if you have categories as part of your taxonomy and you want to create a menu that automatically lists each category, this module will do it.

Drupal basics in under five minutes

Tuesday, May 29th, 2012 | Limited, Programming, Tech

Drupal is probably the best PHP-based CMS (content management system) on the market today. However, because it has a somewhat steeper learning curve than other systems, where you can just install and start creating content, it is easy to get frustrated with it and give up.

However, a short amount of time getting your head round the basics should be enough to show you that Drupal has some really powerful features which make it a far better CMS than those that simply allow you to drop text into pages.

We used Drupal to build Know Leeds and it allowed us to quickly and easily put together a functional site that allowed the non-technical contributors to get to grips with the system.

Content types
Because most people are familiar with WordPress, I’m going to use that as a comparison throughout this article. If you’re not familiar with WordPress, don’t worry, because most, if not all of the terms used are generic concepts that you will be able to understand anyway.

In WordPress, you have two types of content – posts and pages. Posts are the bread and butter of what was traditionally a blogging only system. Pages, are similar, but are static and don’t go into the date-based archives.

In Drupal, you get to define your own content types. It comes pre-configured with an article (similar to a post) and static page content types, but where you go from there is up to you. There are two good examples of where we used this in Know Leeds.

Firstly, we added a content type for “Restaurant Review”. This is similar to the Article content type, but we wanted to add some additional fields to Restaurant Review that didn’t want to be in Article – a star rating and a categorisation of what type of food the restaurant served.

Secondly, we added a content type for “Place”. We offer listings of local bars, clubs and restaurants on the website and if you think about it, an entry for one of these is basically just a piece of content. But with different needs than an article – we need address, phone number, email address, etc. So we created a custom content type for that too.

Fields
As I discussed with our custom content types, we wanted to customise the field types on our content types. In WordPress there are a number of fields – title, body, published date, categories, etc. In Drupal, you have the same thing, but you can create your own fields and match them to each content type.

So for the Restaurant Review content type we added a star rating field. This allows the editor to enter a numeric value between one and five. We also added a Cuisine content type which allows them to pick what kind of food it is. This works just like the WordPress categories system, except we can have multiple types of categories and we can pick which content types they apply to!

Taxonomy
In WordPress, there are two types of taxonomy – categories and tags. In Drupal, surprisingly enough, you can define your own. As I’ve already discussed, we created a Cuisine taxonomy and added a list of different terms (or categories if you will) such as French, Italian and Steak House.

Drupal allows you to create as many different categorisation systems as you wish and apply them to the content types as appropriate. We only wanted Cuisine to apply to the Restaurant Review content type for example, but Category might apply to both Article and Restaurant Review.

Blocks
Units of content which can be placed somewhere in your layout are called Blocks. The nearest equivalent to this in WordPress is the “widgets” system where you can drop widgets in and out of the sidebar.

Drupal comes with some standard blocks such as user login and search form, and many of the modules you can add into Drupal will add some blocks too – adding the forum module will add an “active forum topics” block for example. Of course, you can create your own custom blocks too.

You can then define where these appear – first sidebar, second sidebar, footer, navigation menu, etc, by selecting their position from the blocks menu. You can even do this on a theme by theme basis – on one theme you may want the search form to go in a sidebar for example, in another theme you may want it to go at the top or bottom of the page.

Unlike the widgets system in WordPress though, everything is a block in Drupal! Even the main page content so for some reason if you wanted to make your footer text display in the centre of the page and your main content display in your sidebar – you’re just a couple of clicks away from that!

Menus
Menus probably need the least explaining of all – it allows you to create menus which people can navigate around the site with. It is worth noting though, that items don’t appear in the menu automatically – you have to request that a piece of content (usually a static page) is given a menu link when creating or editing that piece of content.

Of course, you can create as many different menus as you want, assign different content (or any other links you want to add!) to different menus, and have the menus display in different places around your layout using the blocks system.

Conclusion
I hope this has presented you with a quick introduction to the fundamental concepts of Drupal. It is far more customisable that most other popular content management systems and as such has a steeper learning curve, but far more flexibility once understood.

Accepting praise

Monday, May 28th, 2012 | Success & Productivity

Reading Toastmasters International magazine is always an interesting experience. Nobody is using the world cult, but it’s so self congratulatory that as Elina points out, if you replace the word Toastmasters with the word Jesus most of the articles read as if they were specifically written to evangelise Christianity, without further modification.

Among the stories about just how brilliant a decision it was for Lenny from Texas to join his local group, was an interesting article accepting praise and comments after giving a speech.

Like I’m sure many people do, I try to be modest when receiving feedback after a speech. People often come up to you and tell you how good it is, and I always point out where I went wrong or which bits I didn’t think had really worked out.

However, the article suggests that this in fact a little impolite. After all, they are offering genuine feedback about how good they thought it was, and you’re contradicting them. It suggests a much better way to handle such comments is simply with a smile and a thank you.

Know Leeds re-launches

Sunday, May 27th, 2012 | Limited, News

Know Leeds

I’m pleased to announce the re-launch of Know Leeds, your guide to city centre living. The site has been going for six years now and was in much need of a refresh. It now has a stronger focus on restaurant reviews, but still has listings as well as local news and more to come.

Car insurance for young drivers

Saturday, May 26th, 2012 | Religion & Politics, Thoughts

Recently, there has been news coverage regarding the cost of car insurance for young drivers.

Everyone is asking how we can bring down the price for young drivers. Nobody seems to be asking whether the price is legitimately high because that is just how much it costs, but lets ignore that obvious question and assume that the prohibitive costs for young drivers are an issue that needs to be addressed.

If so, one easy way to bring down the cost for young drivers would be to ban insurance companies from discriminating based on age.

What way, everyone would pay the same regardless of how old they were. Of course, insurance companies would still be free to charge people higher premiums based on their driving history – if you’ve had an accident you pay more, if you have no claims you pay less. But it stops the companies charging people more just because of their age alone.

You can argue that it makes sense to make young drivers pay more because they are more likely to have an accident, but this is not a fair system. Why? Because it is entirely unfair to the young drivers who do drive safely. Why should they pay more for other people’s reckless behaviour?

This is almost the same situation as it was with insurance companies discriminating based on gender, and this has now been recognised by the EU and will be illegal from the end of this year. You can’t charge someone more for car insurance because of an arbitrary characteristic, such as gender or race.

People get angry when they think about young drivers costing them more money on their insurance premiums. But this isn’t the case! Young drivers don’t cost you any more money. Only reckless drivers do. A young driver who never crashes and doesn’t claim on their insurance doesn’t cause your premiums to go up. Whereas a 50 year old who does crash, does cause your premium to go up. To blanket blame an entire demographic because of the actions of a minority is both ludicrous and morally wrong.

The one argument I think might carry some weight is the argument that it is fair to charge young drivers more because we’re all young at one point and then we all get old, so everyone gets the same fair deal in the end. However, I’m not sold on this being a better solution than banning age discrimination altogether, in which everyone gets the same fair deal, all the time.

Podcasting returns

Friday, May 25th, 2012 | Life

Huzzah I hear you cry! Yes, I’m please to announce three new episodes of the podcast are on their way – the first one is available today, and the next two will follow on consecutive Fridays. This series features expert insight from Norm “The No Man”, Hugh and James (now possibly known as “Old James” given there is a new A-Soc president also called James).

I didn’t take any photos while we were recording, so here is a stock picture of Hugh.

Hugh

Funniest thing I’ve seen in weeks

Thursday, May 24th, 2012 | Photos, Religion & Politics

Joke

Credit to The World Through My Specs.

Super Moon

Wednesday, May 23rd, 2012 | Photos

Super Moon

You may have recently noticed that the Moon was quite close to the Earth recently (in relative terms). The media jumped on this and described it as a Super Moon. Unfortunately, the lack of a decent telephoto lens on my camera prevented me from capturing it in all it’s glory.

How we built Village Chief

Tuesday, May 22nd, 2012 | Limited, Programming, Tech

We recently launched Village Chief, a Facebook game in which you take on the role of a local village chief with the aim of growing your community into a thriving settlement.

The project was designed from the ground up to be highly scalable – Facebook cames can go viral very quickly so you need a system which can scale up very quickly if your game suddenly becomes very popular, or you risk losing out on huge amounts of market capitalisation.

First off, it’s written in Ruby. Ruby is a cool scripting language that is similar to Python and it’s popular web framework Ruby on Rails has received a lot of praise being the framework that Twitter and 37signal’s suite (Basecamp, Highrise, etc) are written in. It’s a very forgiving language, even compared to PHP, so if you like your static typing consider Scala instead, but for rapid web development, Ruby is a gem.

Despite the popularity of the Rails framework, I was looking for something a little more lightweight, so Village Chief is built using Sinatra. The documentation is a little under developed, but is never the less sufficient to get buy and lets you get a web application up and running nice and fast.

Ruby also includes a great module system called Ruby Gems (spot the earlier pun now 😉 ), a system similar to PHP’s PECL. The game makes heavy use of these – for example, using Koala to interact with Facebook and Dalli to handle our caching.

For a datasource, it made sense to use a NoSQL solution. I originally settled on Apache Cassandra. It doesn’t have the flexibility or functionally of Mongo but it terms of raw speed it’s hard to beat and scales onto multiple servers with eventual consistency beautifully.

When it came to deployment, I decided to go with Amazon AWS’s DynamoDB instead. I’ll discuss more about why this was later but this meant rewriting the database interaction. This was easy to do thanks to our database abstraction layer and allowed us to continue using Cassandra for our testing systems while rolling out the production environment on DynamoDB.

Some data was also rolled out using SQLite. This was used for data such as the product catalogue which doesn’t contain user data – just things you can buy. Keeping it in an SQLite database allows us get quick access while still being able to query against the records – and importantly, allows us to version control our product catalogue.

To keep the database load down, some of the sorting was moved into the web server layer instead. On top of this we built a caching system using Memcache to save a lot of the data in memory, thus making things much faster.

When it came to deployment, I decided that Amazon’s EC2 cloud. You can start up a new server in under a minute, which is fantastic for scalability. Thanks to Amazon’s Elastic IPs, you can maintain a set of public IPs and map them to any one of your EC2 servers.

The servers are based on the latest Ubuntu release and to make sure that they are delivering content at top speed, I choose to go with the nginx web server rather than Apache, which works in conjunction with Passenger to provide the platform.

One limitation of EC2 is that you either have to allocate EBS (Elastic Block Storage) which adds additional cost, or use the ephemeral storage which you lose every time you turn the box off. The solution? Put everything into an external database so that we can switch boxes on and off without a problem – hence the decision to use DynamoDB rather than running Cassandra on the servers.

Code is then deployed using Capistrano which goes onto each of the boxes and performs a structed deployment that you can easily roll back, pulling the code direct from our Git repository.

That is a whistle stop tour of the technologies used in Village Chief. If you have any questions about any of them, feel free to post a comment.