Category: Sci/Tech

The Hackspace Grand Opening (by )

Those of you who follow me on various social media will have seen the photos of Cheltenham Hackspace new premises being spruced up and that is because tomorrow (well today now!) is the grand opening 😀

Sunday 4th of December - if you are local then please pop along - hackspaces or createspaces are made by and for the community and we'd love to meet you 🙂

I'll be taking along steam punk and textile stuff to be working on and have plenty of spare so others can have a go! There is plenty to see and people to talk to and skill share with 🙂

Also I have been making craft videos for Advent as it turns out it is the tenth Christmas of Salaric Crafts How To Blog!!!

Of course I only have 2 vids up and it is now technically day 4 - annoyingly obsolete laptop is obsolete and is being a pain in the backside but I shall continue limping along with it and hopefully get the other two vids to you some time tomorrow!

I also have a craft fayre Monday at the Costa Coffee on Metz Way in Gloucester 🙂 Mainly taking Wiggly Pet Press stuff with a bit of Steam Punk etc...

Cool things I have worked on: Low-latency highly-available NoSQL data store (by )

I've worked on a bunch of cool things in the past; and since I'm always explaining them to people, I realised it'd be good if I just blogged about them so I can just share the link.

I was asked to help design and then build a database to back a social networking system. The main requirement was to be able to satisfy lots of single-record primary-key fetches from a single thread as quickly as possible, because a PHP web app would be requesting lots of data to build the page; we had to do a few hundred of these "random point queries" in a small fraction of a second to get the page rendered in time. It had to be able to scale sideways, by adding more machines to the cluster. It also needed to be able to update this data, but at a much lower load - updates and creations of single records happened when a user went and did them, but people browsing around the site would hit several pages, each of which would request hundreds of records. Read more »

Programming with state machines (by )

State machines are a really nice way of thinking about systems with state. As a notation for expressing imperative code, I much prefer this:

To this:

x = readchar();
while(x != EOF) {
   if(x == 'a') {
      doA1();
      x = readchar();
      while(x != EOF && x != 'x') {
        doA2(x);
        x = readchar();
      }
      doA3();
   } else if (x == 'b') {
      doB1();
      x = readchar();
      while(x != EOF && x != 'x') {
        doB2(x);
        x = readchar();
      }
      doB3();
   } else {
      doC();
      x = readchar();
   }
}

I've always wished I could write that sort of code as a state machine rather than a bunch of nested structured programming primitives. Although there is some charm to the idea of drawing a diagram on the computer and having that be compiled as executable code, though, that can also be fiddly and isn't well supported by conventional programming tools; so I'd rather actually describe my state machine in text. What I want is a syntax for writing state machines, rather than writing imperative code that implements the state machine.

For instance, the diagram I put above wasn't drawn by me; it was drawn by a tool called PlantUML from the following source code:

@startuml

state Processing {
      Ready --> A : a/doA1
      Ready --> B : b/doB1
      Ready --> Ready : not a or b/doC

      A --> A : not x/doA2
      A --> Ready : x/doA3

      B --> B : not x/doB2
      B --> Ready : x/doB3
}

[*] --> Ready

Processing --> [*] : EOF

@enduml

But the UML state diagram is meant for abstract modelling of systems, and lacks the precision and detail required for actual executable code. The state diagram doesn't make it clear that doA2 and doB2 need to be passed the character that was read, for instance. PlantUML's syntax, therefore, also lacks that kind of detail, so we can't just use that.

Also, in a programming situation, it would be nice to be able to express types of state machines: to be able to say that a group of state machines has some useful properties in common, defined by the "type". The type of a state machine defines some high-level states and what inputs or outputs are possible in each state; any state machine of that type has to follow that behaviour, even though it might break the states defined in the type into many substates. For instance, the example state machine above always accepts any character until it receives an EOF, then stops; that might be expressed as a type having a single Ready state with two transitions, one mapping an EOF to the end state and another mapping a character back to the Ready state, with no outputs. That type would be suitable for any state machine that accepts characters until they finish, so a generic "character input stream" might accept a state machine of that type to process them, without needing to know anything about As and Bs.

These thoughts have led me to the following model of a state machine that's suitable for use as part of a programming language (although I've not defined an actual syntax yet):

State machine type

A state machine type is a set of states. Each state has a name, and a list of message types which are acceptable in that state (I am assuming that the underlying type system is smart enough to include things like "character equal to a" as a type, rather than merely "character"). This list must be disjoint.

For each input message type, there's a list of possible next states and an output message type (which in our example above would be a void type, as we never output messages).

There is also an initial state. It's impossible for the initial state to be the target of a state transition on a message, so it only has transitions out to other states. Those transitions all represent possible constructors of this state machine, because the initial state represents nonexistance.

For instance, a type" for vending machine controller state machines might be (given a Result type which has two values, success and fail):

Initial state:
   input: (Create) output: (Void) next state: (Idle)

Idle state:
   input: (Coin(Value)) output: (Value) next state: (Credit)

Credit state:
   input: (Coin(Value)) output: (Value) next state: (Credit)
   input: (Refund) output: (Value) next state: (Idle)
   input: (Select(Product)) output: (success::Result) next state: (Idle)
   input: (Select(Product)) output: (fail::Result) next state: (Credit)

The Value objects output in response to Coin or Refund inputs happen to reflect the current credit in the machine, a fact which the state machine type alone can't represent (that would need to be explained in a design-by-contract invariant of some kind).

From this type can be derived the type of the state machine's transition functions, which in this case will be:

coin :: Idle -> Value -> (Credit,Value) |
        Credit -> Value -> (Credit,Value)
refund :: Credit -> (Idle,Value)
select :: Credit -> Product -> (success::Result,Idle)|(fail::Result,Credit)

Note that the Create transition isn't represented here, because this state machine can't actually be instantiated - it doesn't specify the behaviour enough. There's no way of saying which possible select result should happen, or of what values are returned as outputs. But the functions we have are automatically implemented by the state transition definition, and will cause the appropriate transitions to occur in any state machine that's a subtype of this one; every function accepts an instance of the state machine in a given state, and an input value, and returns a new instance of the state machine and the output value.

Subtyping

State machine types can be subtypes of other state machine types. A state in the parent type may be split into several states in the subtype; any transition to a state A in the parent type must be represented by a transition in the subtype to some substate of A, and all transitions possible from state A in the parent type must be represented by transitions from every substate of A in the child.

For instance, a subtype of the vending state machine might have an infinite number of substates of "Idle", one for each possible configuration of available things to vend inside the machine. If it vends three different products, then these substates might be called Idle(A,B,C) where A,B and C are nonnegative integers representing the stock of each item. The only transition out of "Idle" is when a coin is inserted, so every Idle(A,B,C) state must have a transition from a coin being inserted, returning a Value, and taking us into the Credit state.

However, our Credit state also tracks the stock, and also tracks the credit inserted so far - so we need an infinite set of states of the form Credit(A,B,C,X) where A,B,C are the stocks and X is another nonnegative integer for the number of pennies of credit. So the parent-type transition from Idle to Credit has to be replaced by a transition from every Idle(A,B,C) to Credit(A,B,C,X) where X is the Value of the coin inserted. All the transitions from Credit in the parent type need to be represented as transitions from every Credit(A,B,C,X) state to other Credit(A,B,C,X) or Idle(A,B,C) types as appropriate. But with that done, it can be shown that all the states and transitions of the parent type correspond to one or more in the subtype.

The one exception is the initial state - the creation transitions from that in the subtype need not correspond to those of the parent type.

Given an extension to the syntax to create "parameterised states" such as Idle(A,B,C), which are shorthand for a potentially infinite set of "concrete states" such as "Idle(4,0,1)", we might represent that subtype like so:

Initial state:
   input: (Create(a::NonNegativeInteger,b::NonNegativeInteger,c::NonNegativeInteger))
     output: (Void) next state: (Idle(A,B,C))

Idle(a::NonNegativeInteger,b::NonNegativeInteger,c::NonNegativeInteger)
   state implements Idle:
   input: (Coin(x::Value)) output: (x::Value) next state: (Credit(a,b,c,x))

Credit(a::NonNegativeInteger,b::NonNegativeInteger,c::NonNegativeInteger,x::NonNegativeInteger)
   state implements Credit:
   input: (Coin(x'::Value)) output: ((x+x')::Value) next state: (Credit(a,b,c,x+x'))
   input: (Refund) output: (x::Value) next state: (Idle(a,b,c))

   input: (Select(Product==A)) when: a>0 output: (Success) next state: (Idle(a-1,b,c))
   input: (Select(Product==A)) when: a==0 output: (Fail) next state: (Credit(a,b,c,x))

   input: (Select(Product==B)) when: b>0 output: (Success) next state: (Idle(a,b-1,c))
   input: (Select(Product==B)) when: b==0 output: (Fail) next state: (Credit(a,b,c,x))

   input: (Select(Product==C)) when: c>0 output: (Success) next state: (Idle(a,b,c-1))
   input: (Select(Product==C)) when: c==0 output: (Fail) next state: (Credit(a,b,c,x))

(We really should have represented the stock as a Map(Product,NonNegativeInteger) type and then not duplicated the select rules...)

Converting a parent state into a parameterised subtype state is only one way of splitting a state in a subtype, too. The syntax above would permit the creation of separate states that all say "implements Credit", too. A very simple vending machine that can only hold one instance of one product might split Idle into two states, Empty and Full, for instance; and probably split Credit into CreditFull(Value) and CreditEmpty(Value) to represent the Credit state while also parameterising CreditFull and CreditEmpty with the current credit.

The above syntax for parameterised states can get unweildy if there's a lot of parameters, especially if generally only a few of them are changed in any given transition (imagine the above example of there were ten different products to keep track of). Therefore, as syntactic sugar, it makes sense for it to be possible to define parameters shared implicitly by one or more states. Transitions into those states from states outside the group need to explicitly specify all the parameter values, but transitions within that group can use a different syntax to represent the next state, which only specifies what parameters have changed. All the rest are passed in unchanged, automatically. It might look like this:

Initial state:
   input: (Create(a::NonNegativeInteger,b::NonNegativeInteger,c::NonNegativeInteger))
    output: (Void)
    next state: (Idle(A,B,C))

parameters a::NonNegativeInteger,b::NonNegativeInteger,c::NonNegativeInteger {

Idle(a,b,c) state implements Idle:
   input: (Coin(x'::Value)) output: (x'::Value) next state: (Credit(x <- x'))

Credit(a,b,c,x::NonNegativeInteger) state implements Credit:
   input: (Coin(x'::Value)) output: ((x+x')::Value) next state: (Credit(x <- x+x'))
   input: (Refund) output: (x::Value) next state: (Idle())

   input: (Select(Product==A)) when: a>0 output: (Success) next state: (Idle(a <- a-1))
   input: (Select(Product==A)) when: a==0 output: (Fail) next state: (Credit())

   input: (Select(Product==B)) when: b>0 output: (Success) next state: (Idle(b <- b-1))
   input: (Select(Product==B)) when: b==0 output: (Fail) next state: (Credit())

   input: (Select(Product==C)) when: c>0 output: (Success) next state: (Idle(c <- c-1))
   input: (Select(Product==C)) when: c==0 output: (Fail) next state: (Credit())
}

Implementing state machine types

Note that we've suddenly started giving names to the Values flying around, and specifying an output value rather than just a type, and splitting transitions into different cases with disjoint boolean "when:" expressions. This, too, further constrains the type of the state machine; indeed, this machine can actually be implemented and will provide a simple model of a vending machine - although nothing will be vended.

This means that this new state machine's state transition functions will include a "create" function from the initial stock levels to an instance of Idle(NonNegativeInteger,NonNegativeInteger,NonNegativeInteger).

A real implementation could further subtype this, adding a uniquely-typed IO interface to the Idle and Credit states, passed into the create transition. The Success-returning select operations can then also use pure IO functions to mutate the IO context to one in which the physical mechanism of vending has happened.

But the implementation of a state machine exists in the expressions that return the output value, parameterise the next state, and the boolean expressions forming the "when:" guards. These are full expressions in the pure functional language I'm imagining this thing implemented on top of, so are fully Turing complete.

There is no syntactic distinction between a type and an implementation; a state machine type can be instantiated if all of its outputs have expressions giving them values (ok, singleton-typed outputs such as Void can be implied!). This is a bit like concrete versus abstract classes in an object-oriented programming language.

Chaining transitions

So far, we've only looked at transitions that accept an input value, return an output value and move to a new state. This means that state machine behaviour is defined entirely in terms of its reactions to external values. Since the values we generate for the output and the parameters of the new state are Turing-complete expressions, that is sufficient to describe any behaviour, but it's not always convenient to express complicated behaviour in an expression. Sometimes a complicated operation of a compound data structure such as a list would be better defined as a state machine in its own right.

In order to support that kind of thing, we can also support chaining transitions, which can drive state machine behaviour purely based on internal state, and so do not cause the generation of state transition functions. These come in three types.

The first kind is one that starts with an input value, but which then leads to a next state without producing a value. This next state must be a special "transient state", the rules for which are explained below.

The second kind is one from a transient state to another transient state. This has no input value and no output value.

The third kind is a transition from a transient state to a non-transient state, which produces an output value.

Transient states may not have any non-chaining transitions point to and from them. Every transient state must be referenced from at least one non-transient state through a chain of chaining transitions, starting with a kind-1 chaining transition then zero or more kind-2 chaining transitions. Every transient state must also lead to at least one non-transient state through a chain of zero or more kind-2 chaining transitions, then a kind-3 chaining transition.

Every such possible chain from a kind-1, through zero or more kind-2, to a final kind-3, is equivalent to a single transition from the initial to the final non-transient states; with the kind-1 transition defining the input value and the kind-3 transition defining the output value. They might be implemented as a set of state-transition functions that just tail-call each other, but the transient states are therefore "hidden" inside the state machine from external perspectives. Those state-transition functions are lexically local to the exposed state-transition functions implementing the equivalent non-chaining transition.

But although they are hidden from users of the state machine, a subtype of the state machine can indeed "see" them for purposes of splitting them into substates, adding transitions between them, etc.

Termination

The final thing I've not covered above is terminating state machines. There's an implicit "final" state available in every state machine, if at least one transition to it exists; no transitions from that state can exist. Any transition to the final state appears in the state transition functions as a function that returns the output value, but not paired with a new state machine instance, because there isn't one. It's gone.

It is entirely possible for a state machine to have no non-transient states apart from the initial and final states. For instance, a state machine that traverses a tree and sums up the labels on the nodes might be implemented in terms of transient parameterised states for the current position in the tree and the running total, with an kind-1 creation transition that accepts the tree as an input and a kind-3 finalisation transition that returns the count. This machine will therefore have a single state transition function - from Tree to Number. The actual state of the machine is entirely represented as state parameters passed between mutually recursive functions implementing the chaining transitions, and never appears as a value visible outside of that.

Conclusion

I think I've defined a workable semantic model for state machines that can be used as a way to define sets of pure functions between instances of state machines, that can handle both synchronous state machines driven by external events, and those that bumble around a data structure or iterate mathematical operations.

It needs a proper syntax; personally, I'd prefer one based on s-expressions or IRON, but suitably consistent forms could be defined for any language.

On This Night (by )

Like with Brexit I kept saying it was going to happen and people said it couldn't but it did and it's pretty scary - there is a smarmy rapey, racist homophobe who lies and cheats and looses billions of dollars and bales himself out from charities he's supposed to run and HE got into the White House. A man who throws tantrums is in charge of what I think (but maybe wrong) is the larges arsenal of nukes in the world.

This is scary and heart breaking and obviously anyone who who's looked at history can not help but see the similarities as we go round the cycle of violence once more. Of course this is playing havoc with my near near future dystopia series - the Punk's Universe I have been working on for getting on for a decade and some of which actually dates back to when I was like 14!!! ie the 90's!

The current books are near future but it is supposed to be an alternative history thing... this is the Facebook post I whacked out on it last night:

SO when I was planning my zombie quintette based in the Punk Universe I researched various things - one of the stories follows an apocalyptic cult (I made up) they consider themselves to be a direct line via mothers back to Fatima Mohammed's daughter - they are awaiting zombies and the falling dead of the faithful brought about by a pink/orange devil who gets mistaken for the 2nd coming (I think it was 2nd anyway) main issue is the description of the saviour is also of someone with skin and hair of fire... so in my story I chose a Trump faximial and a red headed half celt half arab who takes after his father in looks and has the red blush face is a muslim and one of the heros though the lesbian mother of his child is the main protag. Considering events that I had pre-empting the Z-times were Britain leaving the EU, Trump becoming president, food banks etc.... getting hit by dirty russian radio isoptopes and a targeted terror attack that wipes out the police et al ready for security corp take over - then there is a 5 way zomb-apoc with disease, drugs, mind control and rocks from space.... resulting in humans mainly living on sea steds. I'm kind of a little concerned that perhaps I should stop writing as it's getting all fooo and wooo and did I mention Essex gets flooded due the ice caps melting and the barrier failing... (and yes I did nick alot of it straight out of the dreams I had whilst sparked out from head injury but the main story line events have been in place for almost a decade now I just did not know the details!)

I also wrote a poem because as the news poured in and people started looking at the date and a) it is the mirror date for the terror attacks on the US 9/11 in the US date writing system verses the 11/9 - of course in the UK it was a 9/11... for numerologists and others who do fortune telling this would seem very important and not a good sign. Then the date analysis began to poor in, coincidence and serendipity reigned - 27 years since the Berlin Wall came down - a symbol of oppression, division and what we thought of as the last echo of the consequences of the second world war.

Then it turned out to be the anniversary of Kristallnacht - of the Night of Broken Glass when the Germans raided, vandalised and murdered focusing on the jewish population in their midst. For me this is one of the scarier and more profound dates and marked a turning of events, it marked the beginning of the escalations that lead directly to the death camps and the horrors of war.

Of course as the day progressed more and more dates where thrown into the mix - many Nazi related and though any given date can offer up the same sort of profound relatedness it does set an uneasiness in the heart.

I watched my social media fed in fascinated horror as my side - the "good side" began to undo themselves with shouts of breaking democracy and calls for assassination - and yes most where in jest and if I had a crystal ball or sure way of divining the future then perhaps we could say... yes this is the thing to be done - but we don't so it is just murder and vigilantism and a whole new pandoras box. It also marks a deepening of the divide, as our societies globally become more and more dipoled and that skism is far more dangerous than the buffoonery of politics. They only have the power we give them...

And the apathetic grow - "BORED" of politics - mainly because most people of my gen have never seen anything they've voted for happen. Out numbered and powerless feeling there are two options for the stability of mind - switch it off - politics like the weather is something you can not change if you are working or middle class or become an activist. This too grooves the trenches of the divide wider - interestingly people are not dividing along traditional lines which will need further analysis.

Me and Alaric got heavily grilled by confused 11 yr old girls puzzled as to how someone like Trump could even be considered for leader. I fear for the kids future but have to hope that the US have fail safes in their system (how long before he's impeached?).

What really really sickened me though was a report that our government is considering alining with the US and Russia!!! My god just no... are they looking at the same world I am?

US is playing the Germany of the 30's, we're the Italy and Russia gets to play itself - I wonder who's going to play the part of Japan. And I hope I'm wrong, I hope I'm over reacting. As I said with the Brexit stuff I want to be wrong... for all our sakes :/

Anyway - me being me I wrote a poem:

On The Night

In between wired breaths my lungs choke and spume
Thoughts of ire lost within as I await the gloom
The nights are rolling in once more
This night is a special one for sure
For there an egg of hope was laid
For there an egg of chance was bade

Shell fragments rained in a cascade
As the dreams of life began to fade a
Delirium of life’s serum a sugary syrup coat
Scattered as fine powder residue with one large fragment
Upside down an opalescent boat
Toppled and teetering it was drawn and consumed within
Glittering in the palp and puss of the albumin

Revealing sticky and congealed
A sickly man who’s heart with the heat of hate has filled
He sits enthroned in eagles glory
Adjusting and changing and faking the story
Too tell of things how he sees fit
And the knives and glass shards stick
In the coagulated mess of a hashed meal
Half assed, half done, half baked
And smashed for an omelette for some body builders sake

Shackles move about my wrists and the memories I was spared
Spear me through the heart from generational despair
When faith was used to justify the means
When the mean broke the night with shattered screams
When blood pooled in shallow graves
In those days
In those ways
And people laughed at those who dared to cry
When people win their freedom or when people die
And the cycle spins and on this night on this night

A breaking down of a wall a breaking of a wall
A wall... he with his crown of arian hue
Marks him proud and true, as if his blood is cleaner than mine
As if he is divine
He would build a wall
Build a wall of hate and I fear the mortar and the foundations
For we have been this way before
We know what’s in store as buildings on bone footings rise
In death stained apocalypse skies

They say these are dangerous times
Or interesting depending on where you fall
but the danger is for one and all
Fall out - is fall out - where ever it falls
And the nukes are nestled waiting and staid
Waiting and waiting there are dues to be paid
And Jews or muslims or... who ever to raid
because they are designated “bad guy”.... they...
They look different... they speak different... they wear differences... they...
Monster... other
Smother and crack down
In the pound
Out the pound
Loose the pound
Gold teeth are melted down
Shhhhh the hiss of gas is the only sound

And when midnight comes there is no reprieve
But amnesties day is coming...
Holocaust memorials strengthened against crumbling
Remembrance of the suffering
Marked and marked and marked
Show the long shadow for this is it
trying to solidify on the fears
To grow strong on the tears
To be multi headed python a hydra that sets it scores
Dividing us by our flaws

But remember they are people like us,
With hopes and memories shared by us,
A part of us, Who are us
Remember the battles fought and don’t sink the stone
Of blood letting and pain
The tide has turned but that does not mean it can not turn it back again
With love, with hope
With each little gesture we make

They are coming from the recesses of collective nightmares
Militia, curfews and a heady clown
One show to rule them
Entertain and bind
Humanity is only skin deep for most
Peer to peer to peer they are kept in check
The harsh the barbarous and savage lurks
In all
And to that nature he has called
Prepare yourself for in the end
The greatest enemy of all is self
Selfish self absorbed self
Do not leave your compassion on a shelf
The need grows

Love and love and love is how it should always go
For assassinations call makes you mirror him
Strengthening that which you hate with underpins
Creating idols, myths and martyrs,
Figure heads of examples to follow for starters
Beliefs to bellow and entrench yourself in
In the tomb
Hoping heaven has enough room
Something you’ll fight to the death fore
Something that gives people their core

In between wired breaths my lungs choke and spume
Thoughts of ire lost within as I await the doom
The nights are rolling in once more
This night’s a special one for sure
For an egg of hope is laid
For an egg of chance is bade

Remember second chances are rare
Of third chances....
Please take a care.

Steel Pan Drum Making (by )

Dear Alaric and Jean you asked for ideas for welding projects for presents for me - you know already that I would like a tank drum but I would also like what I call a Calypso Drum - these used to be used at the carnivals when I was a kid and also during the candle light parades and things. I prefer the ones without drilled holes but if they are easier to make then that is fine 🙂

This one looks like a lot of work - from having spent time round industrial workshops as a kid I kind of had it in my head you just bashed empty oil cans - the sort my bro/uncle David makes into BBQ's. And I'm sure there was a drum made from the bonnet of a car or maybe they just let me play with non-sharpe metal and stuff to keep me entertained as a kid!

Also there is this little beaut which is painted and stuff - I didn't know they came painted - it is lovely but about £80 and isn't as many notes I don't think.

<

iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//ws-eu.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=GB&source=ac&ref=qf_sp_asin_til&ad_type=product_link&tracking_id=httpwwwsnellp-21&marketplace=amazon&region=GB&placement=B00V4UF4PG&asins=B00V4UF4PG&linkId=&show_border=true&link_opens_in_new_window=true">

p.s. you might need to enlist the help of musicians in Cheltenham Hackspace for tuning though Jean you are always moaning at my wrong notes so you should be able to do it yourself! Remember Alaric you do have oscillerscopes!

WordPress Themes

Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales
Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales