I’ve recently got myself a couple of Arduino Duemilanove boards from Little Bird
Electronics. Now the Arduino is a pretty cool bit of kit, and it
comes with a great integrated development environment, which makes
writing simple little programs an snap. Of course, I’m too much of an
old curmudgeon to want to use and IDE and some
fancy-schmancy new language, I want make, I want
emacs, I want gcc. So I embarked on the
task of building a cross-compiler for the AVR board, that
will work on OS X.
Now, my ideal solution for this would have been to create a package
for Homebrew, my
current favourite package manager for OS X. Unfortunately, that just
isn’t going to happen right now. GCC toolchains pretty much
insist in putting things in $prefix/$target. So, in a
standard homebrew install, that would mean I need a directory
/usr/local/avr, unfortunately, Homebrew insists
your package only dump things in etc, bin,
sbin, include, share or
lib. Now, after wasting a bunch of time first fighting
GCC’s autogoat build system to try and convince it to conform
to Homebrew’s idea of a filesystem hierarchy, and then a whole
other bunch of time trying to learn Ruby and
convince Homebrew that other directories should be allowed, I took
the corwads way out and decided /opt/toolchains is
a perfectly respectable place for my cross-compilers to live.
And so, the cross compiler dance begins. We start with binutils, and as the code dictates, we start by trying with the latest version, which at time of writing is 2.20.1.
Of course, building a toolchain for a non-x86 based architecture
wouldn’t be the same if you didn’t need to patch the
source. The patches for the avr are mostly minimal; adding
some extra device definitions, for devices you probably don’t have
anyway. If you miss this step, expect some pain when you try to compile
avr-libc. I got my patches from the FreeBSD AVR binutils patchset. I try to avoid
patches I don’t need so have only applied the patch-newdevices patch. If things break for you, you might want to try the other patches as well.
$ mkdir avr-toolchain-build$ cd avr-toolchain-build$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2$ wget "http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/ports/devel/avr-binutils/files/patch-newdevices?rev=1.16;content-type=text%2Fplain" -O patch-newdevices$ tar jxf binutils-2.20.1.tar.bz2$ cd binutils-2.20.1$ patch -p0 < ../patch-newdevices$ cd ..$ mkdir binutils-build$ cd binutils-build$ ../binutils-2.20.1/configure --target=avr --prefix=/opt/toolchains/ --disable-werror$ make -j2$ make install$ cd ../Fairly simple, the only gotcha is the
--disable-werror, seems that binutils added the
-Werror flag to the build, good move!,
unfortunately, seems that the code isn’t warning free, so things barf
(bad move!), but it comes with a free flag to disable the
error... that’s good.
So, now we move on to GCC. Now, since I’m really only interested in compiling C code, (remember the bit about being a curmudgeon, none of this fancy C++ stuff for more, no siree!), we can just grab GCC’s core package.
Now GCC has some dependencies these days, so you need to get gmp, mpc and mpfr installed somehow. I suggest using Homwbrew. In fact it was this step with my old Mac Ports setup that forced me to switch to Homebrew; too many weird library conflicts with iconv between the OS X version and the ports version; but hey, you mileage may vary! (Note: make sure you have the latest version of Homebrew that includes my fix for building mpfr).
And of course, just like binutils, you need some patches as well.
Unfortunately things here aren’t as easy. There doesn’t appear to be
any semi-official patch for new devices for gcc 4.5.0! So, based on this
patch, I managed to hack something
together. The formats have changed a little, so I’m not 100%
confident that it works, if you are actually trying to use one of the
new devices in this patch, be a little skeptical, and
double-check my patch. If you are using an existing supported
AVR like the atmega328p, then the patch should work
fine (well, it works for me).
$ brew install gmp libmpc mpfr$ wget http://ftp.gnu.org/gnu/gcc/gcc-4.5.0/gcc-core-4.5.0.tar.bz2$ wget http://benno.id.au/drop/patch-gcc-4.5.0-avr-new-devices$ tar jxf gcc-core-4.5.0.tar.bz2$ cd gcc-core-4.5.0$ patch -p1 < ../patch-gcc-4.5.0-avr-new-devices$ mkdir gcc-build$ cd gcc-build$ ../gcc-4.5.0/configure --target=avr --prefix=/opt/toolchains$ make -j2$ make install$ cd ..So, the final piece to complete the toolchain is getting a C library. You almost certainly want AVR Libc, or you can be really hard-core and go without a C library at all, your call.
$ wget http://mirror.veriportal.com/savannah/avr-libc/avr-libc-1.7.0.tar.bz2$ tar jxf avr-libc-1.7.0.tar.bz2$ mkdir avr-libc-build
$ cd avr-libc-build
$ ../avr-libc-1.7.0/configure --prefix=/opt/toolchains --host=avr --build=$ make$ make installThis should work with out any problems, however, if you messed up the new devices patches when building GCC and binutils, you might get errors at this point.
So, now we have a working GCC toolchain for the AVR we can start programming. Of course, you really want to have a good reason to do things this way, otherwise I really recommend just using the Arduino development environment..
Next time I’ll be looking at getting some example C programs running on the Arduino.
Wow, I can’t believe it has been over two years since I last wrote about Android’s for of the QEMU emulator. Turns out there have been some changes since I last looked at it.
The most important is that the Android emulator no longer has a
fixed layout of devices in the physical memory address space. So,
while it may have previously been the case that the event device was
always at 0xff007000, now it might be at
0xff008000, or 0xff009000, depending on what
other devices have been configured for a particular device
configuration.
Now, if a device may exist at some random physical address, how
does the OS know how to setup the devices drivers? Well, as I’m
sure you’ve guessed, the addresses and really random, they
are located at page-offset addresses through a restricted range of
memory. OK, so how does the OS know what the range is? Well, there is
the goldfish_device_bus device.
Basically, this device provides a mechanism to enumerate the
devices on the bus. The driver writes PDEV_BUS_OP_INIT to
the PDEV_BUS_OP register, the
goldfish_device_bus then raises an interrupt. The driver
the reads the PDEV_BUS_OP register. Each time the value
is PDEV_BUS_OP_ADD_DEV, the driver can read the other
registers such as PDEV_BUS_IO_BASE,
PDEV_BUS_IO_SIZE, PDEV_BUS_IRQ, to determine
the properties of the new device. It continues doing this until it
reads a PDEV_BUS_OP_DONE, which indicates the bus scan
has finished.
The driver can determine what type of device it has found by
writing a pointer to the PDEV_BUS_GET_NAME register. When
this happens the device writes an the device’s name (as an ASCII
string) to the pointer.
Linux uses these strings to perform device to driver matching as described in the Platform Devices and Drivers document.
JavaScript keeps throwing up interesting new tidbits for me. One that kind of freaked me out the other day is when functions and variables are created in a given block of code.
My expectation was that in a block of code, a sequence of statements, the statements would be executed in order, one after another, just like in most imperative languages. So for example in Python I can do something like:
def foo(): pass print foo
and expect output such as:
<function foo at 0x100407b18>
However, I would not expect the same output if I wrote the code something like this:
print foo def foo(): pass
and in fact, I don’t. I get something close to:
NameError: name 'foo' is not defined
Now in JavaScript, by contrast, I can do something like:
function foo() { }
console.log(foo);
and the console will dutifully have foo () printed in the log.
However, and here comes the fun part, I can also do this:
console.log(foo);
function foo() { }
which blows my mind. I guess this really comes in handy when... nope, can’t think of any good reason why this is a useful feature. (I’m sure there must be a good reason, but damned if I can work it out. But this is only where the fun begins. Because the same thing works for variables!
Now usually in Javascript, if you have a function, and write code like:
function foo() {
x = 37;
}
foo();
console.log("x:", x);
You find out you’ve stuffed up, and accidently written to the global object because for some brain-dead reason when you assign to a variable that doesn’t exist in JavaScript it will merrily walk up the scope chain to the global object and plonk it in there. If you do something like:
function foo() {
var x;
x = 37;
}
foo();
console.log("x:", x);
x will be undefined, and the x =
37 line will update the function’s locally scoped variable, and
not mess with the global object. But now comes the part that screws with
your head. You can just as easily write this as:
function foo() {
x = 37;
var x;
}
foo();
console.log("x:", x);
and it will have exactly the same effect. Now it is fairly clear what is happening here; as a function is parsed any variables and functions are created at that time. It turns out though that although variables are created, they are not initialised, so code such as:
var x = 12;
function foo() {
console.log("x:", x);
var x = 37;
}
foo();
will output x as undefined, (not 37, or 12). Now this
behaviour isn’t wrong, or necessarily bad, but it was certainly counter
to my expectation and experience in other languages.
Javascript is a very permissive language; you can go messing around of the innards of other classes to your heart’s content. Of course the question is should you?.
Currently I’m playing around with the channel
messaging feature in HTML5. In a nutshell, this API lets you
create communication MessageChannel, which have two
MessagePort object associated with it. When you send a
message on port1 an event is triggered on port2 (and vice-versa). You send a message
by calling the postMessage method on a port object. E.g:
port.postMessage("Hello world");
This opens up a range of interesting possibilities for web developers, but this blog post is about software design, not cool HTML5 features.
Unfortunately the postMessage is very new, and the implementation
has not yet caught up with the specification. Although you are meant to be
able to transfer objects using postMessage currently only strings
are supported, and any other objects are coerced into strings. This has an
interesting side-effect. If we have code such as:
port.postMessage({"op" : "test"});
the receiver of the message ends up with the string
[Object object], which is mostly
useless; actually it is completely useless. So, we want to transfer
structured data over a pipe that just supports standard strings, sounds
like a job for JSON.
So, now my code ends up looking like:
port.postMessage(JSON.stringify({"op" : "test"});
Now this is all good, but it gets a bit tedious having to type that out
every time I want to post a message, so a naïve approach we can simple create
a new function, postObject:
function postObject(port, object) {
return port.postMessage(JSON.stringify(object));
}
postObject(port, {"op" : "test"});
OK, so this works, and it is pretty simple to use, but there
aesthetic here that makes this grate just a bit, why do I have to do
postObject(port, object), why can’t I do
port.postObject(object), that is more “object-oriented”,
so, thankfully JavaScript lets us monkey patch objects
at run time. So, if we do this:
port.postObject = function (object) {
return this.postMessage(JSON.stringify(object));
}
port.postObject({"op" : "test"});
OK, so far so good. What problems does this have? Well, firstly we are creating a new function for each port object, which isn’t great for either execution time, or memory usage if we have a large number of ports. So instead we could do:
function postObject(object) {
return this.postMessage(JSON.stringify(object));
}
port.postObject = postObject;
port.postObject({"op" : "test"});
This works well, except we have two problems. The
postObject function ends up as a global function, and if
you called it as a global function, the this parameter
would be the global, window object, rather than a port object, which
would be an easy mistake to make, and difficult to
debug. Additionally, we end up with additional per-object data for
storing the pointer. Thankfully javascript has a powerful mechanism
for solving both the problems: the prototype
object (not to be confused with the javascript framework of the
same name).
So, if we update the prototype object, instead of object directly, we don’t need to add the function to the global namespace, we avoid per-object memory usage, and we avoid extra code having to remember to set it for every port object:
MessagePort.prototype.postObject = function postObject(object) {
return this.postMessage(JSON.stringify(object));
}
port.postObject({"op" : "test"});
Now, this ends up working pretty well. The real question is
should be do this? Or rather which of these options should we
choose? There is an argument to be made that monkey-patching anything
is just plain wrong, and it should be avoided. For example rather than
extending the base MessagePort class, we could create a
sub-class (Exactly how you create sub-classes in JavaScript is another
matter!).
Unfortunately sub-classing doesn’t get us to far, as we are not the
ones directly creating the MessagePort instance, the
MessageChannel construct does this for us. (I guess we
could monkey-patch MessageChannel, but that defeats the
purpose of avoiding monkey-patching!).
Of course, another option would be to create a class that encapsulates a port, taking one as a constructor. E.g:
function MyPort(port) {
this.port = port;
}
MyPort.prototype.postObject = function postObject(object) {
this.port.postMessage(JSON.stringify(object));
}
port = MyPort(port);
port.postObject({"op" : "test"});
Of course, this means we have to remember to wrap all our port
objects in this MyPort class. This is kind of messy (in
my opinion). Also we can no longer call the standard port methods. Of
course, we could create wrappers for all these methods too, but then
things are getting quite verbose, and we are stuffed if it comes to
inspecting properties.
Unlike some other object-oriented languages, Javascript provides another alternative, we could change the class (i.e: prototype) of the object at runtime. E.g:
function MyPort(port) { }
MyPort.deriveFrom(MessagePort); /* Assume this is how we create sub-classes */
MyPort.prototype.postObject = function (object) {
this.portMessage(JSON.stringify(object));
}
port.__proto__ = MyPort.prototype; /* Change class at runtime */
port.postObject({"op" : "test"});
This solves most of the problems of the encapsulted approach, but
we still have to remember to adapt the object, and aditionally, __proto__
is a non-standard extension.
OK, so after quickly looking at the sub-classing approaches I think it is fair to discount them. We are still left with trying to determine if any of the monkey-patching approaches is better than a simple function call.
So, there is mostly a consesus out there that monkey patching the base object is verboten, but what about other objects?
Well, if you are in you own code, I think it is a case of anything
goes, but what if we are providing reusable code modules for other
people? (Of course, even in your own code, there might be libraries
that you include that are affected by your overloading). When base
objects start working in weird and wonderful ways just because you
import a module debugging becomes quite painful. So I think
changing the underlying implementation (like the example does
when monkey-patching the postMessage method) should
probably be avoided.
OK, so now the choices are down to function vs. add a method to the
built-in class’s prototype. So if we just add a new global function we
could be conflicting with any libraries that also name a global
function in the same way. If we add a method to the prototype, at
least we are limiting of messing with the namespace to just the
MessagePort object; but really, both the options aren’t
ideal.
The accepted way to get around this problem is to create a module specific namespace. This reduces the number of potential conflicts. E.g:
var Benno = {};
Benno.postObject = function postObject(port, object) {
return port.postMessage(JSON.stringify(object));
}
Benno.postObject(port, {"op" : "test"});
Now, this avoids polluting the global namespace (except for the
single Benno object). So, it would have to come out above
the prototype extension approach. Now, we should consider if it is possible
to play any namespace tricks with the prototype approach. It might be nice
to think we could do something like:
MessagePort.prototype.Benno = {}
MessagePort.prototype.Benno.postObject = function postObject(object) {
return this.postMessage(JSON.stringify(object));
}
port.Benno.postObject(object);
but this doesn’t work because of the way in which methods and the
this object work. this in the function ends
up referring to the Benno module object, rather than the
MessagePort object.
Even assuming this did work, the function approach has some additional benefits. If the user wants to reduce the typing they can do something like:
var $B = Benno; $B.postObject(port, object);
or even,
var $P = Benno.postObject; $P(port, object);
The other advantage of this scheme is that for someone debugging
the code it should be much more obvious where to look for the code and
to understand what is happening. If you were reading code and saw
Benno.postObject(port, object), it would be much more
obvious where the code came from, and where to start looking to debug
things.
So, in conclusion, the best approach is also the simplest: just
write a function. (But put it in a decent namespace first). Sure
instance.operation(args) looks nicer than
operation(instance, args), but in the end the ability
to namespace the function, along with the advantage of making a clear
distinction between built-in and added functionality means that
the latter solution wins to day in my eyes.
If you have some other ideas on this I’d love to hear them, so please drop me an e-mail. Thanks to Nicholas for his insights here.
I’m really impressed with the way the HTML5 spec is going, and the fact that it is quickly going to become the default choice for portable application development.
One of the lastest additions to help support application
development is the File
API. This API enables a developer to gain access to the contents
of files locally. The main new data structure that a developer if
provided with is a FileList objects which represents an
array of File objects. FileList objects
can be obtained from two places; input form elements
and from drag & drop DataTransfer objects.
Based on this latest API, I’ve created a simple library, JsJpegMeta for parsing Jpeg meta data.
I’ve hacked together a example that
demonstrates the library. Just select a JPEG file from the form, or
drag a JPEG file onto the window. For large JPEG files you might need
to be a little bit patient, as it can be a little slow. This slowness, suprisingly,
doesn’t appear to be the Javascript part, but rather Firefox’s handling of large
data: URLs and JPEG display in general.
The rest of this post goes into some of the details. Unfortunately only Firefox 3.6 supports these new APIs right now.
Here is an example of how to get access to a FileList.
When the user chooses a file, it calls the Javascript function
loadFiles. (Assuming you have already defined that
function).
<form id="form" action="javascript:void(0)">
<p>Choose file: <input type="file" onchange="loadFiles(this.files)" /></p>
</form>
A File object just provides a reference to a file; to
actually get some data out of the file you need to use a
FileReader object. The FileReader object
provides an asynchronous API for reading the file data into
memory. Three different methods are provided by the
FileReader object; readAsBinaryString,
readAsText and readAsDataURL. A callback,
onloadend, is executed when the file has been read into
memory, the data is then available via the result field.
Here example of what the loadFiles function might look like:
function loadFiles(files) {
var binary_reader = new FileReader();
binary_reader.file = files[0];
binary_reader.onloadend = function() {
alert("Loaded file: " + this.file.name + " length: " + this.result.length);
}
binary_reader.readAsBinaryString(files[0]);
$("form").reset();
}
Note the $("form").reset(); clears the input form.
Forms are not the only way to get a FileList, you can
also get files from drag and drop
event. You need to handle three events; dragenter, dragover and drop.
<body ondragenter="dragEnterHandler(event)" ondragover="dragOverHandler(event)" ondrop="dropHandler(event)">
The default handling of these are fairly striaght forward:
function dragEnterHandler(e) { e.preventDefault(); }
function dragOverHandler(e) { e.preventDefault(); }
function dropHandler(e) {
e.preventDefault();
loadFiles(e.dataTransfer.files);
}
The interesting thing here is the readAsBinaryString,
when this method is used result ends up being a
binary string. This is pretty new because, as far
as I know, there hasn’t really been a good way to access binary data
in Javascript before. Each character in the binary string represents a
byte, and has a character code in the range [0..255].
This is great, because it means that we can parse binary strings locally, without having to upload files to a server for processing. Unfortunately there isn’t a great deal of support for handling binary data in Javacript; there isn’t anything like Python’s struct module.
Luckily it isn’t too hard to write something close to this. Mostly we wanted to parse unsigned and signed integers of arbitrary length. To be useful, we need to handle both little and big endianess. A very simple implementation of parsing an unsigned integer is:
function parseNum(endian, data, offset, size) {
var i;
var ret;
var big_endian = (endian === ">");
if (offset === undefined) offset = 0;
if (size === undefined) size = data.length - offset;
for (big_endian ? i = offset : i = offset + size - 1;
big_endian ? i < offset + size : i >= offset;
big_endian ? i++ : i--) {
ret <<= 8;
ret += data.charCodeAt(i);
}
return ret;
}
endian specifies the endianess; the string literal ">"
for big-endian and "<" for little-endian. (Copying the Python struct
module). data is the binary data to parse. An
offset can be specified to enable parsing from the middle
of a binary structure; this defaults to zero. The size of
the integer to parse can also be specified; it defaults to the
remainder of the string.
Signed integers require a little bit more work. Although there are
multiple ways of representing
signed numbers, by far the most common is the two’s
complement method. A function that has the same inputs as parseNum
is:
function parseSnum(endian, data, offset, size) {
var i;
var ret;
var neg;
var big_endian = (endian === ">");
if (offset === undefined) offset = 0;
if (size === undefined) size = data.length - offset;
for (big_endian ? i = offset : i = offset + size - 1;
big_endian ? i < offset + size : i >= offset;
big_endian ? i++ : i--) {
if (neg === undefined) {
/* Negative if top bit is set */
neg = (data.charCodeAt(i) & 0x80) === 0x80;
}
ret <<= 8;
/* If it is negative we invert the bits */
ret += neg ? ~data.charCodeAt(i) & 0xff: data.charCodeAt(i);
}
if (neg) {
/* If it is negative we do two's complement */
ret += 1;
ret *= -1;
}
return ret;
}
JpegMeta is a
simple, pure Javascript library for parsing Jpeg meta-data. To use it
include the jpegmeta.js file. This creates a single,
global, module object JpegMeta. The JpegMeta
module object has one public interface of use, the JpegFile
class. You can use this to construct new JpegFile class instances. The input
is a binary string (for example as returned from a FileReader object.
An example is:
var jpeg = new JpegMeta.JpegFile(this.result, this.file.name);
After creation you can then access various meta-data properties, categorised by meta-data groups. The main groups of meta-data are:
Meta-data groups can be access directly, for example:
var group = jpeg.gps;
A lookup table is also provided: jpeg.metaGroups. This
associative array can be used to determine which meta-groups a
particular jpeg file instance actually has.
The MetaGroup object has a name field, a description field and
an associative array of properties.
Properties in a given group can be accessed directly. E.g:
var lat = jpeg.gps.latitude;
Alternatively, the metaProps associative array provides
can be used to determine which properties are available.
The metaProp object has a name field,
description field, and also a value
field.
The File API adds a poweful new capability to native HTML5 applications.
pexif is the python library for editing an image’s EXIF data. Somewhat embarrassingly, the last release I made (0.12) had a really stupid bug in it. This has now been rectified, and a new version (0.13) is now available.
A couple of months ago I posted about my OLPC XO laptop, and how I was looking to give it away to someone who can make good use of it.
As it happens, I’m not the only one in this position, and John came up with the idea of creating an OLPC library that would enable developers to loan out a laptop. So I will be donating my laptop to the new OLPC library.
I’m currently sitting in Melbourne airport waiting for my plan to Hobart. I’m heading off for the best conference in the world, where I’ll be running the Open Mobile Miniconf. There is an awesome set of talks (which I’ll be blogging about shortly).
For a little personal project I’ve been working on recenly, I needed to create some unit tests for a CGI script, sorry, that should be, a cloud computing application. Of course, I turned to my trusty hammer, Python, and was a little disappointed to discover it didn’t quite have the batteries I needed included.
I kind of thought that urllib2 would more or less do what I wanted out of the box, but unfortunately it didn’t and (shock, horror!) I actually needed to write some code myself! The first problem I ran into is that urllib2 only supports GET and POST out of the box. HTTP is constrained enough in the verbs it provides, so I really do want access to things like PUT, DELETE and HEAD.
The other problem I ran into, is that I did’t want things automatically redirecting (although clearly this would be the normal use-case), because I wanted to check I got a redirect in certain cases.
The final problem that I had is that only status code 200 is treated as success, and other 2xx codes raise exceptions. This is generally not what you want, since 201, is a perfectly valid return code, indicating that new resource was created.
So, urllib2 is billed as An extensible library for opening URLs
using a variety of protocols
, surely I can just extend it to do
what I want? Well, it turns out that I can, but it seemed to be harder
than I was expecting. Not because the final code I needed to write was
difficult or involved, but because it was quite difficult to work out
what the right code to write is. I want to explore for a little bit
why (I think) this might be the case.
urllib2 is quite nice, because simple things (fetch a URL, follow redirects, POST data), are very easy to do:
ret = urllib2.urlopen("http://some_url/")
data = ret.read()
And, it is definitely possible to do more complex things, but (at least for me), there is a sharp discontinuity in the API which means that learning the easy API doesn’t help you learn the more complex API, and also the documentation (at least as far as I read it), doesn’t make it apparent that there are kind of two modes of operation.
The completely frustrating thing is that the documentation in the source file is much better than the online documentation! Since it talks about some of the things that happen in the module, which are otherwise “magic”.
For example, the build_opener function is pretty
magical, since it does a bunch of introspection, and ends up either
adding a handler or replacing a handler depending on
the class. This is explained in the code as: if one of the
argument is a subclass of the default handler, the argument will be
installed instead of the default.
, which to me makes a lot of
sense, where-as the online documentation describes it as:
Instances of the following classes will be in front of the handlers,
unless the handlers contain them, instances of them or subclasses of
them: ....<list of default handlers>
. For me the former is
much clearer than the latter!
Anyway, here is the code I ended up with:
opener = urllib2.OpenerDirector()
opener.add_handler(urllib2.HTTPHandler())
def restopen(url, method=None, headers=None, data=None):
if headers is None:
headers = {}
if method is None:
if data is None:
method = "GET"
else:
method = "POST"
return opener.open(HttpRestRequest(url, method=method,
headers=headers, data=data))
So, conclusions, if the dos don’t make sense, read the code. If you are writing an API, try to make it easier to get from the easy case to the more complex case. (This is quite difficult to do, and I have definitely been guilty in the past of falling into the same trap in APIs I have provided!). If you can’t get the API to easily transition from easy to hard, make sure you document it well. Finally, Python is great language for accessing services over HTTP, even if it does require a little bit of work to get the framework in place.