Status og information omkring låge #2 i Vertica Dev Xmas 2019-julekalender

Først og fremmest er det rigtig fedt at se der er mange der har tid, lyst og overskud til at deltage i vores lille julekalender/-konkurrence her på bloggen. Mange tak for det!

I går blev låge #2 annonceret. Missionen er at finde julemanden, som er blevet væk.

Desværre er der sneget sig en lille fejl ind i Cloud Search And Rescue (CSAR)’s API, når der skal sammenlignes positioner. Det viser sig nemlig at…

public bool Equals(GeoPoint other)
{
   if (ReferenceEquals(null, other)) return false;
   if (ReferenceEquals(this, other)) return true;

   return Lat.Equals(other.Lat) && Lon.Equals(other.Lon);
}

… ikke virker, når der sammenlignes med meget små decimaltal. Det beklager udvikleren (undertegnede) selvfølgelig, og fejlen er rettet og API’et er opdateret.

Den rigtige implementering, i vores kontekst, er:

public bool Equals(GeoPoint other)
{
   if (ReferenceEquals(null, other)) return false;
   if (ReferenceEquals(this, other)) return true;

   return 
      Math.Abs(Lat - other.Lat) < 0.0000000000001 &&
      Math.Abs(Lon - other.Lon) < 0.0000000000001;
}

Dét kan man også læse lidt mere om her: https://docs.microsoft.com/en-us/dotnet/api/system.math.abs?view=netframework-4.8 

Lige så vigtigt er det at pointere at API’et anvender .NET’s Double -datatype i samtlige beregninger – uden afrundinger. Du kan læse mere om Double her hos MSDN.

Af de, i skrivende stund, 92 deltagere i konkurrencen, er det dog kun to af jer, der er løbet ind problemet. I er begge kontaktet pr. e-mail.

Af nedenstående graf kan man se at der har været 164 fejlede forsøg på at finde julemanden – og samtidig at det kun er i 2 forsøg lykkedes at finde julemanden.

kibana-laage2

Et lille tip til udregning af julemandens koordinater (husk at tjekke formlerne i låge 2):

x_meters += calculate_movements(santa_movements, "right")
x_meters -= calculate_movements(santa_movements, "left")
y_meters += calculate_movements(santa_movements, "up")
y_meters -= calculate_movements(santa_movements, "down")

santa_latitude = new_latitude(cane_latitude, y_meters)
santa_longitude = new_longitude(cane_longitude, x_meters, cane_latitude)