notes from the bigfug

notes from the bigfug

programming light and other strange tales

notes from the bigfug RSS Feed
 
 
 
 

Source Code Layout

There have been several attempts to standardise the layout of source code.  This is a good thing – if everyone used the same style we would spend less time trying to figure out what a slab of code actually does, free of layout inconsistencies and interpretations (and besides, everything would be clearly commented anyway, wouldn’t it).

The fact that there are several styles to choose from is an immediate oxymoron.  Some styles were introduced because of limitations of the programming environment, such as writing code in 80×24 character screens ala DOS or Unix.  Given such limited screen size, it would seem like a good idea to ensure the maximum amount of “code” is on-screen, rather than “wasting” lines with single brackets and the like.

An example in C of “The One True Brace Style”, a variant of K&R:

if (x < 0) {
    printf("Negative");
    negative(x);
} else {
    printf("Positive");
    positive(x);
}

According to Wikipedia, where this example comes from, both the Unix and Linux kernel are written in this style.

Now, I don’t have a problem with such styles per se, especially if they are born from visual limitations such as low resolution displays, but given that the majority of programmers these days, including myself, will be working with high-resolution monitors, such condensed styles seem visually anti-productive, as we shall explore.

It should be noted that other standards, such as K&R, Allman, KNF, and Whitesmith’s, provide a subtle range of more readable variations, though it is this programmer’s belief that they all still somehow miss a deeper level of visual presentation that can make code even more understandable and can be an actual aid to debugging.

What follows is a (somewhat terse) description of my own style of code layout that I’ve developed over the years.  It is very visually based, which tends to be how my brain works.  It’s also somewhat rooted in speed-reading techniques, where one develops the ability to take in large amounts of information without the struggle of reading every line of text.

It is also not without it’s own problems, as discussed at the end.

The standards mentioned above have generally been born out of the C world, however the following can be applied across a wide range of languages such as C++, PHP, Java, JavaScript, LUA, etc.

Indentation

Taking the C example above, we can re-write it like so:

if (x < 0)
{
    printf("Negative");
    negative(x);
}
else
{
    printf("Positive");
    positive(x);
}

As with Allman style, the curly braces are matched up with the control statements, which serves to provide a visual clue that there is going to be some kind of optional or repetitive action to be applied to the indented blocks of code.

We can see the two blocks are indented by the same amount and the ‘else’ statement is prominent between the two blocks, all clues as to the purpose of this code.

At a glance we can quickly summarise these lines like so:

if ( ... some condition ... )
{
    ... do some stuff ...
}
else
{
    ... do some other stuff ...
}

This trivial example introduces an important concept: if the control statements are obvious we can vertically scan the code quickly and get a feel for what it’s doing without needing to get bogged down in implementation details we don’t wish to concern ourselves with.

It is important then, to use braces even with single statements:

for( int x = 0 ; x < 10 ; x++ )
{
    printf( "x = %d\n", x );
}

rather than

for( int x = 0 ; x < 10 ; x++ )
    printf( "x = %d\n", x );

Whitespace

To further this concept, I tend to use whitespace very differently to any of the C standards.  For example, I’d write the original example as:

if( x < 0 )
{
    printf( "Negative" );

    negative( x );
}
else
{
    printf( "Positive" );

    positive( x );
}

If the control statements are can be scanned vertically, the actual statements should be able to be scanned horizontally.  By ensuring there is whitespace around every variable or value you make it easier on your eyes to pick out the parts of interest.

It is now also clearer that we are using the variable ‘x’ in the negative/positive function calls.  By introducing whitespace we can see what values look visually alike rather then necessarily having to read them.  If I had accidentally typed “negative( y );” instead, it would be much more obvious than if it had been all bunched up as in “negative(y);”.

You may also notice I removed the whitespace after the ‘if’ statement, for me this ties the horizontal bracketed condition to the ‘if’ rather than leaving it floating unconnected.

Changes in Language Style

The above guidelines work well for most general code but these days I’ve been encountering some challenges to my carefully honed model, especially within PHP and JavaScript where anonymous functions or large arrays of information need to be passed to other functions or methods.

Take something like this, from Symfony’s form system:

$this->setValidators(array(
    'name'    => new sfValidatorString(array('required' => false)),
    'email'   => new sfValidatorEmail(array(), array('invalid' => 'Email address is invalid.')),
    'subject' => new sfValidatorChoice(array('choices' => array_keys(self::$subjects))),
    'message' => new sfValidatorString(array('min_length' => 4), array(
        'required'   => 'The message field is required',
        'min_length' => 'The message "%value%" is too short. It must be of %min_length% characters at least.',
    )),
));

If we are to apply a similar layout as described above, it will end up as something like this monster:

$this->setValidators
(
    array
    (
        'name' => new sfValidatorString
        (
            array
            (
                'required' => false
            )
        ),

        'email' => new sfValidatorEmail
        (
            array
            (
            ),

            array
            (
                'invalid' => 'Email address is invalid.'
            )
        ),

        'subject' => new sfValidatorChoice
        (
            array
            (
                'choices' => array_keys( self::$subjects )
            )
        ),

        'message' => new sfValidatorString
        (
            array
            (
                'min_length' => 4
            ),

            array
            (
                'required'   => 'The message field is required',
                'min_length' => 'The message "%value%" is too short. It must be of %min_length% characters at least.',
            )
        ),
    )
);

This introduces are mildly unpleasant side-effect where functions, constructors, and arrays are being laid out like control statements.  Also, nine lines of code now take up almost a whole page! Now I’ve come full circle, back to needing some hybrid condensed version to adjust the code to layout on-screen ratio.

Oh, what to do…  Perhaps a bigger monitor?

LambdaMOO data structures in MySQL

Now and again I get entirely sidetracked from my usual day to day programming madness into some other temporary realm of programming madness.  I find it good for the soul.

There was a good reason behind my most latest foray, however: I wanted to take a quick refresher course in the latest PHP, Symfony, and MySQL updates to keep my hand in.

So I thought I’d set myself a little project.  Which quickly got out of hand.

There’s a couple of games from the old BBS era (hence the spawning of the last post) that I actually miss playing, the main one called ‘Hack & Slash’, written by Robert Hirst, although he’s ported it to Unix and it’s now called RPGD).

I thought it could be fun to port it to a web based game, so I sat down and started hacking away.

After a day of frenetic keyboard abuse, I had a Symfony based Finite State Machine, the character classes, monsters, and game objects in place, and the mechanics of fighting (albeit without magic spells, for which I wanted to introduce a new class hierarchy for) and things were progressing rather well.

The way I was writing the interface was very much mirroring the original game just with clickable links rather than needing to type in instructions.

My aim of spending a weekend getting some kind of proof of concept out of the door was then flummoxed by another, stronger train of thought.

I’d got the basic menu structure in place, which in part kind of models a small village (with shops, a fighting arena, and the like) that you can ‘walk’ around and buy things and generally supplement your character.  I started to imagine what this village might look like, and whether the layout in the game would be at all like how a real village might organise itself as it grows organically.

Of course nothing good can come of thinking along such lines but I continued undaunted with a cup of tea and a pad of graph paper.

MOO Time

What I realised is that I wanted to be able to create and add features to the game over time, rather than having to write the whole thing before putting it online.

There is a well established model for this type of game.  It is called a MOO (or multi-user dungeon, object-orientated) of which one of the most developed and long running is LambdaMOO – you can still play it online.

A MOO shares the same text based interface as RPGD, though the user can enter freeform commands rather than being limited to a small list of commands.

I started thinking about how both systems could be combined, and it seemed feasible to create the game-play of RPGD within the structure of a MOO using its internal programming language, while also gaining the ability to build the village on the fly as and when I found a spare 15 minutes.

And, let me just mention at this point that I have no reason to believe anyone might actually play this game, I’m just enjoying the mental challenge of designing it :)

It would also be very interesting, I continued to muse, if that rigid interface structure could be broken up further from a single session (both games assume a user is connected via telnet or similar) to a state based game, and utilise a database as the backend storage (LambdaMOO keeps the whole world in memory, RGPD keeps all the objects of the users session in memory).

This would enable web, telnet, or even mobile access to the game world, and create a nicer server application that could be written in something like PHP and be deployed on a standard web hosting package, rather than needing to run a server side program (as both games required).

There was some further thinking about completely redesigning the web interface to something very flashy and dynamic to replace as much typing with clicking as possible, but that’s for another time.

Let’s Hurt Me Some MySQL

Leaping back on the keyboard, I started to create a database structure that very closely mirrored LambdaMOO’s internal structures.

I quickly came across the rather unique requirements that the MOO required for its world:

  • Everything in the world (including players) is an object and is descended, except for the top level object, from a parent object
  • Each object has properties, either inherited from its parents, or defined on this object
  • Each object has verbs (or actions), also inherited or defined

Each object, property and verb also has a set of permission bits that control how properties and verbs can be controlled on objects, and how objects themselves can be structured and controlled.

While each object having a parent is obviously a simple foreign key, the inheritance model proved to be a little more complicated.

Remember, the original system stores the entire world in memory so it can quite easily dance through its internal data structures with simple controls on locking parts of the object tree to avoid more than one thread changing things at the same time.

We could of course use table locks in MySQL for similar control, but it was my intention to create an atomic system that could be quickly and safely updated from a request session.

Bad Programmer, go to your room!

Now, I like to think of myself as quite a good programmer, but sometimes I get it quite, quite wrong and I’d like to share this with you now.  As they say, success is a lousy teacher.  (This doesn’t follow that a lousy teacher is a success, unfortunately, badoom-tish…)

I thought a good idea would be to duplicate all the properties and all the verbs on each descendant object.  The reasoning behind this being that SELECT’ing an object should be fast as it would happen ofter, whereas object/property/verb creation and destruction would happen much less often, and by duplicating all that data, it would be a simple join between the tables.

To facilitate the inheritance, each property and verb would have:

  • An object id, the object whose property this instance belongs to
  • A parent id pointing to the same property/verb in the object’s parent
  • A source id pointing to a parent property/verb that actually defines the property (explained below)

So, if we had a very simple structure like this:

Object #1 (has a property called ‘foo’ that is equal to ‘bar’)

|

Object #2 (has a property called ‘spa’ that is equal to ‘fon’)

|

Object #3 (has a property called ‘foo’ that is equal to ‘notbar’)

The properties for each object would be like this:

  • Object #1
    • foo = bar (object = #1, parent = null (no parent), source = null)
  • Object #2
    • foo = bar (object = #2, parent = #1, source = #1)
    • spa = fon (object = #2, parent = null, source = null)
  • Object #3
    • foo = notbar (object = #3, parent = #2, source = null)
    • spa = fon (object = #3, parent = #2, source = #2)

Then reading an object and its properties is simply:

SELECT * FROM objects, properties, verbs WHERE properties.object = objects.id;

Nice.  Then to update a property (on Objects #1 and #2, Object #3 still overrides)

UPDATE properties SET value=’foo’ WHERE source = #1

This is all going swimmingly.  But what about adding a new property or deleting properties, or even adding objects.  Well, then it all goes a bit wrong as you need to INSERT or DELETE instances of all the properties and verbs from all the parent objects, and possibly the descendants too.  It gets very messy and is certainly not very atomic.

Building The Nest

So I had a break, another cup of tea (I am British, don’t you know), and a meander around the InterWebs to see if there was a better model I could utilise for my own devious ends.

I found a good one, first described by Michael Kamfonas, and later coined as “nested sets” by Joe Celko.

There’s a nice article with lots of example code on the MySQL dev site.

Go on, read the article, I’m not going to describe it here and if you don’t know the technique, you should!

Welcome back.  So now I have a structure that looks like this.  This schema is in Symfony format but should be fairly simple to understand by all (apart from the word wrapping, sorry):

rpg_object:
  _attributes:   { phpName: rpgObject, package: lib.model.rpg }
  id:
  parent_id:     { type: integer, required: true }
  left_id:       { type: integer, required: true }
  right_id:      { type: integer, required: true }
  scope_id:      { type: integer, required: true }
  owner_id:      { type: integer, foreignTable: rpg_object, foreignReference: id, required: false, onDelete: cascade }
  name:          { type: varchar(30), required: true }
  location_id:   { type: integer, foreignTable: rpg_object, foreignReference: id, required: false, onDelete: setnull }
  programmer:    { type: boolean, required: true, default: false }
  wizard:        { type: boolean, required: true, default: false }
  r:             { type: boolean, required: true, default: false }
  w:             { type: boolean, required: true, default: false }
  f:             { type: boolean, required: true, default: false }
  is_player:     { type: boolean, required: true, default: false }

rpg_prop:
  _attributes:   { phpName: rpgProp, package: lib.model.rpg }
  id:
  object_id:     { type: integer, foreignTable: rpg_object, foreignReference: id, required: true, onDelete: cascade }
  owner_id:      { type: integer, foreignTable: rpg_object, foreignReference: id, required: true, onDelete: cascade }
  parent_id:     { type: integer, foreignTable: rpg_prop, foreignReference: id, required: false, onDelete: cascade }
  source_id:     { type: integer, foreignTable: rpg_prop, foreignReference: id, required: false, onDelete: cascade }
  name:          { type: varchar(20), required: true }
  r:             { type: boolean, required: true, default: true }
  w:             { type: boolean, required: true, default: true }
  c:             { type: boolean, required: true, default: true }
  value:         { type: longvarchar, required: false }

rpg_verb:
  _attributes:  { phpName: rpgVerb, package: lib.model.rpg }
  id:
  owner_id:      { type: integer, foreignTable: rpg_object, foreignReference: id, required: true, onDelete: cascade }
  names:         { type: varchar(255), required: true }
  r:             { type: boolean, required: true, default: true }
  w:             { type: boolean, required: true, default: true }
  x:             { type: boolean, required: true, default: true }
  d:             { type: boolean, required: true, default: true }
  arg_preposition:    { type: tinyint, required: true }
  arg_direct:    { type: tinyint, required: true }
  arg_indirect:  { type: tinyint, required: true }

With this structure we can defined properties and verbs on objects and get the whole cascading, inherited tree with a single MySQL query.

Also, within Symfony, there’s a plugin to handle nested set records.

We can add and delete objects quickly, change their parents, and we don’t need to copy verbs and properties (and cascading will delete the properties and verbs on any object).

I should probably give some examples but this post is getting quite long already and I’m really jonesing for another cup of brown joy.

So, where’s the game, you ask!

Well, it was coming along but then I started writing an interpreted JavaScript type language within PHP to handle the MOO scripting (and that’s for another post) and I just plain ran out of time.  Anyway, the nested set thing is the important bit!

Ah well, some fun, but back to the day job!

Revisiting the Bulletin Board System from a local community perspective

As you may know, I have a bit of a history with text based online services (writing Zeus BBS amongst other things) and I’ve been sporadically re-investigating that world over the past few months to ascertain whether there is any aspect that has relevance in today’s Internet enabled society, other than a heady nostalgia trip.

Most of the key features of bulletin board systems have indeed been entirely replaced.  For example:

  • The provision of local downloadable files has been entirely surpassed.
  • Messages (local and FidoNet technology distribution) have been replaced by email, online bulletin boards, newsgroups, mailing lists etc.  The ability to replicate messages across a network and for a BBS to provide an access point to those message bases would seem to have use within linking intranets or other closed systems but has little relevance in the wider public environment.
  • Some games, and other online ‘doors’ still have an active community using them, though any that are actively developed seem to be moving towards web or custom client interface rather than a text based one and who can blame them!

With just those top-level points I was able to write off all of the three years work I had put into Zeus, let alone the fact that it was written for the Amiga and the work involved in porting it (yes, I considered it), even if there were any interest in such a thing, would really not be worth the effort.

That was a bit sad, but hey, suck it up and let’s move on.

I did however uncover one aspect of running a BBS that has not quite been explored or exploited as fully by the nebulous Internet: leveraging and enhancing local community.

This is a bit of a sweeping statement but allow me to expand on it with a bit of history:

Because of the phone call pricing in the UK when BBS’ were in their heyday, it was only realistic to call local systems after 6pm.  During the week much higher rates applied in the mornings, dropping down a bit in the afternoon, and then cheaper still between 6pm and 7am (could be wrong, haven’t checked), with weekends being at the lower rate all day.  Also, to complicate matters further, calling local numbers (within a certain distance) was cheaper, and beyond that distance it again got much more expensive.

There was many a case (myself included) of people being floored when receiving their phone bill for the quarter after discovering the world of BBS’.  I think my first bill was about £400.  Ouch.  Stories of people receiving much higher were commonplace.  How we all loathed BT.  And Americans (only because they got free local calls in the US, lucky buggers!)

Once the pain of that initial shock had worn off, and if you (or your partner/parents) hadn’t thrown the modem out of the window vowing vehemently never to use it again, it was a case of finding the local BBS’ and limiting most of your activity to those, with only the occasional visit to systems running in distant and exotic locations.  Like London.

It should be noted that some unscrupulous types actually did manage to get free phone calls using a technique called Phone Phreaking but they’re obviously evil and we won’t dwell on them.

This imposed costing structure actually had quite an unforeseen benefit to UK BBS’ on the whole.  While we wouldn’t receive as many callers as our state-side cousins, the ones that we did tended to be from the immediate local area, which meant that communities developed both on and off the BBS.

It was a grassroots type of community that was happening all around the world.  There were local meetings (invariably down at some backwater pub), regional meetings (again, usually a pub) and even international meetings (never went to one but I assume it was at a big pub)

And, to finally rejoin the thread of my initial statement about local community, it has not yet widely been accomplished via the Internet, for two reasons:

  1. You can (generally) access any site in any part of the world instantly and, on the whole, anonymously (most BBS’ required that you registered before you could access them)
  2. “Social Networking” sites, or most services run by large companies approach community on a top-down model, which is fine – to a point – but doesn’t create the same experience as a bottom-up community such as BBS’ had.

As an example of this second point, take Facebook for instance.  It’s all about your personal network.  Well, it seems you have a choice: either to restrict it to people you’ve met (which is how I prefer to use it) or else gather as many ‘friends’ as possible for whatever personal or business reasons you may have for doing so.

Now, there is a general Brighton page/group for all the people who say they live in Brighton (I don’t, but Lewes isn’t an option so Brighton is my closest choice – that’s a big fail right there for me).  But that’s it.  There’s no structure beyond that within that single grouping.

Ah, but Alex, says you, there are lots of other pages and groups that you can join for your specific interests, or create your own and stop whining.

But, says I, these are all first-class pages and groups that have absolutely no relationship to each other so there are competing groups on the same subjects and who knows what fevered ego’s lurk in those admin positions.

This isn’t common to Facebook either.  The top-down model of a community can only go so far.

By now, you’re probably waiting for some grand payoff after reading this long article but sadly I don’t have one for you.  Sorry.

I am however still ruminating on this issue and perhaps it will spark a bit of discussion.

I think there are still important insights to be squeezed out of user interaction in the BBS age.  These people put up with fairly basic interface and (some, not all) got a lot of rich life experience out of it (I saw this again in even sharper focus when working on Wapscallion, an even simpler interface!)

Anyway, this wasn’t the post I started writing!  On to that now…

Twitter Updates for 2009-11-22

Powered by Twitter Tools

Twitter Updates for 2009-11-15

  • Up 'til 5am 3D scanning/projecting (added framing, inpainting, and smoothing – real tasty!) and woke with a bit of a cold – great reward #
  • All booked in for my little sojourn down to Bath tomorrow. Hurriedly finishing off the video displacement software I'll need! #
  • ffmpeg is pretty nifty. Just run up a cross-platform audio/video processor for video displacement in few hours. #
  • Back from a successful, two day, 3D scanning session at Threeways School in Bath! Is a little early (but dark) – think I've earned a pint! #
  • Quadratura's lovely new show-reel: real-time interactive video art – having an event/party? You need this: http://bit.ly/40Bg6w #
  • Mandelbulb: The Unravelling of the Real 3D Mandelbrot Fractal http://bit.ly/1Hpx1r (pfft, "mandelbulb"…) #
  • @ianvisits Google bought FeedBurner, didn't they? in reply to ianvisits #
  • @nlomioni Yes, am on wave but it's pretty much like this at the moment: http://bit.ly/FMr2K in reply to nlomioni #
  • Awoke with 'Catch The Sun' by Doves and The London Bulgarian Choir stuck in my head – first choice on today's jukebox: http://bit.ly/42Jncx #
  • Frantically trying to turn the tide of email. Also looking for venue in Brighton to show our interactive video art. #
  • While everyone is playing Call Of Duty, I'll be playing this: http://bit.ly/4hcTUp #
  • @Escapation Would love to. Any suitable events coming up? in reply to Escapation #

Powered by Twitter Tools

Twitter Updates for 2009-11-08

  • About 60% through shifting the fugStreaming code base over to using Boost – simpler code and more cross-platformy (also added compression!) #
  • fugStreaming: memory/UDP streaming code ported, just the receiving side of TCP to redo #
  • Four types of background subtraction implemented – should be enough to cope with most lighting conditions, I hope! #
  • Could still use a high resolution thermal camera or one of those nifty depth cameras. If anyone wants to give me one, thanks :) #
  • On track for our interactive mini-exhibition on Wednesday. Possibly even a little ahead of schedule! May have rest of the evening off, yay! #
  • @AXEL2200 Yep, I'd like a wave invite, if you'd be so kind. #
  • @dylanparrin A wave invite would be lovely, if you have a spare one #
  • @dylanparrin Lovely, thanks very much! in reply to dylanparrin #
  • Disappointed with the results of trying to stream 720×576 uncompressed video over UDP *locally* – was easier when we all used 320×240… :) #
  • @alpaykasal Oh, really? Well, I think I just messed up the code by making it cross platform <sigh> back to testing… in reply to alpaykasal #
  • @collada Simplygon 2.8 – simplify and optimize complex 3d COLLADA meshes – http://tinyurl.com/yb6zt7s – WANT! in reply to collada #
  • Feel a bit crap. Too many 16 hour days in a row. When did I last have a day off? My fingers are actually tired. Come on Al, keep it together #
  • Writing the copy for tomorrow's handouts. Time to stick on some Philip Glass starting with Kundun, then Koyaanisqatsi. Biddily-biddily… #
  • Copy for the handout is written and off to Martin for a peruse. Time for a cup of tea, bit of toast, then serious multi-projector testing! #
  • @FabricaGallery Creepy… Do you think they're trying to form a simple conciousness? You may want to have your hand near the power switch! in reply to FabricaGallery #
  • @DAVID_LYNCH This weekend I built a video installation with thousands of falling points of light you can catch in your hand. 0 LOP albums :) in reply to DAVID_LYNCH #
  • Nice: 90 Year Old Example of Forced Perspective Photography – http://bit.ly/EUDhL #
  • All five of the interactive video pieces are done, tested and optimised. Now down to PatchBox to perform it's special magic! #
  • @nlomioni Or send them to me – I think you've had enough… in reply to nlomioni #
  • Hey kids, you know what you need when one homography just isn't enough? That's right – A DOUBLE HOMOGRAPHY!!! Larks… #
  • Great, another 4am finish. Had some issues with trying to do weird things to homogeneous coordinates. Bypassed for now. All works. Sleep… #
  • 4.5 hours sleep but adrenaline is running high: tonight we début our new interactive video wonders. Time to pack gear and head to London! #
  • Last night was excellent! World, you have *got* to see this stuff… #
  • @Escapation Heh, on the train with 2 hours of footage. Should have something up in a few hours! in reply to Escapation #
  • Since my last tweet I have fallen very foul of Lewes Bonfire. Currently wearing a black suit, 3/4 length burgandy coat, and lipstick. #
  • Right, back in the real(ish) world. Got my Google Wave invite today, no time to play right now, unfortunately, got video to edit! #
  • One of Quadratura's new interactive video art installations with Laben dancer Marja Koponen – http://bit.ly/1pitk7 #
  • @awhillas Yeah, it was lovely to watch – the whole gallery fell silent during this one :) in reply to awhillas #
  • Ah, finally Friday evening. Time for a little relax, a little beer, a little snack, and a little TV. Quiet one tonight, worky weekend ahead. #
  • Nice long sleep, cup of tea, then to work! Editing the full showreel from Wednesday's event. #
  • Another 'vote everyday' annoyance: Quadratura is entered for the Metropolis Art Prize 2009 – http://bit.ly/4vGv3y #
  • Had a short lived moment of joy where I'd reached 100 followers, then someone left and it's back to 99, ah well, showreel now encoding… #
  • New interactive showreel uploaded – should be available tomorrow. #
  • Ah, Sunday. A nice quiet day of geeking around with PatchBox's 3D scanner in preparation for an upcoming job this week. #

Powered by Twitter Tools

Twitter Updates for 2009-11-01

  • PatchBox seems to run fine on Windows 7, and so do I #
  • Created a rather tasty interactive video piece, now to switch to evening mode for drinks ala Hume #
  • Am pretty convinced @twhume and myself should not ever collectively be allowed influence on government technology policy (or should we?) #
  • Getting to grips with the new OpenCV C++ interfaces – pretty cool so far! #
  • Not that I have need for any such thing, but if you needed a PeerGuardian replacement for Windows 7, then… http://www.peerblock.com/ #
  • @nlomioni Yep, use VM/OSX for cross platform dev in reply to nlomioni #
  • Gah, up 'til 3am working on some masked homography goodness. Should make setting up our interactive video installations easy! (Should…) #
  • First test of the homography mapping is a success! Now to put in memory streaming to Pinhole, our new interactive video app! #
  • Eek, just spent two hours playing with one of our new interactive video installations! #
  • Connected components duly connecting components. Now for some anthropomorphic Voronoi fun! #

Powered by Twitter Tools

Twitter Updates for 2009-10-25

  • i'mpossible #
  • Planning an exclusive event for a select few to come play with our new interactive video artworks. November, West London, PM for invite. #
  • Off to Brighton to see The Imaginarium of Doctor Parnassus #

Powered by Twitter Tools

Twitter Updates for 2009-10-18

  • Occurs to me I've been thinking about real-time video/physics interaction the wrong way round… #

Powered by Twitter Tools

Twitter Updates for 2009-10-18

  • Occurs to me I've been thinking about real-time video/physics interaction the wrong way round… #

Powered by Twitter Tools