Vertica Dev Xmas 2019-julekalender – låge #2

Så er det tid til at åbne låge nummer 2 i årets Vertica julekalender. Har du endnu ikke været forbi låge nummer 1, skal du lige skynde dig forbi, så du også er up-to-speed med konkurrencereglerne. Du kan stadig nå at være med! 

Har du løst opgaven i låge 1, hvor du skulle sende en elektronisk ansøgning som Search-ekspert til CSAR (Cloud Search And Rescue)’s API, så har du modtaget et retursvar fra API’et, svarende til:

{
   "id": "<<unikt id>>"
   "credentials": {
      "username": "<<username>>>",
      "password": "<<password>>"
   }
}

Gemt bag ovenstående svar er bl.a et unikt ID, og bag dette gemmer der sig en række spor, som skal bruges til at identificere den nøjagtige position på julemanden. Det viser sig nemlig at julemanden er blevet væk! Heldigvis er julemandens kane udstyret med en GPS-sender, som vi har opsnappet positionen på. Derudover er julemanden udstyret med et tracking-device, som det er lykkedes vores hacker-afdeling at opsnappe alle julemandens bevægelser fra.

Opgave – låge 2

Din opgave er nu at lokalisere julemandens nøjagtige position, baseret på dit unikke ID og med førnævnte data (kanens position og julemandens bevægelser). Dataen ligger som struktureret JSON i et dokument i et Elasticsearch index. Dokumentets ID matcher dit unikke ID.

Du skal derfor:

  • Tilgå dokumentet i Elasticsearch, baseret på følgende information:
    • CloudId:
      • xmas2019:ZXUtY2VudHJhbC0xLmF3cy5jbG91ZC5lcy5pbyRlZWJjNmYyNzcxM2Q0NTE5OTcwZDc1Yzg2MDUwZTM2MyQyNDFmMzQ3OWNkNzg0ZTUyOTRkODk5OTViMjg0MjAyYg==
    • BasicAuthentication (username / password):
      • Du skal overføre værdierne repræsenteret i credentials fra API’ets retursvar:
        • credentials.username
          credentials.password
    • Index:
      • santa-trackings
    • Document ID / doc id:
      • <<unikt id>>
    • TIP: Få hjælp til Elasticsearch i dette indlæg
    • Med dokumentet i hånden, har du nu følgende struktureret information:
      • Kanens nuværende position: længde- og breddegrad
      • Julemandens bevægelser: en sekvens af bevægelser (up, down, left, right), samt en enhed (foot/meter/kilometer) for hvert enkelt af disse bevægelser, f.eks.:
        • Up 100 meter
        • Right 2000 foot
        • Left 0,2 kilometer
        • Up 1300 foot
        • … osv.
  • Implementere en algoritme der kan udregne julemandens nuværende position:
    • Når du skal udregne julemandens position, skal du først og fremmest udregne X- og Y-aksen, dvs. du skal beregne hvor mange meter julemanden har flyttet sig fra kanen på de to akser. Når du har dét på plads, skal du anvende følgende formler til at beregne positionen:
      • Formel til udregning af ny længdegrad:
        • earth = 6378.137; // radius of the earth in kilometer
          m = 1 / (2 * pi / 360 * earth) / 1000;  // 1 meter in degree
          
          new_latitude = latitude + (your_meters * m);
          • Hvor latitude er lig med nuværende længdegrad og your_meters er lig med antal metre længdegraden skal flyttes (Y-aksen)
      • Formel til udregning af ny breddegrad:
        • earth = 6378.137; // radius of the earth in kilometer
          m = 1 / (2 * Math.PI / 360 * earth) / 1000; // 1 meter in degree
          
          new_longitude = longitude + (your_meters * m) / cos(latitude * (pi / 180));
          • Hvor longitude er lig med nuværende breddegrad, latitude er lig med nuværende længdegrad og your_meters er lig med antal metre breddegraden skal flyttes (X-aksen)
      • Faktor mellem fod og meter
        • 1 fod = 0.304800610 meter
    • Eksempel:
      • Fra:
        • Længdegrad: 71.639566053691
        • Breddegrad: -51.1902823595313
      • Flyt:
        • 10000m til højre
        • 7500m ned
      • Resultat:
        • Længdegrad: 71.572192407382
        • Breddegrad: -50.9050972077072
        • distance-move-position
      • Ved hjælp af følgende udregning:
        • new_latititude(current_latitude, y_meters)
          • Dvs: new_latitude(71.639566053691, -7500)
        • new_longitude(current_longitude, x_meters, current_latitude)
          • Dvs: new_longitude(-51.1902823595313, 10000, 71.639566053691)
    • Bemærk: CSAR (Cloud Search And Rescue)’s API anvender førnævnte relative simple formler til udregning af positioner. Og der er ingen afrunding af decimaler.
      • Hvis man synes det er spændende, kan man med fordel dykke ned i mere avancerede (og mere korrekte) regnemodeller, ved bl.a. at tjekke følgende link ud:
      • https://www.movable-type.co.uk/scripts/latlong.html
        • … men i denne julekonkurrence skal man altså bruge de simple formler, ellers “regner man forkert” 🙂
    • Bonus: Der er beskrevet lidt mere omkring API’ets egen udregning i denne blogpost samt denne blogpost
  • Sende en HTTP forespørgsel til CSAR’s API med resultatet af din algoritme:
    • Host:
    • Path:
      • /api/santarescue
    • Http method (verb):
      • POST
    • Content-Type:
      • application/json
    • Body:
      • {
           "id": id,
           "position": {
              "lat": <<new_latitude>>,
              "lon": <<new_longitude>>
           }
        }
  • Kontrollere at CSAR’s API svarer følgende tilbage:
    • HTTP status code:
      • 200 OK
    • Body:
      • {
            "zones": [
                {
                    "reindeer": "<<name>>",
                    "countryCode": "<<countryCode>>",
                    "cityName": "<<cityName>>",
                    "center": {
                        "lat": <<latitude>>,
                        "lon": <<longitude>>
                    },
                    "radius": {
                        "unit": <<unit(kilometer|meter|foot)>>,
                        "value": <<value>>
                    }
                },
        ...
            ],
            "token": "<<token>>"
        }
  • Når du har fået ovenstående svar retur er du i mål med dagens opgave (i næste låge, mandag d. 9. december, afslører vi hvad du skal bruge svaret til, for at komme videre i konkurrencen) 
    • Får du et andet svar, f.eks. Http status code: 400 Bad Request, har du en fejl i din forespørgsel eller udregning. Kig efter valideringsbeskeder i requestet og gå din JSON igennem en ekstra gang.
      • Bemærk: du skal starte forfra, hvis du får en valideringsfejl, dvs. du skal kalde /api/participate endpointet forfra, da julemanden jo hele tiden flytter sig 🙂

Mangler du hjælp?

Hvis du mangler hjælp til låge 2, så fortvivl ej – det finder du lige her.

Næste låge

Mandag d. 9. december kl. 8:30, vil vi annoncere næste opgave i julekalenderen og samtidig trække en tilfældig vinder blandt alle deltagere af låge 2.

Inspiration til Google søgeord for tips & tricks til at løse opgaven:

  • elastic nest client
  • elastic nest get document by id
  • elastic node client
  • elastic on request completed

Vinder låge 1

Vi har trukket én tilfældig vinder, blandt alle der har deltaget i låge 1. Vinderen er netop blevet kontaktet pr. e-mail, og når vi har fået svar fra vedkommende, bliver navnet annonceret. Hvis vi ikke får svar inden konkurrencen er slut, trækker vi selvfølgelig en ny vinder*.

Vinderen får biografbilletter, som vi sender med posten, når konkurrencen er slut.

*) Der er nemlig allerede sneget sig et par “falske” tilmeldinger ind – medmindre man selvfølgelig går under navnet “Hest” eller “test” 🙂