The Author Online Book Forums are Moving

The Author Online Book Forums will soon redirect to Manning's liveBook and liveVideo. All book forum content will migrate to liveBook's discussion forum and all video forum content will migrate to liveVideo. Log in to liveBook or liveVideo with your Manning credentials to join the discussion!

Thank you for your engagement in the AoF over the years! We look forward to offering you a more enhanced forum experience.

Your example (2 instructions to reduce by 2000ft) is not good because it's a relative instruction based on internal state. But why not simply issue an instruction to reduce altitude to 3000ft. Then your commands become unambiguous.

Also - automatic rejection based on aggregate version number can lead to queuing problems. Let us suppose that I open booking for a show at 10am and there is huge demand.
Immediately I get 30 requests all based on version 0.
One gets through.
The other 29 are rejected and have to be re-submitted. I send all those validation failures and the users resubmit based on the current state - now version 1. So this time someone else gets accepted, but 28 get rejected. Eventually I have to deal with a total of O(n2) requests. Also the position in the queue no longer depends on the original request ordering - and quite possibly people booking in positions 31+ sneak in first.

To take another example from your airplane aggregate - I tell them to reduce to 3000ft because there's a collision risk but in the meantime they've served a meal and the kitchen stock of chicken chasseur has been decreased by 1, so the request is rejected ...

Versioning may work in some cases but you can't present it as a panacea to conflict resolution.

"where bulkheads are watertight compartments"... - wrong

From wikipedia
"A bulkhead is an upright wall within the hull of a ship or within the fuselage of an aeroplane. Other kinds of partition elements within a ship are decks and deckheads."

so it's the walls not the compartments!
+ 1 or even + 100
I've been trying to wade through authentication examples (zentasks) and it's pretty tough going for those of us still finding our feet in functional waters. For example type signatures like this

def IsAuthenticated(f: => String => Request[AnyContent] => Result)

called by something like this

def index = IsAuthenticated { username => _ =>

may be obvious to the author, but I'm still puzzling over it.
should be fullName instead of name.
loading text should probably be in list config (as per previous note)
the text after example talks about hiddenName and 'id' but there is nothing like that in the example itself. Are we supposed to amend the example based on the text in following paragraphs? It's not clear.

2nd paragraph says "next set the displayfield to 'name' but that should probably be 'fullName' I think

also it says specify hiddenName as 'customerId' - this should be id I think.

Not sure about setting loadingText - I read it was deprecated and I find

listConfig : {
loadingText: 'my loading text'

there should be a comma after type : 'array' (line2) and the quotes are not simple single quotes.
I've been past text from the pdf into my working html page as I work through the examples.
The use of #1 etc to denote points is annoying because it means they have to be stripped out.
Could you replace them (as you have in one example) by // #1 so they are comments?
Also the height on the form of 160 is not quite enough to display the form nicely.
hi -
#7 should be 'url' not 'urlOnly'
pasting example in - quotes are not straight quotes for side, under etc
#7 should be msgTarget not msgTaget
no finish quote on side

And the quick tip doesn't seem to do anything in the example. Not sure what message it's supposed to display for example.