Remote Desktop Connection to a Raspberry Pi

I’ve had a Raspberry Pi since May 2012, when the first wave arrived. It’s a great device, but requires a display if not only connected to by SSH over a network. The Raspberry Pi has a HDMI output port, allowing it to be connected to a HDMI TV for display. It’s inconvenient to carry a TV around every time I wish to use my Raspberry Pi though, so I usually connect to it using a Remote Desktop connection from my Fedora 18 Linux laptop. This post gives instructions as to how I’ve set up this remote desktop connection.

Pre-requisites

You’ll need:

  • A Raspberry Pi with the Raspbian OS installed on the SD card and a user account with password
  • A monitor and HDMI cable to display the Raspberry Pi output
  • A laptop to connect to the Pi
  • A Remote Desktop client installed on the laptop
  • An ethernet cable to connect from the laptop to the Raspberry Pi
  • A VNC server already installed on the Raspberry Pi. To install a VNC server, run “sudo apt-get install tightvncserver” from a terminal on the Raspberry Pi whilst connected to a network. Then run “vncserver” from a terminal in the Raspberry Pi, where this will prompt you to set up a password for connecting to the Raspberry Pi with VNC.

Instructions

1) Connect your Raspberry Pi to the monitor, boot the Raspberry Pi and log in.
2) Open up a terminal and change directory to /etc/network (cd /etc/network)
3) First of all you’ll need to give the Raspberry Pi a fixed IP address. This is done by changing the /etc/network/interfaces file
Before changing any configuration file in /etc, you should always back up the original! Therefore copy /etc/network/interfaces to /etc/network/interfaces_old (cp /etc/network/interfaces /etc/network/interfaces_old). This way, if anything goes wrong then you can simply restore the original /etc/network/interfaces file (mv /etc/network/interfaces_old /etc/network/interfaces).
Change the contents of /etc/network/interfaces to:

auto lo

iface lo inet loopback
iface eth0 inet static
    address 192.168.200.100
    network 192.168.100.0
    netmask 255.255.255.0
    broadcast 192.168.200.25

This gives the Raspberry Pi a fixed IP address of 192.168.200.100, which you’ll need for connecting to it by remote desktop.

4) Now create a new file on the Raspberry Pi at /etc/init.d/tightvncserver and give it permissions of 777 (sudo chmod 777 /etc/init.d/tightvncserver). Add the following contents to this new tightvncserver file:

### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: networking
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts VNC
# Description:
### END INIT INFO

export USER='pi'
eval cd ~$USER
case “$1” in
start)
su -c 'vncserver -geometry 1366x768' $USER
echo “Starting vncserver for $USER”
;;
stop)
pkill Xtightvnc
echo “vncserver stopped”
;;
*)
echo “Usage: /etc/init.d/vncserver {start|stop}”
exit 1
;;
esac
exit 0

5) Run the command “sudo update-rc.d tightvncserver defaults” in a Raspberry Pi terminal. This will start automatically start a VNC server when the Raspberry Pi first boots up.

6) Now disconnect the Raspberry Pi from the monitor.

7) I connect to my Raspberry Pi from a Fedora 18 Linux desktop. After connecting the laptop to the Raspberry Pi with an ethernet cable, I then need to ensure that both machines are on the same network. In Fedora this is done by first disabling wireless on the laptop. I then navigate to the network settings page (Activities > System Tools > System Settings > Network on Fedora). I then select the Wired option and click Options to manually edit my wired network settings. This opens up a window, where I select the “IPv4 Settings” tab. I change the Method dropdown from “Automatic” to “Manual”, allowing me to manually set the wired IP address of my Fedora laptop. The Fedora IPv4 Settings window then has an Addresses table, where I click the “Add” button to add a new network entry.

I give this new entry the network settings of:

Address: 192.168.200.1
Netmask: 255.255.255.0
Gateway: 192.168.0.1

I then save these changes. These network changes ensure that the Fedora laptop and Raspberry Pi are on the same ad hoc network when connected by an ethernet cable. If you’re using another operating system to Fedora Linux, make the equivalent network setting changes to manually set the wired network address.

manual_ethernet_address

8) Start up your Remote Desktop client on your laptop. Connect with the protocol “VNC” and the IP address “192.168.200.100:5901”. You’ll be asked to enter the password you set for vncserver, then a window will open for your Remote Desktop connection to the Raspberry Pi.

remote_desktop_client

You can now display your Raspberry Pi through a laptop without needing to use a HDMI monitor.

Implicit Builder Conversion in C#

I recently attended a Leeds Sharp user group meeting on design patterns. Grant Crofton was presenting an example of using the builder pattern in tests and showed a neat trick that can be used in C# when using builders.

A builder class has a selection of “with” methods corresponding to different properties of the target object, where these are called in a chain. The final method call in this chain is then usually a Build() method that converts the builder object into the desired target object, i.e.

Order order = OrderBuilder.anOrder().withCustomer(customer).withAddress(address).withPostage(2.00).build();

I learned that by using implicit type conversion in C# with the “implicit operator” keywords, this final Build() call can be omitted. For example, here I have two NUnit test methods, the first of which uses a final Build() call for the builder object and the second which uses implicit type conversion:

[TestFixture]
class AddressTest
{
    [Test]
    public void AddressWithHouseNameAndNoNumberDisplaysCorrectly()
    {
        Address address = AddressBuilder.anAddress()
            .WithHouseName("Dunroamin")
            .WithStreet("Golden Meadow Lane")
            .WithTown("Otley St Catchpole")
            .Build();

        Assert.That(address.ToString(), Is.EqualTo("Dunroamin, Golden Meadow Lane, Otley St Catchpole"));
    }

    [Test]
    public void AddressWithNumberAndBuildingNameDisplaysCorrectly()
    {
        Address address = AddressBuilder.anAddress()
            .WithNumber("5")
            .WithBuildingName("Hipster Flats")
            .WithStreet("Ironic Street")
            .WithTown("Hipsterville");
        Assert.That(address.ToString(), Is.EqualTo("5 Hipster Flats, Ironic Street, Hipsterville"));
    }
}

The code to achieve this implicit type conversion in the AddressBuilder class is:

public static implicit operator Address(AddressBuilder builder)
{
    return new Address(builder.HouseName, builder.Number, builder.BuildingName,
        builder.Street, builder.Town);
}

The full code for this builder example is available on GitHub

Running Python unittest with command-line arguments

I’ve recently come across a problem regarding the unittest module in Python when using command-line arguments. This problem occurs both with Python 2.7 and 3.3. Here is a simple example of a Python test file my_tests.py to demonstrate this problem:

import unittest
import sys
from production_code import get_thing

class MyTests(unittest.TestCase):
    def testFirstThing(self):
        result = get_thing("first", command_line_param)
        self.assertEqual("new_first", result)

    def testSecondThing(self):
        result = get_thing("second", command_line_param)
        self.assertEqual("new_second", result)

if __name__ == '__main__':
    if len(sys.argv) != 2:
        sys.exit("ERROR: A command-line parameter must be supplied for these tests")
    command_line_param = sys.argv[1]
    unittest.main()

When I run this script with

python my_tests.py foo

, I get the following output:

Traceback (most recent call last):
  File "my_tests.py", line 18, in 
    unittest.main()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.py", line 149, in parseArgs
    self.createTests()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.py", line 158, in createTests
    self.module)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 128, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'foo'

I’d used unittest.main() many times before without issue, and it wasn’t too clear from the error message what the problem is here. What’s happening is that if command-line arguments are supplied to the test script in sys.argv, unittest tries to use these arguments as test cases. For the example above, unittest.main() is therefore looking for a TestCase object called foo, or a callable object called foo that returns a TestCase. As neither of these are present in my_tests.py, the above error is therefore occurring.

There are two ways to resolve this problem:

1) Extract the command-line arguments into separate variables and then remove them from sys.argv before calling unittest.main(). This is done by replacing the block at the bottom of my_tests.py with:

if __name__ == '__main__':
    if len(sys.argv) != 2:
        sys.exit("ERROR: A command-line parameter must be supplied for these tests")
    command_line_param = sys.argv[1]
    del sys.argv[1:]
    unittest.main()

2) Run the tests with an alternative unittest function to unittest.main():

if __name__ == '__main__':
    if len(sys.argv) != 2:
        sys.exit("ERROR: A command-line parameter must be supplied for these tests")
    command_line_param = sys.argv[1]
    suite = unittest.TestLoader().loadTestsFromTestCase(MyTests)
    unittest.TextTestRunner().run(suite)

I think that solution 1) is neater and easier to follow.

Installing FX/Ruby on Mac OS X

I’m currently teaching myself Ruby and recently needed to install the FXRuby graphical toolkit. I was initially expecting this to be as simple as

sudo gem install fxruby

However running this command on my Mac OS X 10.8 machine returned the following error output

Building native extensions.  This could take a while...
ERROR:  Error installing fxruby:
	ERROR: Failed to build gem native extension.

        /Users/dchetwyn/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/dchetwyn/.rvm/rubies/ruby-1.9.3-p194/bin/ruby
	--with-fox-dir
	--without-fox-dir
	--with-fox-include
	--without-fox-include=${fox-dir}/include
	--with-fox-lib
	--without-fox-lib=${fox-dir}/lib
	--with-fxscintilla-dir
	--without-fxscintilla-dir
	--with-fxscintilla-include
	--without-fxscintilla-include=${fxscintilla-dir}/include
	--with-fxscintilla-lib
	--without-fxscintilla-lib=${fxscintilla-dir}/lib
extconf.rb:31:in `find_installed_fox_version': couldn't find FOX header files (RuntimeError)
	from extconf.rb:134:in `'

Gem files will remain installed in /Users/dchetwyn/.rvm/gems/ruby-1.9.3-p194/gems/fxruby-1.6.25 for inspection.
Results logged to /Users/dchetwyn/.rvm/gems/ruby-1.9.3-p194/gems/fxruby-1.6.25/ext/fox16/gem_make.out

Although this error message is a little ambiguous, investigation revealed that the error was occurring because the FOX toolkit was not installed on my machine. FXRuby is a Ruby interface to the FOX graphical toolkit, so therefore requires FOX to be installed on the machine first. I already had the Homebrew package manager installed, so installing FOX was as simple as

brew install fox

Running sudo gem install fxruby a second time then successfully installed FXRuby.

Thank you GIST

This post is to say a huge thank you for the wonderful work done over the last three years by the GIST Foundation. GIST (Grassroots Innovation in Society and Technology) is a Sheffield organisation that was founded in early 2010 and sadly closed in December 2012. The aims of GIST were to provide a meeting place for those interested in technology and to improve the role of technology in wider society.

GIST was run by Jag and Hannah Goraya, Chris Murray and Ian Ibbotson. These four worked hard as volunteers and gave up a lot of their free time to build the GIST Foundation into a very successful organisation that played a huge role in the local tech community. The GIST Lab close to Sheffield train station was used by the Foundation as a meeting point for lots of technology user groups. GIST was responsible for many Sheffield geeks first meeting each other and several of these meetings led to software developers finding new jobs.

I first joined the Sheffield tech community in June 2009. I had just finished working as a postdoctoral university researcher in Mechanical Engineering at The University of Sheffield and was looking for work. I’d decided to make a career change and become a software developer. Although I’d been programming for 7 years at that point using MATLAB, Java and Python, I’d never worked in a commercial software organisation. I was aware that writing single-user scripts for scientific computation in academia was quite different to writing software commercially in conjunction with other developers.

I first began attending GeekUp Sheffield in the Showroom Cafe Bar. On my very first visit I was greeted by the organiser Jag Goraya, who took time to welcome me with friendliness and talk about my interest in software. I kept attending GeekUp Sheffield and got to know other developers. I was impressed that these were people who gave up their own time to improve their software knowledge and who believed in teaching themselves new skills. They seemed to have an inner confidence that although the problems that they were working on were difficult, they could resolve them given time and learning. As a former PhD student and postdoc I also believed in independent working and a self-teaching mentality, but I’d never seen this same mentality before in a software context. I resolved that I didn’t just want to become a software developer, but I wanted to become *this kind* of software developer. I found my first software developer job shortly afterwards in August 2009.

In 2010 GeekUp Sheffield was renamed to GIST Magazine and continued to meet on the first Wednesday of each month at the Showroom Cafe Bar. The format had now changed though, with Jag Goraya acting as compere and multiple presentations being given within the two hours. The atmosphere was relaxed and friendly, with questions being asked in an open environment.  I saw some wonderful GIST Magazine talks in 2010 such as Ash Moran and Marc Johnson talking on promiscuous pair programming and my software knowledge grew. I did a GIST Magazine book review on Cory Doctorow’s excellent For the Win in late 2010 because I knew that this would be the audience to appreciate such a book. I was interviewed on the book by Jag whilst sitting on a sofa in front of the other GIST Magazine attendees, which felt at the time like being on Parkinson!

In 2010 I started attending software user groups at the GIST Lab such as Sheffield Ruby Group, Sheffield PHP Group and Open Data Sheffield. The GIST Lab could seat up to 20 people and was an excellent venue for enthusiastic developers to see talks or write code on topics that they were passionate about. I also began attending software user groups at Madlab in Manchester, such as XP Manchester, Python North West and Manchester Free Software. I continued to study new software techniques and programming languages in my own time, motivated by other GIST regulars improving their own skills by doing the same thing.

At the end of 2010 I decided that I wanted to organise a software user group at GIST myself. My favourite programming language was Python, after having using it for scientific computation during my time as a university researcher. I was confident that there was sufficient demand in the Sheffield tech community for a Python group and I confirmed this by conversations with fellow developers and on Twitter. I started the Python Sheffield user group at the GIST Lab in Jan 2011 and was thrilled when there were around 20 attendees at the first meeting. Future meetings then continued to thrive with a wide variety of Python content and regular coding sessions.

GIST Lab
The GIST Lab

It was the GIST Foundation that made this possible. The GIST Lab was freely available for software user groups to use, where this was a dedicated room where developers could learn, code and socialise with their peers in comfort without being disturbed by noise. Every month we had two hours where we could talk about the Python topics that interested us and learn from the experiences of others. One of my favourite Python Sheffield meetings was where core ipython developer Thomas Kluyver gave us a set of ipython bugs and we worked in 5 or 6 developer pairs to fix them and then submit our changes back to the ipython GitHub repo. Other user groups such as Systems Thinking, WordPress, Makers, Raspberry Pi and Open Rights Group later formed at the GIST Lab.

My confidence grew as a software developer and I found that the skills I was learning at GIST user groups regularly came in useful during my day job. I was constantly building up a list of the techniques, programming languages and software books that I’d like to study next, whilst working my way through that list.  In mid 2011 the GIST Foundation organised a two-day BarCamp at the Workstation attended by large numbers of developers, with many travelling from outside Sheffield. The Sheffield tech community was strong and was able to represent itself proudly as part of a great UK city.

In mid 2012 I was working as a .NET developer and considered C# to be my main programming language. I had gained confidence from running the Python Sheffield group for almost 18 months and decided to start up a new Sheffield .NET User Group. Again the GIST Foundation was very supportive of this and offered the GIST Lab each month free of charge for our meetings. The Sheffield .NET User Group attracted a different set of developers to Python Sheffield, but both groups were comprised of hard-working developers who believed in teaching themselves new skills and learning from their peers.

In October 2012 I started work at ThoughtWorks in Manchester, a software organisation it was my ambition to work for one day. GIST has played a major role in this, as I firmly believe that if I hadn’t started attending GeekUp Sheffield in summer 2009 and then multiple GIST user groups, I wouldn’t be a ThoughtWorker now. GIST has given me the opportunity to learn lots of software knowledge from a great group of fellow software developers and share that knowledge with others. As an organiser of two software user groups, it’s very rewarding to have an environment such as GIST where knowledge can be shared amongst smart people willing to learn. In the second half of 2012 I was honoured to become a key holder for the GIST Lab and have the responsibility of opening and closing the venue for user groups.

In December 2012 it was announced that the GIST Foundation and GIST Lab were closing. This was sad news and I feel that I owe them a great debt. There are many people I wouldn’t have met without GIST and they’ve helped the Sheffield tech community to grow. I’m confident that this community will continue to thrive and that the connections made through GIST will be maintained.

Thanks again to Jag, Hannah, Chris and Ian for all of their hard work over the last three years and to all of the regular GIST attendees. I’m very grateful and I’m sure that many other Sheffield developers are too.

Installing GTK2 for Ruby on Mac OS X

I’m currently teaching myself Ruby from The Ruby Way. Chapter 12 is on “Graphical Interfaces for Ruby” and one of the libraries covered is GTK2. Unlike Tk, this is not included in the standard Ruby library. I initially tried:

sudo gem install gtk2

This failed however with the following error output:

Fetching: pkg-config-1.1.4.gem (100%)
Fetching: glib2-1.1.9.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing gtk2:
	ERROR: Failed to build gem native extension.

        /Users/dchetwyn/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
checking for -Wall option to compiler... yes
checking for -Waggregate-return option to compiler... yes
checking for -Wcast-align option to compiler... yes
checking for -Wextra option to compiler... yes
checking for -Wformat=2 option to compiler... yes
checking for -Winit-self option to compiler... yes
checking for -Wlarger-than-65500 option to compiler... yes
checking for -Wmissing-declarations option to compiler... yes
checking for -Wmissing-format-attribute option to compiler... yes
checking for -Wmissing-include-dirs option to compiler... yes
checking for -Wmissing-noreturn option to compiler... yes
checking for -Wmissing-prototypes option to compiler... yes
checking for -Wnested-externs option to compiler... yes
checking for -Wold-style-definition option to compiler... yes
checking for -Wpacked option to compiler... yes
checking for -Wp,-D_FORTIFY_SOURCE=2 option to compiler... yes
checking for -Wpointer-arith option to compiler... yes
checking for -Wswitch-default option to compiler... yes
checking for -Wswitch-enum option to compiler... yes
checking for -Wundef option to compiler... yes
checking for -Wunsafe-loop-optimizations option to compiler... yes
checking for -Wwrite-strings option to compiler... yes
checking for rb_define_alloc_func() in ruby.h... yes
checking for rb_block_proc() in ruby.h... yes
checking for new allocation framework... yes
checking for attribute assignment... no
checking for Win32 OS... no
checking for gobject-2.0... no
checking for brew... yes
installing 'glib' native package... failed
failed to run 'brew install glib'.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/dchetwyn/.rvm/rubies/ruby-1.9.3-p194/bin/ruby
	--with-pkg-config
	--without-pkg-config
	--with-override-variables
	--without-override-variables

Gem files will remain installed in /Users/dchetwyn/.rvm/gems/ruby-1.9.3-p194/gems/glib2-1.1.9 for inspection.
Results logged to /Users/dchetwyn/.rvm/gems/ruby-1.9.3-p194/gems/glib2-1.1.9/ext/glib2/gem_make.out

This error output is not initially clear as to what the problem is. Googling for the problem suggested that I needed to install libgtk2.0-dev first. Further investigation revealed though that a simpler solution was to run

brew install gtk+

and then run the original command again:

sudo gem install gtk2

Developer Developer Developer North

On Saturday October 13th I attended the Developer Developer Developer North conference in Bradford. Developer Developer Developer (DDD) is a chain of conferences that are held in Reading, Bristol, Dundee, Northern England and even as far afield as Melbourne. DDD is a Microsoft-focused software development conference, so mostly covers technologies of interest to a .NET developer. This was the second DDD North conference, where the previous one in October 2011 was held in Sunderland.

This time around, the DDD North conference was held at the University of Bradford School of Management. It was a good choice for a conference venue, with lots of space and plenty of speaker rooms available. The conference had 5 parallel tracks, with each talk session one hour in duration and five talk sessions over the course of the day. The two largest rooms were lecture theatres able to hold over 100 people each and even the smaller rooms comfortably held at least 50 people each. DDD is a free-to-attend conference, where the conference is funded from numerous software sponsors such as JetBrains, RedGate and Gibraltar.

My first talk of the day was “What is Spatial Data?” by @shawty_ds. He has recently written a free book “GIS Succinctly” that will soon be available from SyncFusion. @shawty_ds covered the differences between Spatial SQL and normal SQL, explaining that the location-based services available on modern mobile devices mean that spatial data is increasingly important, and that applications can easily generate spatial data of several terabytes that must be processed efficiently. He went on to introduce the OGC database standard for spatial data, then demonstrated why SQL Server is a poor implementation of the OGC standard. @shawty_ds explained the platforms and tools available for spatial data, before recommending the use of PostgreSQL and PostGIS.

My second talk was then “Riting Roslyn Refactorings” by @GuySmithFerrier. Roslyn is a new C# compiler that is written in C#, not C++ like the original compiler available. The strength of Roslyn is that it is open-source, well documented and entirely configurable by the end user. Roslyn can be used on Visual Studio 2010 or Visual Studio 2012, providing a Roslyn Syntax Visualiser that allows a developer to view the entire syntax tree of a C# code file. @GuySmithFerrier showed how FxCop style rules could be incorporated into the compilation process with Roslyn, such as automatically removing any trailing whitespace in C# code files. To show the configurability of Roslyn, @GuySmithFerrier then gave examples of failing the compilation process for any source file containing the letter “a”, or automatically replacing any letter “a” in a source file with a letter “z” prior to compilation.

My third talk of the day was then “Look ma! No frameworks!” by @ruby_gem. This was a talk on the core principles of Behaviour-Driven Development (BDD), but without the initial use of frameworks. @ruby_gem explained how BDD frameworks such as SpecFlow can lead the developer to focus too much on the operation of the framework itself, rather than the reasons for BDD. She opined that Gherkin’s Given-When-Then syntax may not always be the best choice for requirements gathering, but is a good starting point. She then described how requirements gathering should be a detailed conversation between a software organization and its customers, where more time should be spent discussing BDD tests with the customer than in writing those tests. @ruby_gem then led the audience through the Checkout Kata in C#, encouraging the use of descriptive method names for the scenarios being implemented, but without the use of any BDD framework.

Lunch was then provided for all conference attendees as a sandwich, crisps, chocolate, fruit and juice. The lunch period lasted for 90 minutes, but this included a session of grok (lightning) talks of 10 minutes each.  The first grok talk was on Windows 8 and Windows Phone development, with a guide to the licence prices and development languages available. The second grok talk was then @CaptainShmaser on his experiences of competing in the Imagine Cup 2013. He explained how his team used the idea of a smart phone camera to detect eye diseases in developing countries, with the team being mentored by @BlackMarble. Next came grok talks from RedGate on the Glimpse tool for server performance monitoring and from Andrew Burgess on the OutSystems Agile platform.

My first full talk after lunch was then @RobAshton on “JavaScript sucks and it doesn’t matter”. He began by showing examples of strange JavaScript behaviour, similar to @GaryBernhardt’s well-known “Wat” talk. He then introduced the jslint and jshint libraries for syntax and basic error inspection of JavaScript source files, and the zombie testing browser written entirely in JavaScript. He then covered TypeScript and gave several terminal examples of how to write better JavaScript.

My final talk of the day was then “Event-driven architecture” by @ICooper. He began by describing the principles of Service Oriented Architectures, presenting several clear diagrams. He then explained the difference between a service consumer having to poll a service for completion status and the service consumer being notified by an event when the service had completed. After this he explained with more clear diagrams how an event-based architecture could be implemented in an application. @ICooper fielded many varied audience questions that he was able to answer clearly.

Following completion of the talks, a prize draw was then given in the atrium with many prizes donated by the sponsors. The top prize was an Asus laptop, although also on offer were free JetBrains and RedGate product licences, a Raspberry Pi starter kit, a free annual subscription to PluralSight courses and many software textbooks. A Geek Dinner had been organized for the evening at an Indian restaurant in nearby Shipley for a fee of £15 per person. This was attended by 50 people and was a great chance to meet new people with good food provided.

This conference was attended by around 300 people and had good content throughout, with many knowledgeable speakers and friendly attendees. I had a good day and learned many new things, particularly from the Roslyn talk, which was my favourite session of the day. There were many talks in other sessions that I would have liked to see, such was the quality of the content provided. I was most impressed by the fact that this conference was free to attend. I have attended many other conferences with the same high standard of content, but which were paid conferences. The DDD organisers deserve a lot of credit for organizing a high-quality software conference like this and keeping it free to attend. My only criticism of the conference is that coffee wasn’t available often enough during the day, but only within some break times. DDD North will return in October 2013 in the North East of England and I’ll certainly be attending this along with other DDD conferences in 2013.