Category Archives: Technology

This all-encompassing category covers hardware, software and anything fun in-between

Building a budget VMWare ESXi server

The Background

One of the projects that I’ve been working on recently requires a lot of interaction between different systems, and in order to roll-out changes and carry out integration testing I needed a replica of our production environment.  However the challenge was that it required 7 machines to replicate production.

In the past I’ve happily run a few virtual images on my desktop machine, albeit paired back to 500MB RAM each.  But 7, there’s no way that’s going to run on my current desktop, even if I had enough RAM.

So I decided it was time to invest in some hardware to give me the flexibility to build larger virtual environments.

This is where VMware’s awesome ESXi product comes in (which I see has now been renamed to vSphere Hypervisor 4.1).

ESXi 101

I won’t repeat what many excellent blog posts have already said about ESXi, but essentially it’s a small operating system which can run multiple virtualised machines on top it – by providing a virtual hardware layer to the virtual machines, it can share the underlying physical system resources out. The sweet thing about this is that you can start and stop virtual machines in a matter of seconds, and very easily duplicate machines. So on one reasonably powered server, you can run a bunch of virtual machines thereby reducing your hardware overheads.

This kind of approach is great both for business line systems and development environments.  I will of course be using it for the latter.

The Hardware

One of my big concerns was getting compatible hardware, and not paying too much for it. After some Googling and talking to fellow geeks I settled on the HP Proliant ML110 G6.  This is an entry level HP server and the base build comes with a 250GB SATA drive and 1GB RAM.

Whilst I couldn’t do much about the processor, the main two limiting factors were the disk space and RAM.  Most of the virtual machines I want to create are circa 50GB each, so 250GB would run out very quickly.

Therefore I made two upgrades: I bought a Western Digital 1TB ‘green’ SATA drive (only 5400 RPM) and 8GB RAM (2x4GB).

I bought the server and the SATA drive from eBuyer and the RAM from Crucial – total spend approximately £400.

Installation

With the new hardware in place I needed one other item – a 2GB USB stick.  Yes, to make life easier you can install and boot ESXi from a USB stick, rather than take up space on your image storage drives. And the HP machine’s motherboard came with an on-board USB socket – so I simply plugged the stick into the motherboard.

I initially installed the special HP version of ESXi – supposedly it is preferable because it comes with all of the HP drivers.  However after one hour of running I discovered the kernel had performed a memory dump, and after several reoccurrences I ditched it and went back to the vanilla ESXi image and haven’t had any problems since.

Once booted it’s best to assign a static IP address to your ESXi box and then that’s it – I’ve stashed mine away in the garage.

Day-to-day use

My ESXi Server (on the right)Once the server is set up you can forget about needing to be near it, as you do everything from the equally awesome (although sometimes annoyingly sluggish) VMWare vSphere Center program. This tool allows you to create new virtual machines, upload ISO images to the datastore (you’ll need these to install any software, i.e. the operating systems for your virtual machines).

So now when I’m ready, I fire up my the virtual lab in question and I can happily run all 7 virtual images on 1GB RAM each.

And when I’m ready, I can max the RAM up to 16GB!

Happy ESXing!

Another useful reference:

Techhead – Installing VMWare ESXi 4.0 on a USB Memory Stick

Advertisements

Synchronising Highrise, Basecamp and Google Shared Contacts–Part 2

Background: In Part 1 of this series I wrote about a recent project that I worked on to synchronise contact data between a number of web applications, and how I had to work around the (current) shortcomings of their APIs.

As Scott Hanselman says, “talk is cheap – show me the code”.  So here we go…

Basecamp & Highrise APIs

Implementing an interface to the Basecamp & Highrise APIs is relatively straightforward – I did it using PHP’s curl().  My implementation doesn’t support all of the API’s functions, but you should be able to easily add any additional calls that you need.

The functions centre around a single function which does the hard work on making the request:

private function _getData($uriExtension) {
$base_url = $this->url.$uriExtension;
$session = curl_init();
curl_setopt($session, CURLOPT_URL, $base_url);
curl_setopt($session, CURLOPT_USERPWD, $this->apiKey.':X');
curl_setopt($session, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_HTTPGET, 1);
curl_setopt($session, CURLOPT_HTTPHEADER, array('Accept: application/xml', 'Content-Type: application/xml'));
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($session, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($session, CURLOPT_FRESH_CONNECT, true);
$response = curl_exec($session);
curl_close($session);
$xmlObj = new SimpleXMLElement($response);
return ($xmlObj);
}

Google Shared Contacts

This was simply done using the Zend GData classes which you can grab here.  Here’s some sample code for updating a shared contact in Google:

$client=$this->googleClientAuth('cp');
$client->setHeaders('If-Match: *');
$gdata=new Zend_Gdata($client);
$gdata->setMajorProtocolVersion(3);
// get the existing contact.
$query = new Zend_Gdata_Query($id);
$entry = $gdata->getEntry($query);
$xml = simplexml_load_string($entry->getXML());
// update title.
$xnl->title = $title;
// update the fullname.
$xml->name->fullName = $title;
// update entry.
$entryResult = $gdata->updateEntry($xml->saveXML(), $entry->getEditLink()->href);

Get more details over at the Google Apps Shared Contacts API page.

Basecamp & Highrise – Filling in the API gaps

So the big problem with the Basecamp & Highrise APIs is that they have bits missing – rather significant bits it turns out.  In particular the ability to create and update companies.

To get around this I wrote a couple of classes that use a combination of curl() and the awesome phpQuery to walk through the front-end pages and execute URLs just as a real user would.

Whilst this is not impervious to UI changes by 37Signals, it’s a fairly generic implementation and it’s a best endeavours approach given the current lack in the APIs.

Here’s some sample code:

public function createCompany($companyName) {

$success = true;

// go to the company page first, to get the token.
$resp = $this->_fetchUrl($this->_urls['base'].$this->_urls['companies'], 'GET', array(), false, $this->_ch);

phpQuery::newDocument($resp['data']);
$authToken = pq('input[name=authenticity_token]')->val();

$formFields = array(
'authenticity_token' => $authToken,
'company[name]' => $companyName,
'commit' => 'Create Company'
);

$resp = $this->_fetchUrl($this->_urls['base'].$this->_urls['companies'], 'POST', $formFields, false, $this->_ch);

// check - has this company already been created?
phpQuery::newDocument($resp['data']);
if(pq('div.flash_alert')->text() != '') {
$success = false;
$this->_errMsg = pq('div.flash_alert')->text();
}

return $success;
}

Show me the code!

So, in the hope of helping others to get synchronisation working (and work around the lack in the APIs) you can download the code at GitHub for your own use.

Enjoy!

Synchronising Highrise, Basecamp and Google Shared Contacts–Part 2

Background: In Part 1 of this series I wrote about a recent project that I worked on to synchronise contact data between a number of web applications, and how I had to work around the (current) shortcomings of their APIs.

As Scott Hanselman says, “talk is cheap – show me the code”.  So here we go…

Basecamp & Highrise APIs

Implementing an interface to the Basecamp & Highrise APIs is relatively straightforward – I did it using PHP’s curl().  My implementation doesn’t support all of the API’s functions, but you should be able to easily add any additional calls that you need.

The functions centre around a single function which does the hard work on making the request:

private function _getData($uriExtension) {
  $base_url = $this->url.$uriExtension;
  $session = curl_init();
  curl_setopt($session, CURLOPT_URL, $base_url);
  curl_setopt($session, CURLOPT_USERPWD, $this->apiKey.':X');
  curl_setopt($session, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($session, CURLOPT_HEADER, false);
  curl_setopt($session, CURLOPT_HTTPGET, 1);
  curl_setopt($session, CURLOPT_HTTPHEADER, array('Accept: application/xml', 'Content-Type: application/xml'));
  curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($session, CURLOPT_SSL_VERIFYPEER,false);
  curl_setopt($session, CURLOPT_FRESH_CONNECT, true);
  $response = curl_exec($session);
  curl_close($session);
  $xmlObj = new SimpleXMLElement($response);
  return ($xmlObj);
}

Google Shared Contacts

This was simply done using the Zend GData classes which you can grab here.  Here’s some sample code for updating a shared contact in Google:

$client=$this->googleClientAuth('cp');
$client->setHeaders('If-Match: *');
$gdata=new Zend_Gdata($client);
$gdata->setMajorProtocolVersion(3);
// get the existing contact.
$query = new Zend_Gdata_Query($id);
$entry = $gdata->getEntry($query);
$xml = simplexml_load_string($entry->getXML());
// update title.
$xnl->title = $title;           
// update the fullname.
$xml->name->fullName = $title;
// update entry.
$entryResult = $gdata->updateEntry($xml->saveXML(), $entry->getEditLink()->href);

Get more details over at the Google Apps Shared Contacts API page.

Basecamp & Highrise – Filling in the API gaps

So the big problem with the Basecamp & Highrise APIs is that they have bits missing – rather significant bits it turns out.  In particular the ability to create and update companies.

To get around this I wrote a couple of classes that use a combination of curl() and the awesome phpQuery to walk through the front-end pages and execute URLs just as a real user would.

Whilst this is not impervious to UI changes by 37Signals, it’s a fairly generic implementation and it’s a best endeavours approach given the current lack in the APIs.

Here’s some sample code:

public function createCompany($companyName) {

    $success = true;

    // go to the company page first, to get the token.
    $resp = $this->_fetchUrl($this->_urls['base'].$this->_urls['companies'], 'GET', array(), false, $this->_ch);

    phpQuery::newDocument($resp['data']);
    $authToken = pq('input[name=authenticity_token]')->val();

    $formFields = array(
        'authenticity_token' => $authToken,
        'company[name]' => $companyName,
        'commit' => 'Create Company'
    );

    $resp = $this->_fetchUrl($this->_urls['base'].$this->_urls['companies'], 'POST', $formFields, false, $this->_ch);

    // check - has this company already been created?
    phpQuery::newDocument($resp['data']);
    if(pq('div.flash_alert')->text() != '') {
        $success = false;
        $this->_errMsg = pq('div.flash_alert')->text();
    }

    return $success;
}

Show me the code!

So, in the hope of helping others to get synchronisation working (and work around the lack in the APIs) you can download the code at GitHub for your own use.

Enjoy!

Synchronising Highrise, Basecamp and Google Shared Contacts–Part 1

NOTE: You can read part 2 here or just simply get the code.

I recently worked on a project where we needed to synchronise contact data between Highrise CRM (the source), Basecamp (for project management) and Google Shared Contacts (for email).  This is a common issue for small businesses – how to keep disparate systems in sync.  There are already some proprietary systems out there which help with this but they didn’t fulfil the needs of this client so we opted for a custom tool.

I’ll write up the steps I took to get all of this working in a series of posts, but the overall architecture is thus:

image

Feasibility

At the time of writing I determined the feasibility of synchronising all of these three systems by looking in detail at the APIs provided.  I’ve summarised my findings here:

Google Shared Contacts

It’s worth pointing out that we needed to load up NOT Google’s personal contacts, but the domain shared contacts.  This is a repository of contacts that Google provides on its Google Apps product, and works like a Global Address List, providing a single store of contact data to all domain users.  However, for some puzzling reason Google does not provide any user interface to manage this database.  Instead you must use the Google Shared Contacts API.

IMPORTANT POINT: I got very confused as to which versions of Google Apps supports the Google Shared Contacts API. Even though the documentation pages state that it is only supported by Apps for Business (Premium) and Education, the confusing point is that YOU CAN EXECUTE THE API CALLS SUCCESSFULLY and the data IS PERSISTED.

What I later discovered was that although all of the API calls work, the data is not exposed in Google Apps.  This is very frustrating and I wish Google would make this clearer in their documentation.

Also don’t get confused between the Google Contacts Data API and the Google Shared Contacts API.

Highrise & Basecamp

Both of these products are made by 37Signals, and if you’ve ever read their books, you’ll know that they are keen proponents of open systems.  They have well documented APIs which are very easy to get up and working with.

However, when you start to use them, you discover that some key elements are missing. The APIs they have provided allow you to get all information out, but when it comes to creating data, the calls just aren’t there. Despite numerous forum posts, 37Signals have not yet given good reasons for the lack of these API calls.

To get around this, I wrote a cheeky HTTP GET, Parse and Re-POST class which effectively walks through the front-end of the site programmatically, as if it were a standard user. Whilst this has been very stable so far, if either of the products publish changes to their UI then this code may need modification.

Coding Approach

I wrote all of the code in PHP 5, so all the samples here will be in PHP, but you could easily apply the concepts to different programming languages.

I built singelton classes for each of the products, and then a controlling class to tie them up all to achieve the synchronisation. I used PHP curl() to do the web requests, and for the Google API stuff I used Zend’s GData classes to speed up the development.

Synchronisation Approach

In order to synchronise these systems I took the following approach:

  • Get all Highrise Contacts
  • Add to Basecamp, storing the IDs of the two data objects in a synchronisation file
  • Add to Google Contacts, storing the ID of the Highrise Contact in the Notes field

Next Steps

In the next post I’ll start introducing the code I wrote to hook up to the Basecamp and Highrise APIs.

Synchronising Highrise, Basecamp and Google Shared Contacts–Part 1

NOTE: You can read part 2 here or just simply get the code.

I recently worked on a project where we needed to synchronise contact data between Highrise CRM (the source), Basecamp (for project management) and Google Shared Contacts (for email).  This is a common issue for small businesses – how to keep disparate systems in sync.  There are already some proprietary systems out there which help with this but they didn’t fulfil the needs of this client so we opted for a custom tool.

I’ll write up the steps I took to get all of this working in a series of posts, but the overall architecture is thus:

image

Feasibility

At the time of writing I determined the feasibility of synchronising all of these three systems by looking in detail at the APIs provided.  I’ve summarised my findings here:

Google Shared Contacts

It’s worth pointing out that we needed to load up NOT Google’s personal contacts, but the domain shared contacts.  This is a repository of contacts that Google provides on its Google Apps product, and works like a Global Address List, providing a single store of contact data to all domain users.  However, for some puzzling reason Google does not provide any user interface to manage this database.  Instead you must use the Google Shared Contacts API.

IMPORTANT POINT: I got very confused as to which versions of Google Apps supports the Google Shared Contacts API. Even though the documentation pages state that it is only supported by Apps for Business (Premium) and Education, the confusing point is that YOU CAN EXECUTE THE API CALLS SUCCESSFULLY and the data IS PERSISTED.

What I later discovered was that although all of the API calls work, the data is not exposed in Google Apps.  This is very frustrating and I wish Google would make this clearer in their documentation.

Also don’t get confused between the Google Contacts Data API and the Google Shared Contacts API.

Highrise & Basecamp

Both of these products are made by 37Signals, and if you’ve ever read their books, you’ll know that they are keen proponents of open systems.  They have well documented APIs which are very easy to get up and working with.

However, when you start to use them, you discover that some key elements are missing. The APIs they have provided allow you to get all information out, but when it comes to creating data, the calls just aren’t there. Despite numerous forum posts, 37Signals have not yet given good reasons for the lack of these API calls.

To get around this, I wrote a cheeky HTTP GET, Parse and Re-POST class which effectively walks through the front-end of the site programmatically, as if it were a standard user. Whilst this has been very stable so far, if either of the products publish changes to their UI then this code may need modification.

Coding Approach

I wrote all of the code in PHP 5, so all the samples here will be in PHP, but you could easily apply the concepts to different programming languages.

I built singelton classes for each of the products, and then a controlling class to tie them up all to achieve the synchronisation. I used PHP curl() to do the web requests, and for the Google API stuff I used Zend’s GData classes to speed up the development.

Synchronisation Approach

In order to synchronise these systems I took the following approach:

  • Get all Highrise Contacts
  • Add to Basecamp, storing the IDs of the two data objects in a synchronisation file
  • Add to Google Contacts, storing the ID of the Highrise Contact in the Notes field

Next Steps

In the next post I’ll start introducing the code I wrote to hook up to the Basecamp and Highrise APIs.

Fact Facts – Stats and views on the world’s largest social networking site

As Facebook celebrates 500 million users (yes, that’s half a billion), I’ve been thinking about the impact of this 5 year old website, which is now so much more than just a website. It’s founder Mark Zuckerberg, just 26 years old (a year younger than I), has relentlessly steered his company through numerous twists and turns with more often than not a deft hand for creating a globally successful product.

In Time magazine’s Person of the Year 2010 article (naming Mr Zuckerberg as the accolade’s holder), a few startling facts stand out which help in painting the picture of the sheer scale and reach of Facebook. Currently 700,000 people every day are signing up to Facebook. Each month an additional 1 billion items of content are added. Facebook has been translated (and is used) in over 75 languages, and if it were a country, it would be the third largest in the world.

Zuckerberg has turned down numerous offers for the company, reaching $1 billion not so many years ago. He is clearly not motivated by the pull of wealth. No, he seems solely focused on building an ever more successful product that encourages its users to be ever more open with their thoughts, preferences and lives.

What impact is/will Facebook have on our society? On Facebook everyone that you are connected to is labeled with the singular mark of friend, although we all have different depths of friendship, and some Facebook friendships are little more than outdated notions of acquaintance. Does Facebook encourage me to be more open? Perhaps not, but maybe it does provide me with a more convenient way to push my thoughts out there, letting others decide which of those they wish to consume. It is certainly a more liberal approach to friendship.

Browsing through endless photo streams and keeping an eye out for other users’ activity can be an addictive pass-time, it can certainly feed boredom. Despite its liberal tendencies, it does not well facilitate intelligent discussion, more simply a juvenile expose of the latest thought that drops into one’s head. Considered opinion and researched thought do not find an easy home on Facebook, and so as a measure of our maturity and our society’s ability to build philosophical views, it is grossly devoid of such wrangling, instead valuing every thought and emotion as equal.

For those who can discern the difference this is of little problem; we know when there is a time for presenting our minute old feelings and we know where to go for meaningful discussion and debate. But for the generation growing up with Facebook, will they know any differentiation? Will personal trivia become the staple diet of our relational connections?

Having now finished reading “The Facebook Effect“, it is clear that Mark Zuckerberg’s deep conviction is to encourage openness, and contrary to Google’s approach of pulling information, Facebook allows individuals to push the information that they wish to share, and decide who they wish to share it with. The later of these emphases is held lightly by Zuckerberg, with the long-run hope that people will become less concerned with whom they are sharing with, and make such left wing contributions for the good of the world.

As Facebook sets its sights on 1 billion users, we will need to question even further our identity, and just what we are projecting through electronic forms, and of that projection, what are we willing to stand for in the flesh.

The Future of Desktops and Web Development

[tweetmeme source=”shuggill” only_single=false]

For the past twenty years the IT industry has been dominated by one company, Microsoft, and for good reason. They developed awesome software which helped to bring computing to the masses, and with the birth of the internet they impressed upon us all the Microsoft way of thinking: we are the experts so we build the entire system (OS, Desktop Packages, Server Tools, Networking) and you, the user, drink it all in. A whole industry of expert support grew up around it and many users became IT experts over time as they toyed with their new hardware and the latest releases of Windows.

On the flip-side was the Linux way of thinking, which is far less integrated and less centrally controlled. We provide a base platform (the Kernel) and on top of that uber-geeks contribute single function utility applications that make everything work. The end user (or system builder) can then choose and customise every item to suit their needs.

Bill Gates’ vision for the 90s was to see a PC in every home. Now that we are well into that vision, what will be the compelling vision of the teens and twenties ahead of us?

Being a web developer requires that I have a number of specialist tools for the job: an IDE to write and debug code in, some basic graphics packages, browsers to test in, some form of source control and database management. Also being a professional I need an email client, contact management/CRM, calendars, project management tools, document editing tools, invoicing tools and financial management tools.

I’ve long been a Microsoft convert. My first programming language was Visual Basic, and I’ve cut my professional teeth writing ASP and ASP.NET web applications. However I also have extensive experience with PHP, Linux and MySQL. To run all of my professional life I currently have:

A desktop PC and a laptop both running:

Windows 7 (OS)
MS Office 2010 (Documents)
Visual Sutdio 2010 (.NET IDE)
SQL Server 2008 R2 Express (Database & DB Management)
Mercurial (Source Control)
Paint.NET (Graphics)
– Google Chrome, Firefox, Safari, Opera, IE 9, IETester (covers IE6, 7 & 8 for testing), iPhone Emulator
Netbeans (PHP/Ruby IDE)
IIS (.NET and PHP webserver)
MySQL (Database)
phpMyAdmin (Database Management)
– I use Google Apps for email and calendars
– I use Basecamp for project management
– I use Highrise for CRM

That’s a lot of software to maintain, keep up-to-date with and sync between my two main workstations. And if I’m not at either of those machines, I’m limited to email and calendaring on my iPhone. Whilst I can work in most places using the laptop, it’s a fairly specialist set up.
I would guess that the same is true for most web developers out there.

The advances in technology (and in many other areas) are possible because new layers of abstraction are added. For application developers new operating systems and CPUs give more options and capacity to do greater things – they increasingly:

– know less about the underlying technology
– assume that it is there and “just works”

With the advent of cloud computing the notion of “it just works” and “it’s in the cloud” are ever more enhanced. Sites can use services like OAuth to provide authentication from some of the major service providers (read: Google/Facebook). Disk space, CPU, servers are all becoming commodity items and web developers are increasingly in the position of not caring about the underlying hardware. In fact, it’s more than a case of not caring – it’s becoming essential not to care, as you need the time to focus on building great applications in this competitive marketplace.

Development frameworks are also making it much easier to get on and build applications. ASP.NET, PHP and Ruby (to name a few) all have well matured and generally very good frameworks available which speed up development no end.

When you start working with these frameworks you start to not care about what’s inside, or how the function “buildInputBox” was written – the fact is you start to rely on the simple fact that it is there and it works. You trust that whoever wrote the underlying framework, designed that CPU or built that cloud hosting platform knew what they were doing and optimised it for you. With all the time saved from not having to compile Linux kernels, write monkey code (e.g. buildInputBox) and design a redundant hosting platform, application developers can invest much more into creating great online experiences.

To this end I have started questioning two things: what will the future of desktops look like, and how we will build the next generation of applications?

Let me attempt to share some thoughts on these.

My vision is not orientated around a company, or the Open Source / Closed Source argument. I don’t expect everything to be free, and in fact serious business cannot be sustained through the free models – there has to be a revenue stream (and I’d rather it wasn’t all advertising based). Also, business critical operations require an incentivised commitment to service, and what better incentive than money?

I think the day of the desktop OS as a rich environment is dead. Why do I need to run 20 different applications, keep them all updated with patches and new releases and go through the awful pain of a system rebuild every 6 months? Most of my work is now connected to other systems in some way, all via the Internet. If I unplugged my network cable and tried to work I would probably last about a day before I needed to connect up either for testing, collaboration or just to get some help.

My future PC will be a highly powered web browser. I will connect to everything in the cloud, and the browser will be my cross-platform standardised access point to it all. This means that I can literally work from anywhere. No one will expect to be working without an Internet connection. More and more environments are meeting consumer demands by providing Wi-Fi access points so that we are always connected.

From my web browser I will be able to do everything listed above. It will become a new layer of abstraction. I will assume the PC “just works”. I will be able to access everything from different types of device – my tablet, my smart-phone, my laptop, a computer interface built into a table in a cafe.

This poses some interesting opportunities for companies of different sizes. The big boys will fight it out to run the infrastructure needed for all of this – i.e. the servers, connectivity and base services (like authentication) that all new applications will rely upon.

I have no doubt that the likes of Google and Facebook will be positioning themselves to become baked in as a layer of abstraction – their challenge will be reminding people that the infrastructure is crucial and needs to be paid for.

For small application developers however this is an exciting time. There will be much less to be distracted with – maintaining computer systems, patching software and limiting where you can work. It’s all infrastructure that should just work.

Everything in the Cloud

The new world is outsourced and cloud based. Although this means perhaps more disparate systems (e.g. how do you share contact information between Basecamp and Highrise?) these challenges will be overcome by new standards and another layer of abstraction – all of your contact information will live somewhere and just “be available”. Code will be written and tested in the cloud, since it’s going to be deployed there anyway. Designing will move beyond the confines of Photoshop into sketching and then building out into simple web prototypes.

The next generation of applications will start to make full use of the over-powered desktop PCs that are sitting in everyone’s homes and offices with bags of unused capacity. Web applications will be able to reach out of the browser and touch the hardware devices that the user has. Facial and audio recognition will be possible as authentication methods and drawing devices will make roughing up ideas quick and easy. Browsers will provide simple interfaces to these items, no more arcane Active-X controls or specialist plugins.

Web Browsers

On the subject of browsers, they are all starting to converge. The long cry from web developers to adopt standards is starting to be heard, with the major web browsers supporting most of the W3 standards. Instead of differentiating on their level of compliance (which is now frowned upon if they don’t), browsers will have to distinguish themselves on speed and user facing features. However these will most likely fade as the features will all need to be web integrated to provide a seamless user experience across machines.

K.I.S.S.

The future is about making things simpler. I want to have less in my brain about technology. I want it to work, so that I can have time to come up with great ideas, solve difficult problems and rapidly build stuff. I don’t want to write another buildInputBox function. I don’t want to recompile Linux to get the latest PHP version working. I don’t want to take my 1U servers down to the datacentre and be my own hosting company. I want hosting and provisioning to be seamless – when I need more resources I just click. I want to be able to work anywhere in the world, and to log on to a PC and have my entire desktop in front of me, even if it means (for the moment) five different web applications firing up.

Yes I want choice, but just as I want electricity to my home, provided the price is right, I don’t care how it gets here or how it is produced*.

* Within reason! I do care about green energy, what I mean is I don’t care about transformers and the national grid and power lines and heat loss because the current is too high.

Instead I want to choose to build an app that does this or that and get on and build it as quickly as possible. We don’t yet know what new things we will be able to create when we have these new layers of abstraction in place, but I’m sure it will be cool and fun and add value in new ways.