Hello IOT-Kit, Introduction By Example

February 12, 2018 at 01:54 AM | categories: iotkit, python, iot, C++, definitions, iotoy | View Comments

IOT-Kit is a toolkit for enabling the creation of IOT devices, by people who can make simple arduino based devices. Rather than waffle on about why, how, etc, I think the best way of explaining what this does, is by example.

Specifically, this post covers:

  • Suppose you can make little arduino based robots
  • Suppose you want to remote control your robots over the local network, trivially from something like python. (Really over HTTP in fact!)

What do you as a device maker need to do to make this happen?

IOT-Kit - Make your Arduino Device an IOT Device, easily

So the really short version is this: you can make a simple robot, but you want to make it usable as an IOT device too. You don't want to build the entire stack. You don't want to build everything yourself.

You want your users to be able to type something like this program and have it search for the robot on the network, and have it control the robot.

from iotoy.local import simplebot
import time
import random

simplebot.lights = 0
while True:
    choice = random.choice(("forward", "backward", "left", "right", "blink", "stop"))
    if choice == "forward":
        simplebot.forward()
    if choice == "backward":
        simplebot.backward()
    if choice == "left":
        simplebot.left()
    if choice == "right":
        simplebot.right()
    if choice == "blink":
        for i in range(3):
            simplebot.lights = 1
            time.sleep(0.5)
            simplebot.lights = 0
            time.sleep(0.5)
    if choice == "stop":
        simplebot.stop()

    time.sleep(5)

NOTE: While this is python, this actually maps to a bunch of deterministic http web calls, and actually can be written in any langauge. iotoy/iotkit just provides a bunch of convenience functions to do these calls in a way that also maps cleanly to python. (It also would map cleanly in javascript, ruby, perl, etc)

How do we get to this?

Building the Robot - Hardware

These is the easy part. We could use a DAGU mini-driver. This can control a number of servos and also provides serial access over plain old hardware serial bluetooth.

Building the Robot - Software, No IOT

If we were just controlling the robot without any remote control, we could use Pyxie to program this. The Pyxie program you might use could look like this:

#include <Servo.h>

leftwheel = Servo()
rightwheel = Servo()

headlights_led_pin = 13
leftwheel_pin = 2
rightwheel_pin = 3

pinMode(headlights_led_pin, OUTPUT)
leftwheel.attach(leftwheel_pin)
rightwheel.attach(rightwheel_pin)

leftwheel.write(90)
rightwheel.write(90)

while True:
    leftwheel.write(180)
    rightwheel.write(180)
    delay(500)

    leftwheel.write(180)
    rightwheel.write(0)
    delay(500)

    leftwheel.write(0)
    rightwheel.write(0)
    delay(500)

    leftwheel.write(0)
    rightwheel.write(180)
    delay(500)

    leftwheel.write(90)
    rightwheel.write(90)
    delay(500)

    digitalWrite(headlights_led_pin, HIGH)
    delay(1000)
    digitalWrite(headlights_led_pin, LOW)
    delay(1000)

This program assume 2 continuous rotation servos, where the centre point 90 means stationary, 0 means full reverse, and 180 means full forward.

What this program means is "forward, right, backward, left, stop, blink headlights".

Pyxie generates C++ code, which we can use as a starting point for our code:

#include <Servo.h>

#include "iterators.cpp"

void setup() {
    int headlights_led_pin;
    Servo leftwheel;
    int leftwheel_pin;
    Servo rightwheel;
    int rightwheel_pin;

    leftwheel = Servo();
    rightwheel = Servo();
    headlights_led_pin = 13;
    leftwheel_pin = 2;
    rightwheel_pin = 3;
    pinMode(headlights_led_pin, OUTPUT);
    (leftwheel).attach(leftwheel_pin);
    (rightwheel).attach(rightwheel_pin);
    (leftwheel).write(90);
    (rightwheel).write(90);
    while (true) {
        (leftwheel).write(180);
        (rightwheel).write(180);
        delay(500);
        (leftwheel).write(180);
        (rightwheel).write(0);
        delay(500);
        (leftwheel).write(0);
        (rightwheel).write(0);
        delay(500);
        (leftwheel).write(0);
        (rightwheel).write(180);
        delay(500);
        (leftwheel).write(90);
        (rightwheel).write(90);
        delay(500);
        digitalWrite(headlights_led_pin, HIGH);
        delay(1000);
        digitalWrite(headlights_led_pin, LOW);
        delay(1000);
    };
}

void loop() {
}

Making a simple device abstraction layer for our device.

A device abstraction layer just means creating names for the key functionality we care about. At some point, pyxie will help here, but pyxie is currently very simple and can't create functions, so we take the C++ code we have so far and work from there.

The interators in the iterators.cpp file are not used, so we can ditch that too.

Creating functions for functionality

So our first step is to pull out and name all the functions. While we're at it, unlike pyxie, we'll split out the contents of what would normally be in a setup() and loop() in an arduino program.

#include <Servo.h>

int headlights_led_pin;

Servo leftwheel;
Servo rightwheel;

int leftwheel_pin;
int rightwheel_pin;

void forward() {
    leftwheel.write(180);
    rightwheel.write(180);
    delay(500);
}
void backward() {
    leftwheel.write(0);
    rightwheel.write(0);
    delay(500);
}
void left() {
    leftwheel.write(180);
    rightwheel.write(0);
    delay(500);
}
void right() {
    leftwheel.write(0);
    rightwheel.write(180);
    delay(500);
}
void stop() {
    leftwheel.write(0);
    rightwheel.write(0);
    delay(500);
}
void lights_on() {
    digitalWrite(headlights_led_pin, HIGH);
}
void lights_off() {
    digitalWrite(headlights_led_pin, LOW);
}

void setup() {
    leftwheel = Servo();
    rightwheel = Servo();
    headlights_led_pin = 13;
    leftwheel_pin = 2;
    rightwheel_pin = 3;

    pinMode(headlights_led_pin, OUTPUT);
    leftwheel.attach(leftwheel_pin);
    rightwheel.attach(rightwheel_pin);
    leftwheel.write(90);
    rightwheel.write(90);
}

void loop() {
    forward();
    right();
    backward();
    left();

    lights_on();
    delay(1000);
    lights_off();
    delay(1000);
}

Device abstraction for our robot

So the device abstraction layer for our device has the following signature:

void forward();
void backward();
void left();
void right();
void stop();
void lights_on();
void lights_off();

This is the what we need to build an IOT-Kit interface for.

Minimal IOT-Kit Interface

Our starting point for our IOT-Kit interface is something minimal. Initially we'll try to cover the following parts of our device abstraction:

void forward();
void stop();
void lights_on();
void lights_off();

We'll then add the rest in.

Changes to support minimal control API

We add the following include near the top of the file:

#include <CommandHostTiny.h>

In order to make our device introspectable and controllable, we need to add in a class which subclasses "CommandHostTiny".

The skeleton of this class looks like this:

class SimplebotHost : public CommandHostTiny {
private:
    char temp_str[128];   // needed for parsing input
    int lights;           // To store state of the headlight
public:
    SimplebotHost() : lights(0) { }
    ~SimplebotHost() { }

    const char *hostid(); // Returns the name of the device
    const char * attrs(); // Returns the list of attributes(+types) that can be changed
    const char * funcs(); // Returns the list of functions the device understands.

    bool has_help(char * name); // To allow us to find out whether a given name has help.

    void help(char * name); // Returns the help for a given name - usually a function
                            // Includes machine parsable type signature

    bool exists(char * attribute); // Returns true/false for an attribute existing.

    const char *get(char * attribute); // Gets the value for an attribute

    int set(char* attribute, char* raw_value); // Sets the value for attributes

    int callfunc(char* funcname, char* raw_args); // Calls the given function with given raw_args
};

So by way of example, hostid, attrs and funcs in this case look like this:

const char *hostid() {    return "simplebot";     }
const char * attrs() {    return "lights:int";    }
const char * funcs() {    return "forward,stop";  }

Note that the name returned as host id here - "simplebot" - is used as the name to advertise the robot on the network, and that is how this line of python is made to work:

from iotoy.local import simplebot

Help is implemented in two ways - firstly to note that help is available and then to return the help available:

bool has_help(char * name) {
    if (strcmp(name,"forward")==0) return true;
    if (strcmp(name,"stop")==0) return true;
    return false;
}

void help(char * name) {
    if (strcmp(name,"forward")==0) Serial.println(F("forward -> - Move forward for 1/2 second"));
    else if (strcmp(name,"stop")==0) Serial.println(F("stop -> - Stop moving"));
    else Serial.println(F("-"));
}

Attribute handling is then done as follows. Note we only have one attribute - lights. ANd here I choose to update the LED state whenever the lights value changes:

bool exists(char * attribute) {
    if (strcmp(attribute,"lights")==0) return true;
    return false;
}

const char *get(char * attribute) {
    if (strcmp(attribute,"lights")==0) { 
        itoa (lights, temp_str, 10); 
        return temp_str; 
    }
    return "-";
}

int set(char* attribute, char* raw_value) {
    if (strcmp(attribute,"lights")==0) {
        int value = atoi(raw_value);
        lights = value;
        if (lights) {
            lights_on();
        } else {
            lights_off();
        }
        return 200;
    }
    return 404;
}

Handling function calls is pretty simple:

int callfunc(char* funcname, char* raw_args) { 
    if (strcmp(funcname,"forward")==0) { forward(); return 200; }
    if (strcmp(funcname,"stop")==0) { backward(); return 200; }
    return 404; 
}

IOT-kit final step

At this stage, the command host isn't being used.

Our final step in our transformation boils down to:

  • Add the other functions from our device abstraction
  • Move the setup for the robot into a setup function in the class
  • Make sure that setup also sets up the command host
  • Make the arduino set up set up our robot
  • Remove the custom code from loop() and run the command host instead.

In practice this means that our final code looks like this:

#include <Servo.h>
#include <CommandHostTiny.h>

int headlights_led_pin;

Servo leftwheel;
Servo rightwheel;

int leftwheel_pin;
int rightwheel_pin;

void forward() {
    leftwheel.write(180);
    rightwheel.write(180);
    delay(500);
}
void backward() {
    leftwheel.write(0);
    rightwheel.write(0);
    delay(500);
}
void left() {
    leftwheel.write(180);
    rightwheel.write(0);
    delay(500);
}
void right() {
    leftwheel.write(0);
    rightwheel.write(180);
    delay(500);
}
void stop() {
    leftwheel.write(0);
    rightwheel.write(0);
    delay(500);
}
void lights_on() {
    digitalWrite(headlights_led_pin, HIGH);
}
void lights_off() {
    digitalWrite(headlights_led_pin, LOW);
}

class SimplebotHost : public CommandHostTiny {
private:

    char temp_str[128];
    int lights; //

public:
    SimplebotHost() : lights(0) { }
    ~SimplebotHost() { }

    const char *hostid() {    return "simplebot";     }
    const char * attrs() {    return "lights:int";    }
    const char * funcs() {    return "forward,backward,left,right,stop";  }

    bool has_help(char * name) {
        if (strcmp(name,"forward")==0) return true;
        if (strcmp(name,"backward")==0) return true;
        if (strcmp(name,"left")==0) return true;
        if (strcmp(name,"right")==0) return true;
        if (strcmp(name,"stop")==0) return true;
        return false;
    }

    void help(char * name) {
        if (strcmp(name,"forward")==0) Serial.println(F("forward -> - Move forward for 1/2 second"));
        else if (strcmp(name,"backward")==0) Serial.println(F("backward -> - Move backward for 1/2 second"));
        else if (strcmp(name,"left")==0) Serial.println(F("left -> - Spin left for 1/2 second"));
        else if (strcmp(name,"right")==0) Serial.println(F("right -> - Spin right for 1/2 second"));
        else if (strcmp(name,"stop")==0) Serial.println(F("stop -> - Stop moving"));
        else Serial.println(F("-"));
    }

    bool exists(char * attribute) {
        if (strcmp(attribute,"lights")==0) return true;
        return false;
    }

    const char *get(char * attribute) {
        if (strcmp(attribute,"lights")==0) { 
            itoa (lights, temp_str, 10); 
            return temp_str; 
        }
        return "-";
    }

    int set(char* attribute, char* raw_value) {
        if (strcmp(attribute,"lights")==0) {
            int value = atoi(raw_value);
            lights = value;
            if (lights) {
                lights_on();
            } else {
                lights_off();
            }
            return 200;
        }
        return 404;
    }

    int callfunc(char* funcname, char* raw_args) { 
        if (strcmp(funcname,"forward")==0) { forward(); return 200; }
        if (strcmp(funcname,"backward")==0) { backward(); return 200; }
        if (strcmp(funcname,"left")==0) { left(); return 200; }
        if (strcmp(funcname,"right")==0) { right(); return 200; }
        if (strcmp(funcname,"stop")==0) { backward(); return 200; }
        return 404; 
    }

    void setup(void) {
        // Setup the pins
        CommandHostTiny::setup();

        leftwheel = Servo();
        rightwheel = Servo();
        headlights_led_pin = 13;
        leftwheel_pin = 2;
        rightwheel_pin = 3;

        leftwheel.attach(leftwheel_pin);
        rightwheel.attach(rightwheel_pin);
        leftwheel.write(90);
        rightwheel.write(90);

        pinMode(headlights_led_pin, OUTPUT);
    }
};

SimplebotHost MyCommandHost;

void setup()
{
    MyCommandHost.setup();
}

void loop() {
    MyCommandHost.run_host();
}

Final notes

So, that's a whistle stop tour of the device layer. The fun thing now: assuming this robot has a hardware serial bluetooth (ala the dagu mini), then this is everything you need to do as an arduino based maker to make your device an IOT-able device. If you're not using bluetooth, then your device assumes it's doing serial down a cable.

Either way though, as a device maker, this is all the changes you need to do to enable the python program we started with to be able to control your robot over a network.

I'll explain how this works in a later blog post, but I thought this would make a good fun first example about how IOT-Kit gets implemented by a device maker to enable a very high level of abstraction to take place.

Read and Post Comments

Escaping The Panopticon of Things?

February 11, 2018 at 10:48 PM | categories: iotkit, python, iot, C++, definitions, iotoy, opinion | View Comments

The Panopticon of Things

The Internet of Things. Ask 100 different people what it means to them and you get a 100 different answers. I know, because I have done... When you do, in my experience you some different versions and themes.

For many companies though, futurists, and techies it boils down to some variation of this:

  • People have devices, which can detect things or have small amounts of processing power added
  • These devices monitor their state or activity, or similar
  • This is published on the internet via a central service
  • This information can be aggregated and worked on, and often can be drilled into down to individual items

But is that really an internet of things? Let alone "The internet of things"? No, it's internet connected things that reports information about you, your environment or your activity to a centralised system. Some extend this to the idea of connecting these centralised systems to each other.

So no, they're not really an internet of things. They're a panopticon of things.

If you're doing this, stop and think. Do you really want to build a panopticon?

A Panopticon of Internet Connected Things

The idea of the panopticon is a relatively old idea. A panopticon was a building where all (pan-) the residents could be observed (-opticon). If that sounds a little creepy, consider it was originally meant as a design for a prison...

It's actually been implemented in both the real world and in fiction. In the real world, it's been implemented as prisons in a variety of places around the world... In fiction, the most recent mainstream "up-beat" example is the floating prison in Captain America Civil War. The most and well known realisation of the idea of turning the general world into a panopticon is in the world of "big brother" in 1984.

One key point: the purpose of the panopticon is NOT to benefit those staying in the panopticon. The purpose is to benefit the owner of the panopticon in some fashion.

This means that any panopticon of things is designed to benefit the person running the panopticon, not the person who owns the things (however well intentioned the maker was/is). Indeed, it can mean the panopticon views you and your things as a product to be sold (advertising, data, etc), not as customers to provide value to. This isn't be universally the case, but it's common enough.

I don't buy products to benefit some random company. Do you? I buy or use products either for my benefit or for the benefit of those I buy them for. Don't get me wrong, being able to opt-in can have benefits. Google maps being able to give you a different route based on real time data is useful.

But be clear - it's based on using data from a panopticon, built on internet connected things.

Obsolescence Really Means Junk

Internet connected things isn't really a new idea. That means we've now gone through the full product cycle more than once. Be it a Nabaztag, Mattel IM-ME, AIBO, or similar. I've picked these ones for a variety of reasons:

  • They might have been acclaimed
  • The manufacturer thought it was a "Big" thing, and mass produced them
  • They seemed hackable and interesting
  • They're all kinda fun or interesting from some angle, but aren't really now

They all relied on some form of central service, and as those services disappeared, they became less useful or in some cases instantly useless junk. I also picked them because they all had many active hacker groups work to make them useful for many years - often in ways the original manufacturers didn't consider.

For each of these, there are dozens of other active objects with similar issues. They all relied on some form of central service. They all became obsolete when the service they relied on to work disappeared. They all contained interesting tech.

These devices all became junk. The value was in the service, not in the device. Even though with all of these devices they had value to the owner, and could've retained value without the central service.

A Panopticon of Internet Connected Junk

So this is really what this sort of internet of things really means. Building a network of benefit to the owner of the network using devices that become useless when the owner decides to cease supporting the devices.

That means the creation of electrical junk, that is wasteful, and in the end of limited benefit to the customer.

Reframing the question.

Rather than ask "what is the internet of things", ask yourself - "What is the internet of my things?" "what should the internet of things be -- for me?". Or I could ask you "what is the Internet of Things of Yours" ?)

  • Tracking of my "stuff"
  • Monitoring and controlling my own devices which are networked
  • Taking my networks at home and using them all in a unified manner
  • Allowing my devices to work with each other.
  • Using my data and devices in ways that benefit me, and those I get them for.

These are somewhat different answers. Similar, but different. They don't preclude working with panopticons. But they do take a different angle.

This reframed question is the reason behind:

I'll be describing in a short series of posts:

  • IOT-KIT and its motivation
  • How to use IOT-KIT to make your own IOT devices that have longevity of value to the owner.
  • IOTOY specifications
    • Device layer
    • Web Layer
  • An overview of how this was implemented in the microbit prototype
  • How to implement this in your own systems.

The core underlying ideas were:

  • Suppose you can make an arduino (or similar) based device. You should be able to make it an IOT-KIT based device trivially. (ie low barrier to entry)

  • Suppose you know very limited python, can you use and control the IOT devices that sit on your network. (Note, this allows you to then trigger behaviour between devices)

  • No "centre". Minimal standard interfaces making it normal for individuals, groups, companies and consortia to create their own domain specific standards. (Much like these days we use JSON, rather than centralised XML schemas for many services...)

  • Plan for "obsolescence means ongoing utilty". If your devices can continue to remain useful after the manufacturer disappears, then you build value, not junk.

These goals are effectively all designed for a low barrier to entry, while still inter-operating.

If you're interested, please like, share, comment or similar, and as always feedback welcome.

Read and Post Comments

Pyxie 0.1.25 Released

February 09, 2018 at 07:54 PM | categories: python, subset, compilation, C++, microcontrollers | View Comments

I've made a new release of pyxie. Largely internal changes.

The focus of this release is the result of the independent intermediate node refactoring project I was undertaking. This was to transform the list oriented data structure for representing a "pure" intermediate form of code into a more stuctured/generalisable format.

The motivation behind this change was the realisation that implementation of end user functions (ie def) would be very difficult with this more structured approach.

The actual release notes (and source releases) are here:

  • https://github.com/sparkslabs/pyxie/releases/tag/v0.1.25

Github repo:

  • https://github.com/sparkslabs/pyxie

Package on PyPI:

  • https://pypi.org/project/pyxie/

Also via PPA for Ubuntu:

  • sudo add-apt-repository ppa:sparkslabs/packages
  • sudo apt-get update
  • apt-get install python-pyxie

What's new user facing

Before I dive into those changes, it's perhaps worth noting some of the other more minor changes, but are more noticeable from a user perspective.

  • A collection of docs added in doc/
  • A start on documenting the models used in Pyxie
  • Licensing on pyxie's output. (Yes, it's what you want, but explicitly so)
  • Some new examples focussed on specific aspects of language:
    • if
    • if-else
    • pass
    • print
    • while-break
    • while-continue
  • The arduin profile has been extended to support the Adafruit_NeoPixel library
  • neopixel example added

Worth noting:

  • While there is an example "simplest_function" it is not expected to compile yet

Neopixel example

This is quite nice, and so since it's perhaps more interesting I'm including a snapshot here:

#include <Adafruit_NeoPixel.h>

pin = 6
number_of_pixels = 16
delayval = 500

pixels = Adafruit_NeoPixel(number_of_pixels, pin, NEO_GRB + NEO_KHZ800)

pixels.begin()

while True:
    for i in range(number_of_pixels):
        pixels.setPixelColor(i, pixels.Color(0,150,0))
        pixels.show()
        delay(delayval)

Note: This reuses the fact that #include is a comment in python. It might change at somepoint to be more like this...

from Adafruit_NeoPixel import *

...since that's logically closer, but for now this is a pragmatic approach that works.

Rationale behind changes

Before this change, pyxie used the following data structures, and code phases when parsing, analysing, transforming and performing code generation.

These were not ideal:

  • Code phase: Parser - read in the source, parsed it, and created a data structure
    • Data structure: pynodes - these represent the concrete python syntax, and are generated during the code generation phase. These are python objects in a class hierarchy. Once created they are analysed and placed into a context to analyse datatypes.
  • Code phase: Analysis. - Analyses the code, and decorates the existing pynodes with type information to understand the programs data and data types. (does not create a new data structure).
  • Transform phase: walks the pynode CST, and generates an intermediate data structure intended to represent the program in the abstract independent of the language used. An independent intermediate form if you like.
    • Data structure: independent intermediate form - This is used to model the program in a "pure form" - which isn't constrained by the source language, and contains enough information for the target language output to be generated. That was the theory. In practice it was a nested list of list of lists ... Not ideal. More on this below.
  • Code generation phase: This walked the independent intermediate form (the lists of lists), and created an output data structure representing the concrete final program.
  • The third/final data structure is intended to represent the final output language. ie it is intended to be a concrete representation of the output language. This final data structure is then capable of creating the output. Again, forms a hierarchy and could be called "CppNodes" (Though they weren't before this change)

The problem here is that while the pynodes are currently well defined (to a large extent) and that the CppNodes are pretty well defined (even if they could be better), the independent intermediate form sucked because it was just nested lists. This meant in practice the code was fragile, difficult to change, and increasingly difficult to work with. In the early days of Pyxie this simplistic structure made sense. However as data analysis becomes more complex and tricky. This mirrors the fact that the same was true in the early days of the parsing side.

So the focus of this sub-project was to replace the intermediate form, and tighten up the differences and make clearer in the code base that we have PyNodes, iiNodes, and CppNodes, where:

  • Pynodes - are the current structures, unchanged - note these are currently prefixed Py - PyDefStatement for example.
  • CppNodes - are map to objects/hierarchy/etc that represents C++ programs, but made clearer (slightly). These are now prefixed Cpp rather than the previous C_ which some of the objects use.
  • iiNodes - represent the independent, intermediate nodes. Since iiNodes need to be used in source code where there are either PyNodes + iiNodes or CppNodes + iiNodes, they have the prefix "ii" enable differentiation.

Since all 3 of these are actually models, the code for these has all moved to sit below pyxie.models.

At some point there will be a need to restructure the code more generally. Parsing, transforming to IINodes and code generation are actually all transforms, and should sit together. That was out of scope for this already relatively major internal change.

Changelog

I could include the changelog, but if you're curious about that, check out the release notes mentioned above.

Future

I'm not going to put a timeline on this - I've made that mistake in the past for pet projects but the following goals exist for future iterations:

  • Code structure:
    • Consolidate the structure of CppNodes and make them "cleaner"
    • Similar for iiNodes
    • Shift type inference and variable detection from PyNodes to iiNodes
    • Change iiNodes to be more ECS based
    • Do the analysis/type inference in more of a visitor pattern (ala ECS)
  • Types
    • Better implement core datatypes to allow transforms
    • Strings need implementing better
    • Aim for closest match representation of datatypes
    • Allow JSON type structures to exist
      • Implement lists
      • Implement dictionaries
    • Implement tuples
  • Language/structural
    • def's with no arguments, and no local variables
    • def's with arguments
    • def's with local variables
    • classes
  • Example system goals:
    • It should ideally be possible to run a perceptron style neural network on an Atmega 8A with the aim of making a robot that can follow a line based on said network.

The example system is deliberately ambitious/difficult - at least for a version of python compiled to C++ to run on such a small device.

Some parts of this will go quicker than others, and won't be done strictly in that order.

Most of it however relies upon better internal code structure. (When I started after all it wasn't clear that this would work or be a good approach, so used json objects throughout. As time goes on it becomes clearer that those ad-hoc structures are in the right sort of places, but could do with being more consistent to increase flexibility.

In order to keep releases interesting though, I'll try to add interesting examples at each stage :-)

As usual comments welcome - especially with regard to what examples you might find interesting.

Read and Post Comments

Days 4,5 - Live Below Below the Line (food diary)

July 27, 2017 at 11:27 PM | categories: livebelowtheline, justgiving, lbtlfooddiary | View Comments

End of day 5. So here's the food diary for days 4 and 5.

Again, if this is the first time you're seeing this, some context:

    From 23-28 July, I'm Living below the line - £6 for 6 days food (total) in order to raise awareness of food poverty in the UK, and more specifically, I'm aiming to try and raise as large a proportion of £2500 as possible. (That would help 100 families in need in manchester).

    For more info, and/or to sponsor me, please visit/share this justgiving link.

    If you can't sponsor, please share the justgiving link!

Anyway, as I said, here's the food diary for todsy and yesterday. (And as before, RDA calories for me is 2327...)

As per other days, I'm using 3 flasks to take tea and hot food to work.

Day 4: Wednesday 26 July 2017 - 1898 Kcal

Morning - 510 Kcal

  • Tes
  • 3 slices toast, jam, marg (8nstead of porridge)
  • 1 budget flap jack

Afternoon - 437 Kcal

  • Tea
  • Not pot moodle - with added grsvy and mustard (to give a soy sauce effect - worked quite well)
  • Tea

Evening - 732 Kcal

  • Tesco value mash (1/3rd of a new batch)
  • Peas
  • 3 Asda smartprice sausages
  • Gravy and mustard
  • squash
  • 1 ginger nut

Night - 219 Kcal

  • Tea
  • Chocolate mousse
  • 3 ginger nuts (somethinh nice late)

(Late evening really)

Summary

Calorie Deficit: ~350 calories

The addition of mustard and gravy to the sorta pot noodle seems to have been a good idea. Skipping porridge today was a nice change. As per yesterday it's all a bit samey. Would be nice to have some variety, but that's not an option at the moment. No coffee is definitely a downside here. Super strong tea is a partial sustitute, but not the same.

Fundraising stalled today which is a bit frustrating, but breaking filter bubbles is hard, not everyone who sees this can donate, etc, and most people who see this probably donate to something, probably including foodbanks already. So thst's all good. If you read this, any suggestions for reaching £ 1000 would be great...

Day 5: Thursday 27 July 2017 - 2065 Kcal

Morning - 374 Kcal

  • Tea
  • Budget Flap Jack
  • Tea
  • Porridge

Afternoon - 467 Kcal

  • Pasta 'Not Pot Noodle', with added gravy / mustard for seasoning
  • Tea
  • Squash
  • Tea

Evening - 606 Kcal

  • Tea
  • 3 Asda smartprice sausages
  • Tesco value mash
  • Peas
  • Gravy, Mustard

Night - 618 Kcal

  • 1 Budget flap jack
  • 2 slices toast, jam, marg
  • 2 ginger nuts
  • 1 tesco value chocolate mousse

(Late evening really)

Summary

Calorie Deficit: ~300 calories

Reached 920 today, which is pretty awesome, and makes 1000 seem possible. Also, now at the stage where I now know that the food left for tomorrow is all pretty much fair game. It's all pretty much the same stuff but it is something at least.

Even a small amount more (and people banding funds together) allowing some variety, fruit, veg would've been nice.

Also, despite consistently under RDA calories by a wide margin, I've gained 0.8kg this week. That's either just 'in transit' so to speak (lack of fibre?), or due to low nutritional content. Either way, it strikes me theres an issue with low cost diets that is probably related to obesity.

Unlike many I know tomorrow this ends. For others, often demonised by politicians and media, this goes on week in, week out, relentlessly, being kicked when they're down. That's the oppressive reality of Austerity, and we meed to do better. But for now, we can at least make the job of foodbanks easier...

Please do donate

Overall though, this is worth it. At the end of Day 5, the amount raised so far is £920. That's a fantastic amount, and will help a lot of people. Reaching £1000 would be amazong though!

If you'd like to help push me towards the goal of helping 100 families, in Manchester please sponsor me on justgiving.

Either way, thanks for your interest, and please share this, or the justgiving page.

Read and Post Comments

Day 3 - Living Below the Line (Food Diary)

July 26, 2017 at 12:31 PM | categories: livebelowtheline, justgiving, lbtlfooddiary | View Comments

So, end of Day 3. So here's the food diary for today..

Again, if this is the first time you're seeing this, some context:

    From 23-28 July, I'm Living below the line - £6 for 6 days food (total) in order to raise awareness of food poverty in the UK, and more specifically, I'm aiming to try and raise as large a proportion of £2500 as possible. (That would help 100 families in need in manchester).

    For more info, and/or to sponsor me, please visit/share this justgiving link.

    If you can't sponsor, please share the justgiving link!

Anyway, as I said, here's today. (And as before, RDA calories for me is 2327...)

Day 3: Tuesday 25 July 2017 - 2101 Kcal

Much like yesterday, I'm using 3 flasks to take tea/etc to work

Morning - 388 Kcal

Home:

  • Tea - from teapot (2 teabags left in pot overnight with hot water), microwaved Remainder of tea was also microwaved/boiled, put in flask with 2 teabags. Then teaport refilled to brew during day...
  • 1 slice jam sandwich
  • 1 ginger nut

Work:

  • Tea - from flask (The topped up). Incredibly strong (since tea made from strong tea...)
  • Mid Morning - Porridge from flask

Afternoon - 563 Kcal

  • One of the "not pot noodle" pasta dishes from the food flask.
  • Tea (from flask)
  • 1 budget flap jack
  • Tea (from flask)
  • Squash (600ml)

Evening - 837 Kcal

  • 1/3 pack of value mash (Remainder from days 1 & 2) heated up in microwave
  • 3 sausages, cooked sunday, heated up with mash in microwave
  • 81g frozen peas (+4g marg to improve)
  • 15g Gravy (+140ml water)
  • 11g Mustard

Later in evening, watching film:

  • 5 Ginger nuts, broken up into small pieces to be a bit like popcorn :-)

Night - 356 Kcal

(Late evening really)

  • Tea
  • 2 slices of toast (marg, jam)
  • Tesco Value Chocolate Mousse
  • Glass squash

Summary

Calorie Deficit: ~200 calories

Overall very similar to yesterday. Little changes though. Toast late with a chocolate pot (which I'd almost forgotten about) was very welcome. The "budget" flapjack was nice too. Perhaps a little squidgy this time, but perhaps just means it needed to cooked for a bit longer ideally.

(Flapjacks are one of the earliest things I remember cooking for myself, so they're always a bit of a treat :) )

Calorie deficit is better today. But then eating a little less earlier in the week means I'm less likely to run out at the end of the week, which is the way round I'd prefer it personally...

Something sweet/treat before sleep is nice...

Only downside is knowing that tomorrow's food will be the same as today...

The other thing though is that it is still not satisfying. It's food. It's clearly close to the right amount of calories, but it's not satisfying.

The other thing is the Morrisons M Saver gravy & mustard really help. I added a dollop of mustard to the "not pot noodle" when I was heating it up and it added something. I might try adding some of the gravy tomorrow. I suspect I'll regret that, but worth trying :-)

Please do donate

Overall though, this is worth it. At the end of Day 2, the amount raised so far is £885. That's a really amazing amount from very generous sponsors. We could go higher though. It's 35% of where I'm aiming for...

If you'd like to help push me towards the goal of helping 100 families, in Manchester please sponsor me on justgiving.

Either way, thanks for your interest, and please share this, or the justgiving page.

Read and Post Comments

Days 1, 2, Living Below the Line

July 25, 2017 at 12:45 PM | categories: livebelowtheline, justgiving, lbtlfooddiary | View Comments

Day 3 of Living below the line for manchester foodbanks...

    Living below the line - £6 for 6 days food (total) in order to raise awareness of food poverty in the UK, and more specifically, I'm aiming to try and raise as large a proportion of £2500 as possible. (That would help 100 families in need in manchester).

    For more info, and/or to sponsor me, please visit/share this justgiving link.

    If you can't sponsor, please share the justgiving link!

As I start, I note I haven't put my food diary online anywhere. I've said what I've bought, and I've said what I intended to eat, but not actually posted what I have eaten. As a result, I've created a new category on this site, which means you can jump straight here:

Regarding brands, etc, please see the first day's entry

For each day/part of day, I list the calories I get those days. For reference, my RDA calories for age, weight, height, gender are 2327 at the moment. (Based on the Mifflin St Jeor equation, and sedentary activity factor )

Day 1: Sunday 23 July 2017 - 1413 Kcal

You'll note I use the microwave to make the tea stronger. I normally drink a fair amount of black coffee. Judicious use of a tea pot and microwave results in stronger tea. Not coffee strength, but coffee colour.

Morning - 0Kcal

No breakfast in the morning because I hadn't been shopping. No tea, no coffee, no juice. Water though

That said, while doing the shopping, there was a very welcome bite/free sample of flan, so since that's free and open to everyone, I take and enjoy :-) (Since I was really hungry at that point it was welcome)

Can't afford eggs this week. Or milk. Or flour. Or pre-made flan...

Afternoon - 495Kcal

Got back with the shopping. Starving. Ate 2 giner nuts & some squash while brewing tea, and making porridge as a late breakfast. Later had toast as a late "lunch"

  • Blackcurrent squash, 1 glass
  • 2 Ginger Nuts

  • Cup of tea - Made in cup in microwave. Tea bag added to tea pot. Second tea bag added to pot, topped up with hot water, left to stew.

  • Porridge - Asda Oats, 41g (+water)

  • Tea - Made by microwaving a cup of tea from the tea pot, and adding hot water to pot (and a tea bag)

  • Toast - 2 slices bread, 9g marg, 20g Jam

Evening - 642 Kcal

Evening meal. Had earlier than I would otherwise, since hungry. Since I'm cooking for one, but have things like mash - which serves several, I cook a fair amount this evening, most of which will go in the fridge. Mash lasts 3 days. I'm planning on 3 "sausages"/meal (asda value sausages are OK if you like chip shop sausages. If you don't like those, you wouldn't like these ones). That would leave 2 "spare" sausages which I plan to use as lunch during the week, which I cooked that evening...

So I cook:

  • I pack of value mash (using more water, but no milk). Add 13g of marg to improve flavour/season
  • 17g of gravy (140ml)
  • 98g of peas (aimed for 100, being a bit under was fine)
  • 11 sausages.

And I eat:

  • 3 sausages
  • 1/3 pack of value mash
  • 17g/140ml of gravy
  • 98g gravy
  • 10g mustard

With that I have more squash

Night - 138 Kcal

Peckish in late evening

  • 3 ginger nuts
  • Cup of tea. (Again, pour from pot, microwave, add boiling water to pot)

Other

That evening I also prepared:

  • My lunches for the week. Cooked 5, froze 3. (left 2 in fridge)
  • Some "budget flapjacks" to have as "snacks". (You'll note the low number of calories above...)

I'll cover those two in separate blog posts, as individual recipes, since they're probably quite useful to have in a separately viewable category (as well as this one - I'll update this post with links when they're added).

As summary the lunches are spaghetti, curry sauce, peas + those 2 spare sausages - which I call a "not noodle" below. The budget jacks are oats, water, margarine (less than normal) and strawberry jam.

Summary

Deficit of ~900Kcal below RDA

Calories are well below RDA for the day. I kinda expected that, but that's due to poor lunch really, and small breakfast. No milk in tea/porridge saves a lot during the week. But might look odd. I've had enough black tea in the past though...

Day 2: Monday 24 July 2017 - 1910 Kcal

First day at work while living below the line. While there is tea and coffee freely available at work, I work on the assumption that I can't have that this week, so I'm using flasks.

At home I have a number of flasks. 3 food flasks, and a couple of hot water flasks. (accumulated over years) They're important this week.

First thing I do in the morning is prepare 3 flasks:

  • One with 2 tea bags, and hot water. (To use as a tea pot) (I take two more tea bags with me to work, but don't use them)
  • One with hot water + 58g oats
  • One with the "not-noodle" lunch which I'm having, after microwaving it.

Also a water bottle filled with water with 75g of squash added.

When using a food flask, you need to fill with boiling water before using, leave for 10 minutes (helps overcome thermal inertia), and then immediately fill with overly hot food. In this case I simply pour the hot water from the flask back in the tea pot that morning...

(I then promptly forget to bring the antibiotics I'm taking for the leg infection I gained last week)

Morning - 327 Kcal

Home

  • Tea - from teapot, microwaved
  • Breakfast - Toast (while making everything else) 1 slice, marg, jam

Work:

  • Tea - from flask. Hot water added/topped up
  • Mid Morning - Porridge fro flask. (Porridge made in a flask over a period of 2 hours is much nicer than on a hob if using just water/oats)
  • Tea - from flask. Hot water added/topped up

Afternoon - 400 Kcal

  • Drink squash
  • The "not noodle" lunch - from food flask
  • Tea - remainder of tea from flask

Evening - 1045 Kcal

Get home, have to have antibiotics first. So have tea, and a single biscuit.

Wait an hour, cook dinner...

  • 1/3 pack of value mash (1/2 of what's left over from night before) heated up in microwave
  • 3 sausages, cooked last night, heated up with mash in microwave
  • 98g frozen peas (+4g marg to improve)
  • 17g Gravy (+140ml water)
  • 11g Mustard

A bit later as "dessert":

  • 2 jam sandwiches, and one of the budget flapjacks.

Night - 138 Kcal

Late evening, watching TV....

  • Tea (from pot, microwaved)
  • 3 ginger nuts

Summary

Deficit of ~500Kcal below RDA

More calories than yesterday, didn't feel massively hungry at the end of the day, but definitely felt hungry during the day/evening - more so than normal. This is a bit odd - while 1876 calories looks low relative to RDA, relative to what I've been having for the past 6 months (I've been dieting) it's actually higher than normal.

The difference I think is the fact this is unbalanced towards carbs, away from veg and away from protein. (That said, I've been quite careful to manage the foods I've had over the previous 6 months to balance/prevent hunger, none of which tricks I can do this week)

If I wanted to not feel hungry I'd've need to have more food in the early and later evening. The food I'm having tastes either OK or nice, but isn't really satisfying.

I've got photos of most of the food I've eaten which I'll add later. In part so people can see what some of this really looks like.

Please do donate

Overall though, this is worth it. At the end of Day 2, the amount raised so far is £885. That's a really amazing amount from very generous sponsors. We could go higher though. It's 35% of where I'm aiming for...

I've also heard several people wonder how it's even possible to live on £6 for 6 days, and hopefully this is of interest to them. Bear in mind though that almost any deviation from this requires more funds. Raising it to £1.50/day would make a huge difference in practice. £2/day brings it to the level which foodbanks effectively budget for (based on looking at the numbers they publish).

That's a shockingly low figure, and without donations people in need - people who aren't supported by the the safety nets we're supposed to have - including people from all walks of life.

So please donate. Or share. Or donate at your local foodbank/supermarket.

If you'd like to help push me towards the goal of helping 100 families, in Manchester please sponsor me on justgiving.

Either way, thanks for your interest, and please share this, or the justgiving page.

Read and Post Comments

Live Below The Line

July 23, 2017 at 06:09 PM | categories: livebelowtheline, justgiving | View Comments

So, I've posted on facebook about this, and posted on twitter, and posted on justgiving, but I've not posted here. What am I doing?

This week - Sunday 23 July through Friday 28th July, I'm living below the line to raise funds for Manchester Central Foodbanks, and to raise awareness of the issue of food & child poverty in general. (In the UK, there are 4 million children in poverty right now, and foodbanks were accessed over 1.1 million times last year - 1.1 million times people would've literally gone hungry if foodbanks did not exist. (Which is an epic fail for our society IMO)

You can find out more about this, and how to give on the justgiving site here:

Short version is please either donate or share that page if you can, it makes a huge difference to the foodbanks. I'm aiming to raise as much of £2500 as possible, and through the generosity of others, raise £795 before gift aid is added on (bringing the total to around £900 so far). £2500 would help 100 families on our doorsteps in their time of need.

Day 1

Background

This is the first update this week, so let's dive in.

Today I started my "Live below the line" challenge to raise funds for manchester foodbanks. This is where I have just 6 pounds for all food and drink for the next 6 days (including today). So today's first order was to go shopping so I could have breakfast (and also get food for the next 5 days).

£1/day is the world food poverty line, below which almost a billion people live. (Well, technically it was £1 in 2011, it is now about £1.40 )

Plans vs reality...

So this was the £6...

(I took cash, since it makes it representative. Also in the UK, unless you're homeless, you tend to get paid either weekly (benefits/low end wages) or monthly, so I think taking it all in one go is reasonable.)

I've taken a bunch of photos, and will summarise as I go through the week what the plan is, but I thought when I went out I'd spend £5.99 In Asda I thought I'd won back 6p, with oats costing 59p there rather than 65p in Tesco. However, I was caught out with peas in Tesco now being 76p not 69p (literally overnight). So that means my total now came in at precisely £6 - which is a bit close to the wire.

So what have I got? Some things might surprise, and some might look like odd choices. I'd always decided when doing this that rather than just scrape by, I'd try and live as well as possible doing this. There's limits, but anyone who's live on the breadline in the past (I had cuppa soups thickened with instant mash as lunch for a very extended period 20 years ago...), you'll know that you can't live at subsistence level and just have nothing nice. So this takes that into account.

Reciepts

Everyone who does this tends to post reciepts, so here they are... (Morrisons one is doublesided)

Nutrition

Also there's the issue of getting enough calories. I know currently, I'm losing weight by eating about 75-80% of RDA calories, but that's not the point here. If I'm not to lose weight, I should eat about 2300 calories for my height/weight/age/gender.

I should also aim to get a decent mix of proteins, vegetables, carbs etc. I'm not convinced it is possible to have a nutritionally balanced diet in the UK on £6 for 6 days...

What I've got is not nutritionally balanced, it's literally the maximum amount of food I can get to try and get enough calories. It's not too bad overall I guess, but it's definitely carb heavy, protein and nutrient light.

What's missing?

Dairy. Fresh fruits. Decent quality protein.

What did I get? Well, here's a photo:

Specifically in that photo:

  • 2 packs of tesco everyday value instant mash. (Theoretically 8 portions, but I don't have milk so 6 portions)
  • 40 tesco everyday value tea bags
  • 1x Morrisons M Saver loaf of brown bread (24 slices)
  • 20 Asda Smartprice Sausages
  • 900g Tesco Everyday Value peas
  • 1x Jar Morrisons M Saver Strawberry Jam
  • 500g Asda Scottish Oats
  • 1 litre Morrisons M Saver Blackcurrent Squash
  • 1 jar Morrisons M Saver Curry Sauce
  • 1 jar Morrisons M Saver Mustard
  • 1 pack Morrisons M Saver Gravy
  • 1 Pack 4 Tesco Everyday Value Chocolate Mousses
  • 1 pack Tesco Everyday Value Ginger Nuts
  • 500g Morrisons M Savers Spaghetti
  • 250g pack Asda Brilliantly Buttery Margarine

(When I found that the oats were 6p cheaper than I expected, I thought I'd be able to substitute the bisuits and mousses for some fruit, but the fact the peas were 7p more expensive scuppered that)

Breakfast Today

So, once I'd bought all this I was able to have breakfast. Since I was hungry at this point, I had a snack of 2 ginger nuts and some blackcurrent squash, while making breakfast.

Breakfast itself consisted of tea and porridge (40g). Neither made with milk. I discovered a while ago that porridge made without milk is actually OK, which surprised me a touch. I won't be making breakfast this way during the week, but it's OK for the weekend.

Anyway this was breakfast:

I got the tea that strong by:

  • Putting water in a jug with 2 tea bags. Microwaving it for about 4 minutes.
  • Then emptying 1/2 into a mug, with a tea bag and standing for a minute. Then putting rest (+tea bags) into tea pot with more hot water. I then make tea using the tea itself as hot water, with an added tea bag each time.

It's not the same as coffee, but it's the right colour :-)

What's with ...

As I said above, some things might look a little odd to some eyes when looking at what I've bought. Specifically things that might jump out are: jam, ginger nuts and chocolate mousses.

Thing is, we all need something nice, and I wanted to show that there are little things that can help. What you get to add to the foodbank thing at the front should include little things like this. Though each of these does actually have a specific reason.

  • Jam. Gives you something to put on toast, or in a sandwich. It's cheap, and it's a source of sugar/energy. It's the closest I'll get to fruit this week too. Being over 60% sugar though also opens up some options I'll discuss in a different post, but it's the fact that Jam can be repurposed that the reason it's Jam, not (say) cheap peanut butter. It is also very cheap -- 28p

  • Ginger nuts. Starchy carb + sugar. Similar reason. Gets you through a moment of "I need something, now". (Not "I want something now", more "need something") -- 25p

  • Chocolate Mousse. Closest thing to a luxury. It's also the closest I'll get to dairy this week. Again, it's calories + a flavour. For 20p you don't actually get a lot here, but it's something. And given all I had left was 20p - I couldn't afford fruit, and there was very little that was available as an alternative, so why not?

  • Gravy. Looks like a luxury, but isn't. Gravy is essentially extra meat flavouring and helps make poor quality meats (such as cheap sausages) taste nice. It can also be added to sauces to make sauces more meaty.

  • Mustard. Similar role to gravy. Got this in part because I was surprised that anyone actually did a mustard that cheap (23p), and was partly curious. I do know though that it helps with improving flavour as I say. It is also going to be useful with the curry sauce for 2 reasons. Firstly mustard is an emulsifier, which means adding some may help thicken the sauce slightly - helping it go further. Secondly, it will help with the spicyness. Cheap curry sauces often lack any kick. (Bit like chip shop curry sauce)

  • "Buttery" Margarine? This is pure practicality. per kg, buttery margarines and their ilk are more expensive than the value (M Saver, everyday value, smartprice) alternatives. But as a unit cost 250g of this is cheaper than 1kg or 2kg of the value alternative...

ie out of these the jam, gravy, mustard (and to an extent the ginger nuts) have a dual usage.

  • Pasta & Curry Sauce? Pasta and no pasta sauce (or tomato product) looks a bit odd. The aim is to use the curry sauce with the pasta instead. This will probably taste a bit odd, but will explain later. This is sheerly down to cost. Curry sauce is cheaper that pasta sauce. I considered sweet and sour sauce instead, but figured that would be too wierd. Also, I'd need 3p which I didn't have.

What's for Dinner/etc then?

Well, clearly today I will be having Jam on Toast for lunch. (admittedly late)

For dinner I'll be having sausages, mash and peas, with gravy and mustard. I won't be having a choc pot though.

But I'll follow up on these later.

Closing thoughts...

I actually couldn't see any real alternatives than this to be frank. £6 for 6 days is so tight, it's quite painful. You wouldn't want to do this for longer.

  • Actually that's not true, I did briefly consider purely vegetarian based on rice and mixed veg, and a couple of sauces, but I'd be climbing the wall by the end of the week, and still be lacking protein. (I'm not practiced at a vegetarian diet, but that may be more practical. I'm not certain though)

I know though if I was doing £2/day for a week it would actually be an awful lot easier and varied. And that's not really that much more.

But quite frankly, the nastiest part about this is knowing that there are families in salford living right now on £1.50/day for food. In Eccles the shelves of the M Saver foods were stripped almost clear. Meanwhile next to this is all the other foods many of us take for granted were right next to them.

I think in a way, this is why places like Aldi work. They're not the cheapest (you'll note nothing I bought was from Aldi - they don't have "budget" alternatives generally), but if you're on just a touch more than £1/day (say 1.50/day/person or 2.00/day/person), most of their food comes into budget AND you're not faced with aisle upon aisle, upon aisle of food you simply can't afford.

Some of the foods I've bought this week are ones I'll happily buy the rest of the time. Some aren't. Just because it's cheap doesn't make it bad. But I do tend to pick and choose. I bought instant mash from Tesco because the Asda smartprice mash is pretty grim IMO. Same goes for value tea.

But the point is normally I can choose. Today I couldn't really. And going shopping hungry (because you've not done this week's shop) and being faced with all that "choice" you can't choose, really is in your face.

I think people talk about inequality a lot, and miss it when it's right under their faces.

Might be worth remembering the next time you see/hear of a show demonising people on benefits...

Lastly, but not least, please do sponsor me via this link or share this link...

... whether or not you think this is what you expected or whether or not you think it's worthwhile. I actually hestitated before doing this - even though the idea comes from Unicef and The Hunger Project, because I worried it was a little "gauche". I then figured "Who cares? If I can raise more money than I can personally donate, that's all that counts"

Every little helps. Every penny. Thank you.

Read and Post Comments

Go See Ghostbusters

July 16, 2016 at 10:48 PM | categories: Ghostbusters | View Comments

My inner 10 year old who saw the original Ghostbusters at the cinema says: GO SEE GHOSTBUSTERS. IT IS BETTER THAN THE ORIGINAL

Seriously, I was utterly obsessed with ghostbusters as a kid, and this so much more amazeballs. Utterly funhilartasticdoaiousness. GO SEE IT

They turned the dial up to 12 with Ghostbusters. It's that good.

I Ain't afraid of no ghost! Fan. Bloody. Tastic. Best Ghostbusters EVER!

If you loved the original, this was better ! If you liked the sequel, this stomps on the statue. The series? @straczynski should be proud.

I really cannot rave about how much I liked Ghostbusters. I was literally dancing in my seat in the end credits. It was that bloody awesome.

Rated 12/10 by inner child.

In case it's unclear - I think it's possible to misconstrue my previous comments, so to clarify...

Yes, I liked it. A lot. A really lot,so amazingly lot it can't be described how much I liked it. I liked it that much. You might think a cup of hot chocolate made with the finest belgian chocolates (and a drop of courvoisier) topped with hand whipped extra thick double brandy cream, teeny marshmallows on top, then with the finest dark chocolate lightly grated on top, with a dark chocolate spoon to stir the drink sounds pretty awesome, but believe me this is SOOOOO much better.

Go. See. Ghostbusters.

If you don't like it, rethink your entire value system. Once you do, and realise just how utterly amazingly awesome it is, it will be so utterly worth it. It's That good.

This has been brought to you by me bouncing around the seat at the cinema, in the car on the way back and ever since getting back home.

And yes, I even have the book of the original film. Still. This is amazingly so much better.

But did I enjoy it?

Oh soo soo bloody much :-)

There was a moment in the film when I just thought "OMG. This is actually better than the original"

And I was 10 when the first one came out and utterly obsessed.

I used to draw the logo, like, all the time

I wrote a review for it at school

I even read out a passage at school when we had to read out a passage from our favourite books from it

I mean NO ONE obsesses like a 10 year old can.

Some properly creepy moments to make small children jump too, and some things which were just so... Well. I don't want to spoil anything. :-)

Let's just say I'm pretty certain the original cast would have loved it :-)

If you need help to convince someone to go, I'm a walking talking advert

I went in with a clear assumption "let's go in assuming they'll do good" after having made sure I'd seen some things over the past year or two with the two main actresses in, and thought "I can see this working". And if you've not seen them "identity thief" and "bridesmaids" are great films.

It's had so much hate on the internet as well in the weeks and months leading up to the film too based on the trailer. Which is really sad. But I now am certain it says more about the haters than the film. I hope the haters go see it and enjoy it - they'll be better people for it(!).

I have never literally danced in my seat in the cinema before - but with this I did. It was utterly, utterly, perfect.

It's a film that's made with so much love, and so much irreverence. :-)

Go see it, you won't regret it.

Read and Post Comments

Peace and Goodwill?

December 02, 2015 at 08:50 PM | categories: politics, sadness, peace, war, notinmyname | View Comments

Peace and Goodwill?

You don't make peace by using bombs. You don't bring people around to your perspective by killing their family, their friends and children. Did bombing paris make us like or sympathise with ISIS? No. Will bombing Syria make the Syrians (and anyone in ISIS who happens to get hit) sympathise with our views? No.

Furthermore, while these fanatics (in ISIS) have no more right to call themselves representatives of muslim, anyone who supports bombing innocents in Syria is equally a fanatic, and simply don't deserve respect from anyone, let alone power. The people in Syria are people. So, let's be blunt. Bombing innocents in Syria, is Bombing innocents. Bombing innocents in the hope you might get a couple of bad guys is NOT the way forward.

Also, how many of those voting in favour of bombing, or calling for voting in favour of bombing will in this and coming weeks call for "peace and goodwill to all mankind" (religious or not - I'm not, but I like the message) in the form of christmas cards and so on? If they do vote in favour of mass murder and killing, it is #notinmyname

Read and Post Comments

Websites for Projects

August 12, 2015 at 11:24 PM | categories: pyxie, iotoy, guild | View Comments

I've decided that I ought to have a small website for at least some of the projects I've created over the years, so I've started doing this for the projects that I view as current.

The initial set of pages are these:

  • Pyxie - my nascent python to C++ compiler
  • Guild - my new actor library that I'm finding is minimally sufficient
  • Iotoy - An IOT statck/project that I started at work, and now maintain on my own time.

All of these share a common infrastructure and design - which is based on a principle of panels.

This was borne from the recognition that many websites today actually look a lot like presentations or slidedecks, just with all the slides on one page. As a result, each page is based on a collection of panels. A panel is analogous to a slide in a presentation, and each panel could potentially be styled differently and laid out differently - in the same way slides can relate to slide designs/slide masters.

As a result, each site has a collection of pages, a bit of meta data about them, and potentially a bunch of includes - that include panels. Again, each panel has a collection of metadata, controlling how it's rendered.

The idea of panels though is also to make things enabling responsive sites easier. (though this isn't implemented)

All content is written/created using markdown.

The three sites are then built in the same way:

  • Their base repository has a site/ directory in the root of the repository
  • Inside there there is a build_site.py script
  • When run, that looks inside the src directory, works through the contents, pulls in any panels used from src/panels, styles them using templates, and dumps the result into a site directory
  • The result is then sync'd into the sparkslabs's web tree.

The pyxie site uses a local hook to use the same markdown documents to create the contents of a docs directory and also to update the module documentation when someone types "help(pyxie)"

At the moment, the three sites have very basic styling, but this will be simple to make prettier later.

At somepoint I'll use the same approach to switch over this blog, probably - which could do with a makeover - since this look is now around 4-5 years old!

Read and Post Comments

Next Page »