PAINTFEUD. Erfarenheter



Relevanta dokument
EDA095 Nätverksprogrammering

Introduktion till Entity Framework och LINQ. Källa och läs mer

Design. Vad lärde jag mig förra lekfonen? Hur bidrog jag Fll lärandet? Kravhantering sammanfa0ning 13/04/14

MOBBNINGSENKÄT. XXX-skolan

Denna laboration skapades för elever vid Roslagens Högskola men kan användas av vem som helst. Namnen på servrarna måste i så fall ändras.

Copyright 2003, SAS Institute Inc. All rights reserved.

När? Varför? För vem? Resultat? (Artefakter?)

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Example database. Municipalities of Sweden

Tentamen i Objektorienterad programmering

Introduk+on +ll programmering i JavaScript

Din egen webserver med Apache

JavaScript in SharePoint and not just for Apps. Wictor Wilén

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

Några övningar att göra

Att sätta upp trådlöst med Cisco Controller 2100 series och Cisco AP 1200 series

Detta dokument innehåller instruktioner för hur du ska ställa in din ipad (ios 9) för olika ändamål

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

Testramverk och Model based testing med java i praktiken

JAVASCRIPT. Beteende

MVC med Javascript och Ajax. Filip Ekberg

Arkitektur. Den Röda Tråden

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

OneDrive/SharePoint. Innehåll

MI Motiverande Samtal i UP Arbetsmaterial

Fass webbtjänster Fass Vet.- texter

Kursprogram Golfträning 2014

Exemple på Tentauppgifter Webbprogrammering

Användarhandbok. MHL to HDMI Adapter IM750

Business Model You Din personliga affärsplan framtagen på åtta timmar.

Designmönster/Design patterns

VAD KAN JAG GÖRA I IPTV BOXEN

Installation av SaySo med Dolphin Bookshelf - hemanva ndningslicens

Elisabet Stöök Konsult SAS Institute AB Copyright 2003, SAS Institute Inc. All rights reserved.

Guide för pdf-formulär

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

PCI ETHERNET CARD 100 MB

Laborativ matematik som bedömningsform. Per Berggren och Maria Lindroth

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Tentamen Nätverksprogrammering Lösningsförslag

Lösningar till tentamen i EDAF25

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

NATURVETENSKAP FÖR LIVET?

WCMS-15, Webbutvecklare CMS

Malmö högskola 2007/2008 Teknik och samhälle

SAS USER FORUM SWEDEN 2017 USER FORUM. SAS Viya och öppenhet en gemomgång av LUA-, Java-, Python- och REST-gränssnitten mot SAS Viya

Swedbank Mobile Loadtesting. LoadRunner Mobile App protocol

MANUAL NETALERT FÖR IPHONE VERSION 1.0

Objektsamlingar i Java

Bele Barkarby DJ Utvecklingssamtal 2015

E-posthantering med Novell Groupwise WebAccess

" «Observable» DataGenerator" betyder att klassen DataGenerator ärver från den abstrakta klassen Observable.

TOPPEN TIPS Lyssna på Mister Maker och följ hans råd och rön. Skicka in dina bästa skapelser till vårt galleri. Du kan vinna ett pris!

Hemtjänsten Svarsfrekvens 77 av 130 utdelade = 60 %


Lösningar till tentamen i EDAF25

HexaFlip. Kravspecifikation

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

Aditro HR Portalen - logga in och byta lösenord

NATURVETENSKAP FÖR LIVET?

Personlig assistans som den ska vara

Enkät Plantskolan Hammarby IF FF vinter 2015/ Har din son deltagit som? 2. I vilken åldersgrupp har din son deltagit?

E12 "Evil is going on"

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

The National Institute of Child Health and Human Development (NICHD) Protocol: Intervjuguide

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Kom igång med ArcGIS Online - Snabba steg för att börja arbeta

Services + REST och OAuth

Post Mortem för Get The Treasure!

Appen som gör dig mer effektiv

Påminnelse: en datatyp för bilder. Programmering. En datatyp för bilder. Spegelbild. hh.se/db2004

Tentamen OOP

Skapa test med fritextfrågor

7 Mamut Client Manager

Säkerhet. Säker kommunikation - Nivå. Secure . Alice wants to send secret message, m, to Bob.

Underkänt 0-29 poäng Godkänt poäng Väl godkänt poäng. Viktigt! Glöm inte att skriva namn på alla blad du lämnar in.

Modern webbutveckling. av Robert Welin-Berger

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Datorlaboration 0, Programmering i C++ (EDAF30)

API Notera HTTPS POST msg UTF-8. API_key JSON Mobilnummer format 1. Skicka ett SMS till specifikt nummer POST parametrar: from msg API_key Exempel:

Inlämningsuppgift 2. DA156A - Introduktion till webbutveckling Teknik och samhälle, Malmö högskola Oktober 2012

Android (BYOD) -Installera mstart -Kom igång manual

Programmering för språkteknologer II, HT2014. Rum

A new exciting outdoor target game

Tingsholmsgymnasiet är en modig och nytänkandeskola som kännetecknas av gemenskapoch trygghetoch utmärker sig genom kunskap och kompetens

Introduktion till Community i Mediekatalogen SLI

Övningsuppgift 8. ArchiCAD 16. Eget Bibliotek ! Med kopieringsrätt för Peder Skrivares skola, Varberg

För kunder som använder Windows för nätverksanslutningar

1ME323 Webbteknik 3 Lektion 6 API. Rune Körnefors. Medieteknik Rune Körnefors

Användarmanual PortWise

"if"-satsen. Inledande programmering med C# (1DV402)

Användarmeddelande (januari 2012) Ny programversion. FLEX Reseräkning. Version 12.1a

TRÄNINGSPROGRAM Ämnets syfte

Vad händer när barn får bestämma mål för intervention? Kristina Vroland Nordstrand CPUP-dagarna Stockholm 2015

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

Plugga/slappa/leva/plugga/slappa/leva/plugga/slappa/leva. Carina Bäckström & Ola Olefeldt

PSYKOLOGISK UNDERSÖKNING H 70:

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Transkript:

PAINTFEUD Erfarenheter

OM OSS Tobias Hill, Citerus! Jesper Hammarbäck, Citerus KLIENT SERVER

AGENDA VAD? Paintfeud, Spelet VARFÖR? HUR? Arkitektur klient & server, CQRS ERFARENHETER

VAD?

PAINTFEUD Pictionary:ish 2-8 spelare per spel Spelarna turas om att rita och gissa Vinnare koras

VARFÖR?

Utmaningen Lära & testa nya tekniker Så kul att vi inte kan låta bli

HUR?

TOPOLOGI CLIENTS ios KLIENTER PULL en gång i minuten JSON över HTTPS APACHE JETTY MongoDB

KLIENT

KLIENT RAMVERK: Appcelerator Titanium Javascript som limspråk mot rikt API

KLIENT RAMVERK: Appcelerator Titanium Pluginbaserat

KLIENT UI UI-element Observer Pattern Services *service.js MODEL Ext remote.js Updater Commands Server state

SERVER

CQRS Command Query Responsibility Segregation B. Meyers CQS, Command/Query Separation Att ställa en fråga ska aldrig ändra svaret Tillämpas inom ett Bounded Context

CQRS Simply the creation of two objects where there was previously only one -- Greg Young Separerar skriv från läs inom kontextet Ren domänmodell på skrivsidan Flera klientanpassade modeller på lässidan

EVENT SOURCING Definition: Capture all changes to an application state as a sequence of events Game RoundStarted(id1, 4) PlayerJoined(id1, 3) PlayerJoined(id1, 2) - gameid : id1 - version: 4 - state : AwaitingPainting GameCreated(id1, 1)

SERVER Scala Scalatra Spring (DI, i18n, JMX etc.) Jetty Quartz Scheduler Maven

SERVER - GAME BC Event Store EventPublisher EventBus Repository Denormalizers Game Domain Model CommandHandler SagaScheduler Task Store Read Model Store ReadModelFacade HTTP API Command EP Query EP Commands Queries

VARFÖR CQRS+ES?

ERFARENHETER

ERFARENHET 1: BRA KLIENTUPPLEVELSE ÄR SVÅRT

ANTAGANDE: Mobilnätverk är tillräckligt bra

Din tur att rita! Ok. Jag är redo! Ditt ord är BIL. Här kommer min BIL: Dags att gissa! Gissar NATT FEL Gissar BIL RÄTT

Ny runda. Du ritar! Ord: BIL. Här kommer min BIL. Dags att gissa! (Rätt ord: BIL ) Jag gissade rätt på 24s.

KLIENT UI UI-element Observer Pattern Services *service.js FEJK MODEL Ext remote.js Updater Commands Server state

STATE EXEMPEL PÅ FEJK (för flow) Spelare accepterar/nekar ett spel. Spelare har just ritat eller gissat.! KLIENT STÖRRE UTMANING Spelare är sist att acceptera/neka ett spel. Spelare X gissar sist i en runda, men ritar inte i nästa. Spelare X gissar sist i en runda, och är den som skall rita i nästa.! SERVER LOOK-AHEAD

ERFARENHET 2: CQRS GER FÖRDELAR

Event Store EventPublisher EventBus Repository Denormalizers Game Domain Model CommandHandler SagaScheduler Task Store Read Model Store ReadModelFacade Command EP Query EP

HTTP-API post("/:gameid/join") {! // May cause IllegalArgumentException -> SC_BAD_REQUEST (400) val gameid = GameId(params("gameId")) val sessionid = SessionId(params("sessionId"))! // May cause NoSessionException -> SC_UNAUTHORIZED (401) val playerid = sessionrepository.get(sessionid)! commandhandler! JoinPlayer(gameId, playerid) status(sc_ok) }

Event Store EventPublisher EventBus Repository Denormalizers Game Domain Model CommandHandler SagaScheduler Task Store Read Model Store ReadModelFacade Command EP Query EP

CommandHandler (Actor) case JoinPlayer(gameId, playerid) => { val game = repository.load(gameid) game.joinplayer(playerid) repository.save(game) }

Event Store EventPublisher EventBus Repository Denormalizers Game Domain Model CommandHandler SagaScheduler Task Store Read Model Store ReadModelFacade Command EP Query EP

GAME - AGGREGATROT class Game extends AggregateRoot {! private val joinedplayers = new LinkedHashSet[PlayerId]! def joinplayer(playerid: PlayerId) { assertisinvited(playerid) if (!hasalreadyjoined(playerid)) { applychange(playerjoined(gameid, nextversion(), now(), playerid)) if (hasreceivedallinvitationresponses) { applychange(roundstarted(gameid, nextversion(), now(), creator, nextword())) } }!} def handleevent(event: PlayerJoined) {! }} version = event.version lastupdated = event.timestamp joinedplayers += event.playerid

GAME - AR TRAIT trait AggregateRoot {! private val uncommittedevents = new ListBuffer[GameEvent]! def applychange(e: GameEvent, isnew : Boolean = true) { getclass.getmethod("handleevent", e.getclass).invoke(this, e) if (isnew) uncommittedevents += event def loadfromhistory(history: List[GameEvent]) { history.foreach(applychange(_, isnew = false)) }! }

EN REN MODELL ÄR LÄTT ATT TESTA

Event Store EventPublisher EventBus Repository Denormalizers Game Domain Model CommandHandler SagaScheduler Task Store Read Model Store ReadModelFacade Command EP Query EP

QUERY-SIDAN - DENORMALIZERS Enkelt att lägga till nya vid behov Undvik beroenden mellan denormalizers Bygg upp nya modeller mha återpublicering

ERFARENHET 3: ACTORS FÖRENKLAR

ACTORS Mailbox! def gethandler(id: GameId) = { handlerpool(math.abs(id.hashcode % numberofhandlers)) }

ERFARENHET 4: DYNAMISKT DATA

Lägg till dynamisk data vid query-tillfället! Avatar, antal chattmeddelanden etc.

ERFARENHET 5: EVOLVERANDE LOGIK

FÖRÄNDRING AV EVENTS Scalas Option (JSON-deserialiseraren använder None) Ny konstruktor (JSON-deserialiseraren väljer den som passar) Nytt event, t.ex PlayerJoinedWithLocale

ERFARENHET 6: VERSIONSHANTERAT API

Undvik om möjligt, pga ökad komplexitet JSON är naturligt förändringståligt Vi versionshanterar mha HTTP Accept header

minimumsupportedversion = 1.1 POST /login application/vnd.com.paintfeud-v1.0+json HTTP 406, NOT_ACCEPTABLE (Hämta en ny från AppStore) POST /login application/vnd.com.paintfeud-v1.2+json HTTP 200, OK (Nu kör vi!)

SAMMANFATTNING Tobias Hill tobias.hill@citerus.se Spelarnamn i Paintfeud: tobias Jesper Hammarbäck jesper.hammarback@citerus.se Spelarnamn i Paintfeud: jesper