Introduksjon til python skriping i arc gis plattformen
Et sanntids, utendørs lagspill med .NET og Azure
1. Et sanntids, utendørs lagspill
med .NET og Azure
NNUG 15. november 2016 Rune Rystad
1
2. • Om spillet
• Arkitektur/design
• Implementasjon og teknologi
– Klientutvikling
– Sikkerhet
– Throttling
– Samtidighet(sproblematikk)
– Persistens
– Beregninger (LINQ)
– Azure
– Testing
– Noen integrasjoner
Agenda
3. 3
Casting
Sølve Heggem
Azure & Web API
Rune Rystad
Overingeniør
Mark West
Executive Producer
Amund Rønold Johnsen
Frontend
Kristian Løken Wille
Frontend
5. • Lag med 3-6 deltakere
• får informasjon om poster i terrenget
– har ulik, fallende verdi
– kan bli synlige (og forsvinne)
– skal registreres for å få poeng
• Våpen: Bomber og feller
• Dessuten
– Praktisk info blir sendt ut med meldinger
– Deltakernes posisjoner kan rapporteres (og hentes)
5
Spillkonsept: Postjakt
24. • Det skal være et felles arrangement for Java og
.NET-miljøene. Det er derfor viktig at oppgaven
kan løses med plattformuavhengig teknologi.
• Oppgaven skal være av teknisk art og involvere
kode
– CodeCamp
– Det er en bonus om vi også kan få med oss ikke-
kodende personer.
• Det bør være lett å komme igang, men det skal
også være en utfordring for deltakerne
• Liten tid til utvikling. Hjem lørdag etter lønsj.
24
Rammer
25. • Flere runder med semifinale, finale
• Midler for å hindre andre lag (EMP, virusbomb,
infisere poster)
• «Fargelegge» soner
• Holde posisjoner for mer score
• Posisjoner kan fakes
• Unngå samtidighetsproblemer
• Keep it simple
25
Konseptarbeid
42. • Score
• Poster
– Koordinat
– Har registrert
– Poengverdi (ev. hentet poeng)
• Ranking
– Plassering
– Poeng til neste foran og bak
• Våpenbeholdning
43
Gamestate for et lag
43. • Deltakere bruker to HTTP Headere
– LagKode
– DeltakerKode
• Scoreboard bruker en egen HTTP Header
– ScoreboardSecret
• Implementert med ActionFilter
44
Sikkerhet
44. • Crazy Looping
• Tid siden siste request per bruker, url og Get/Post
• 400 Bad Request
• ActionFilter
45
Throttling
45. • To lag skal ikke kunne få «top score» på samme
post
46
Samtidighet
46. • Holder siste posisjoner for lag i minne
• Lagrer bare til DB for logging – hvis forflytning er
stor nok
• Leser fra DB etter oppstart
• «Streamprosessering» / Live aggregering
47
PosisjonService
61. • Alle data henger på match
• Hver tests data er isolert per match
• Bare unngå gjenbruk av poster, lag og deltakere
• Nyttig konsept i flere domener
62
Uten transaksjoner…
68. • Fancy postregistrering (QR/Beacons)
• Flere effekter
– Koalisjonsspesifikke
– Roller på laget
– Midlertidige effekter
• Achievements
• Balansering av poeng og effekter
• Enklere lag-/spilloppsett og regi (admin)
• Augmented Reality
69
Muligheter - spill
69. • Async I/O
• Løfte testene til å gå over HTTP (en match per
test)
• Mer skalerbar arkitektur (for fun)
• .NET Core
• Notification i stedet for kontinuerlig polling
(SignalR/WebSockets/MQTT)
70
Muligheter - teknisk
70. • Introdusere køing
• Event Hub
• Web Jobs
• Service Fabric Actors
• Feeds som filer?
71
Azure Future
Hei, jeg heter Rune Rystad og jobber i Bouvet
Hvor mange her er det som spiller Pokemon Go?
Da vet i hvert fall dere hva et sanntids, utendørs dataspill kan gå ut på.
Det har blitt tradisjon i Bouvet at alle utviklerne reiser bort ei helg i året for å programmere og være sosiale. Det er også et konkurransekonsept (selvsagt).
Jeg skal fortelle om fjorårets opplegg – som var et spillkonsept.
Bruker en del tid på å vise og forklare konseptet, ellers er det vanskelig å forstå videre valg som er gjort
Før noen beskylder meg for å ta æren for hele arrangementet alene:
Amund Rønold Johnsen: Frontend ekspert
Kristian Løken Wille - Frontend
Sølve Heggem (Sandvika)
Mark West: Tilrettelegger
Rune Rystad: «overingeniør» – gjør «overengineering»
Pluss mye hjelp fra Magnus Green og Erik Sogge rundt praktiske elementer.
https://raw.githubusercontent.com/bouvet/BBR2015/master/replay/bbr2015.kml
Oscarsborg, 6. - 7. november 2015
Lag: 5 Java + 3 Microsoft á 4 personer
Code Camp
Konsept: Postjakt
Poster hadde ulik verdi og dukket opp underveis
For å få poeng, skulle lagene utvikle en klient mot et forhåndsdefinert spill-API hvor postene skulle registreres
Ellers: Ingen regler
Ny database
Oppsett i Google Spreadsheet
Poster i Google Maps
Postutsetting med telefon (Safari)
Påmelding av to spillere
Scoreboardet.
Elementer: Resultatliste, stilling Java vs Microsoft, MVP-liste
Kart: Poster (grønn = aktiv, rød = sprengt/midlertidig skjult, blå = ikke aktiv ennå). Prikker: Spillere med lagfarge
Meldinger: Hendelser i spillet (fritekst)
AngularJS som frontend-rammeverk
Bootstrap for layout
jQuery (du vet)
Leaflet for kartet
Deltakerne tok båt fra Oslo og fikk oppgaven utdelt på kaia
Postregistrering
Innsats
En løsning
En annen løsning
Lo-tech: CURL…
Gjenskapt posisjonslogg i Google Earth (midtveis)
Flere runder/heat: Men vi kan ikke gjenbruke poster (da melder folk det bare inn på nytt)
Dessuten vil vi bruke minst mulig tid til «overhead» med å starte på nytt.
Våpen var tidlig med i diskusjonen
«Fargelegge soner» krever polygoner + at en må stole på posisjoner. Dvs. vi kunne hatt en post per område, men vi tror det hadde blitt forvirrende.
Holde posisjoner for mer score: posisjoner kan fakes.
Dessuten ønsket vi å unngå en «event loop» som skulle gå på serveren og «
Notater fra 18. august kl 0859. Kom tidlig før møte og grublet gjennom et konsept.
Konseptnotater, datamodell, noen regler, dataflyt, sekvensdiagram
Notater fra 18. august kl 0859. Kom tidlig før møte og grublet gjennom et konsept.
Konseptnotater, datamodell, noen regler, dataflyt, sekvensdiagram
Notater fra 18. august kl 0859. Kom tidlig før møte og grublet gjennom et konsept.
Konseptnotater, datamodell, noen regler, dataflyt, sekvensdiagram
Modellen har et par feil ift. «append only»
PostIMatch skulle aldri hatt noen PoengIndex. Den kan en finne ut fra å telle postregistreringer.
Våpen manipulerer på SynligFra-tidspunkt. Det skaper også mulighet for samtidighetstull. Kunne vært modellert som egen PostSynlighet utenfor posten og som en må lese nyeste instans av for en post.
Dessuten ble det ikke nødvendig å gjenbruke poster mellom heat, så post kunne vært merget inn i PostIMatch. Det er nok best om de er private uansett.
Separere funksjonalitet så mye som mulig.
Meldinger er bare kommunikasjon internt i et lag: post melding og hent melding til ditt lag
Posisjoner er bare for å se hvor folk er
Game: Delt i to med registrering av poster, og uthenting av tilstand.
Separere funksjonalitet så mye som mulig.
Meldinger er bare kommunikasjon internt i et lag: post melding og hent melding til ditt lag
Posisjoner er bare for å se hvor folk er
Game: Delt i to med registrering av poster, og uthenting av tilstand.
Postman til API-arbeid
Brukte det også til ulike admin-funksjoner (se nede til venstre)
Jukser med lock
Arkitektur:
Innkommende køer for alle events: meldinger, posisjoner, postregistreringer
Dokumenter for gamestate scoreboardstate (samtidighetskontroll: hver match = consumer)
Posisjoner: Cache
Meldinger: Lettvektslagring (table storage, kommer an på mulighet for spørring)
Async I/O (ikke så vrient)
Testing over HTTP
Siden da ikke lenger kan simulere tid, må en ha mulighet for å skru ned intervaller
Hver test må isoleres –> 1 test = 1 match
Dvs at meldinger og posisjoner bør være match-spesifikke, men det burde de nok vært uansett
Før vi starter: Hvem var med på Oscarsborg og/eller har lest innlegget om BBR på utbrudd-bloggen vår?