Dave's blog

Classic Javascript Games

A post today on the Ajaxian blog about a javascript based version of Super Mario Kart, reminded me of some of the other great classic games ported to javascript. Below is a quick list based on my bookmarks and other stuff kicking around on my laptop.

I wish you luck getting away with slacking off in the office while playing these in the office.

Feel free to suggest others in the comments

A Virtual Host per Project

Not long before my old laptop got to the end of it usable lifespan I started playing with the Zend Framework in my spare time. One of the cool things about ZF is that it wants to use friendly URLs, and a dispatcher to handle all the requests. The downside of this approach, and how ZF is organised, it works best if you use a Virtual Host per project. At first this seemed like a real pain to have to create a virtual host per project. One Saturday afternoon I worked through the apache docs and found a solution - then I found it fantastic. Rather than bore you with more of my views on Zend Framework, I will explain how to have a virtual host model that requires a little work up front and is very low maintenance.

It gets tedious copying and pasting virtual host config files each time you want to start a new project, so instead I let Apache do the work for me.

I added a new virtual host config file called projects to

. The file contains

UseCanonicalName Off

LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon

<Directory /home/dave/Projects>
Options FollowSymLinks
AllowOverride All

	ServerName projects

	CustomLog /var/log/apache2/access_log.projects vcommon

	VirtualDocumentRoot /home/[username]/Projects/%1/application/www
	AccessFileName     .htaccess

The important bit is the VirtualDocumentRoot directive which tells Apache to map a hostname to a path. I use an IP address from the range for the virtual host, so they aren't accessible to the outside world and I don't have to worry about it changing every time I check locations.

All of my projects live under ~/Projects and each one gets a directory structure that looks something like this.

  +- notes - coding notes, like grep output when refactoring etc
  +- resources - any reference material or code snippets
  +- application - the code for the project
     +- www - document root for vhost

There are usually other paths here too, but they vary from project to project.

To make this work there are few more steps. First enable the new virtual host

$ sudo a2ensite projects

Don't reload apache yet.

Next you need to add the apache module

$ sudo a2enmod vhost_alias

Time to edit your

file so you can find the virtual hosts. Add a line similar to this projects phpgw-trunk.project [...] phpgw-stable.project

Now you can restart apache.

$ sudo /etc/init.d/apache2 reload

This is handy for developing client sites - especially using drupal.

Now my

is just an empty file.

I am getting a bit bored with adding entries to

all the time. If I get around to adding dnsmasq with wildcard hosts to the mix, I will post a follow up.

This setup is based on my current dev environment (Ubuntu Hardy), but it also works on older versions of Ubuntu. The steps should be similar for Debian and derivatives. For other distros, it should work, just how to make it work may be a little different. Feel free to post tips for others in the comments.

Day 2 at PHP Unconference Hamburg

I arrived back in Bergen late last night after spending another day the PHP Unconference in Hamburg. I even managed to get one speaker to do his talk in English, which made things a lot easier for me.

My brain started to adjust to German a bit more, which made things easier than on day 1. Overall I think I understood about 25% of what was being discussed, which sound like a waste of time, but that 25% was pretty good quality. Also the discussions in the corridors was great too. At the end of the day the language spoken isn't very important when compared to the ideas shared.

For me, the only attraction of web based social networks, is to provide a backup of my addressbook online. FOSS on the other hand is a global "social network" that is real. Events like linux.conf.au, the PHP Unconference in Hamburg, Bar Camp Melbourne and other similar events are a vital part of the networks - they provide the space for us to meet and discuss ideas.

I also used the trip as an opportunity to catch up with Christian Böttger, Release Coordinator for phpGroupWare. Not only did we discuss the project, but we caught up on how business and life in general was going. It is always good to catch up with Christian, I just wish I had more than a couple of hours to spare.

My next couple of events are locked in. Wednesday night is drinks with Johan Gunnarsson from phpGroupWare, at the airport in Copenhagen. Overnight Google emailed me a confirmation for the Google Developer Day 2008 in Sydney on June 18, there is some interesting stuff on there too - less FOSS centric but still seems pretty cool.

PHP Unconference Hamburg Day 1

I spent yesterday at the PHP Unconference in Hamburg. None of the sessions were in English, so that meant I really struggled with some of the sessions, while some of the others I could pick up some of it.

Between sessions I meant to meet a few people I had chatted with in IRC, but never met in meatspace. I always like to be able to put a face to a nick or blog, then have a beer or 2. This is exactly what happened last night.

I managed to land a big thick Ajax book (in English), which was pretty cool - something to read on the plane back to Australia

It is sad that phpGroupWare doesn't have the "brand recognition" it once had. Hopefully we can turn that around later this year if we get a release out.

I am skipping the morning session, and hope to catch some good sessions this afternoon.

For the record, the Norwegian company I work for isn't eZ.

Snakker du englesk?

The title will become my most used phrase over the next couple of weeks. As I bash this out, I am on the train to catch a flight to Bergen, Norway. Over the next 2 and a bit weeks I will be meeting with Sigurd and the guys from Resight to discuss the project and the next stage of development.

I will be making a side trip to Hamburg, Germany to attend the PHP Unconference on the 26/27th April. As it is an unconference, the program isn't decided, but the attendees list looks interesting.

During this trip I have decided to give twitter a try. I have had an account for almost a year, but never used it. When travelling I want to blog, but usually don't have the time, now I don't have an excuse. You can keep up on what I am doing via my twitter stream.

In more web 2.0 compliance news, I have started using my flickr account. I have installed the flick posting client on my N95. Combine that with the location tagger, it should be easy to keep track of what I was doing when and where.

At this stage I won't be linking either service into my RSS feed, but that may change if I really like them.

PS Watch this space for some geek posts in the coming weeks. I hope to blog about my new Dell D830 running AMD64 Ubuntu Hardy once I get all the issues resolved.

Google adds custom 404 handler

Tonight I was trying to get to Google translate, but was trying http://google.com/translation - which doesn't work.

Unlike last time it didn't work, Google.com now tried to suggest the right url for me, which was nice. It looks like Google has recently added a better 404 handler.

It only seems to work for google.com not google.com.au (I didn't try other local versions). Here are some examples.

  • Translation - com | local
  • Shopping - com | local
  • Crap Code - com | local
    (is google really claiming that they have no crap code?)

Interestingly URLs containing Google's more popular products/services (such as maps, mail, calendar and jobs) redirect straight to the service. As the rest of the urls are returning results based on keywords, why doesn't google just redirect them too?

I would upload screenshots, but I am in the country on a sub standard GPRS connection this week. Click the links and you can make your own screenies.

I have no idea how long this has been available, but I think it is handy and more user friendly.

Windows 8 to be Written in LOLCODE?

On Saturday at BarCamp Melbourne, Nick Hodge, from the evangelist team at Microsoft, gave a lightning talk about something that makes the geeks at MS very excited - LOLCODE.

Soon you won't need Visual Studio any more, you can just code in MSN^H^H^HWindows Live Messenger. twitter is fast becoming the distributed version control system of choice.

Afterwards I was talking to Nick about it and he suggested that Windows 8 might be written in LOLCODE. Apparently LOLCODE is a bit too cutting edge for Windows 7. You heard it here first!

For those of you still considering switching from PHP to Ruby, don't! Instead you can try out LOLCODE from the comfort of PHP. Check out Jeff Jones' implementation. Does this mean that one day you could run Windows under PHP, under Linux, now that would be a crazy new virtualisation engine.

<insert appropriate LOLCat here />

BarCamp Melbourne 2008

This weekend I am off to BarCamp Melbourne. I didn't make it last year, but I decided to make the effort this year.

I missed out on almost all of linux.conf.au, which was disappointing, but I did take Noah to the open day, which was lots of fun. I know BarCamp won't make up for it, but it should still be a good day.

I am hoping to give a talk about phpGroupWare. During my talk I will probably be showing off trunk and the YUI enhanced template that we have been working on at ReSight. You never know I might even be able to find a new dev or 70.

BarCamp should be an opportunity to meet up with a few people that I missed at LCA, and also to some that I didn't miss, including Justin, from Simple Invoices

Time permitting I should get a post BarCamp entry up next week.

Flakey BIOS in Gigabyte GA-M68SM-S2L Makes MAC Address Change on Reboot

Over the weekend I have been setting my new Mythbuntu pair, a split. back end and front end. Everything has gone pretty smoothly.

One issue I did hit was the onboard NIC on my Gigabyte GA-M68SM-S2L motherboard despite what the specs say it is a "nVidia Corporation Unknown device 054c (rev a2)" which uses the forcedeth driver. Everytime I rebooted the box the NIC would increment its interface number - eth0, eth1 ... eth6 and so on. Changing the "Smart LAN" setting in the BIOS from auto to disabled just disables the NIC, not what I wanted.

After googling I discovered that others had experienced similar problems with ASUS boards with nVidia NICs, changing their MAC addresses. Looks like Gigabyte (and ASUS) have been shipping invalid MAC addresses on some of their boards, and forcedeth isn't happy about it, so it just generates a new (valid yet) random MAC address.

With a little help from sysfs I was able to hack my udev config so it all works now. My /etc/udev/rules.d/70-persistent-net.rules looks like

SUBSYSTEM=="net", DRIVERS=="forcedeth", ATTRS{vendor}=="0x10de", ATTRS{device}=="0x054c", NAME="eth0"

I grabbed the output of "cat /sys/class/net/ethX/device/{device,vendor}" to populate the relevant ATTRS entries above.

I am not sure what you do if you have 2 onboard NICs and they are both broken.

Gigabyte (and ASUS) or nVidia should look at fixing their broken kit to save people from wasting time on this.

Update: It turns out it was a dodgy driver shipped by Ubuntu

PHP on crack

I had a chuckle while reading Ed Finkler's PHP6 wish list. After reading the comment by Damien Seguy I almost fell off my chair.

Try running the following code under PHP

<?php ${'!@#$%^&*()[]:;"<>,./?'} = "i bet this won't work!<br>\n"; ${"omg???!!! wtf???!!! :D"} = "omg it does<br>\n"; echo ${'!@#$%^&*()[]:;"<>,./?'} . ${"omg???!!! wtf???!!! :D"};

It worked here on PHP 5.2.3 with ubuntu security fixes. I got

i bet this won't work!<br>
omg it does<br>

This contradicts the PHP manual, but hey it works.