5 de diciembre de 2010

Solución reto HackPlayers: La nave perdida

No hace mucho que sigo el blog HackPlayers y realmente me parece muy interesante tanto por los artículos que publican como por los retos de seguridad que proponen para su resolución. Me resultaron muy curiosos y educativos por lo que aprovechando que hace poco publicaron uno nuevo, me decidi a participar...

Podemos ver la información en este enlace y el mapa aqui. Además, en Twitter también podíamos seguir el reto. Empiezo...


Lo primero de todo localizar el código donde se define la animación. En este caso se trata de un script Javascript que intuiblemente podemos pensar en alguna API de Google.


Ya detendiéndome en el código y en las distintas clases que se utilizan, observo que primero se describe el mapa, el tamaño, el icono, la coordenada de inicio.... Luego se define la polilínea que marca el trazado de la nave y por último la función animate que arranca la animación dependiendo de la distancia recorrida, esta se consigue con getLenght() y se muestra un alert() cuando la distancia es menor o igual a 100 metros.

De todo ello, obtengo que las coordenadas se codifican a través de la clase GPolyline.fromEncoded() donde se definen en la variable points:

points: "osrkKntgd]fmxaQ_nszCmsrkKohwu\\txduD_nszCwyluEj`saI",

Sigo buscando información sobre las polilíneas y encuentro una Web donde se detallan las variables utilizadas.


De donde también obtengo que los puntos se codifican con la herramienta Interactive Polyline Encoder Utility, por lo que busco información sobre la misma y hago una prueba, fallida :(, para obtener las coordenadas...


Sigo revisando los resultados y encuentro otra Web interesante con información relativa a dicha clase y al algoritmo con que se codifican las coordenadas. Ahí encuentro un enlace a la documentación de Google sobre el algoritmo en la que obtengo la pista que me permite seguir adelante: Las barras invertidas (\) son caracteres de escape que deben ser duplicadas en los resultados en los que aparece...


Con esta nueva información me vuelvo a dirigir a la herramienta de Google, quitando una de las barras invertidas, y obtengo las coordenadas por las que pasa la nave....


Encuentro también otra Web interesante con documentación sobre las polilíneas para Google Maps, ejemplos de usos y otro decodificador en el que no es necesario quitar el caracter de escape


He de reconocer que me ofusqué y no veía más alla del mapa hasta que Vicente me aclaro la situación... Las coordenadas son unas sucesiones matemáticas con las que encontramos las coordenadas que nos faltan.... Estas son:

64.9812,-158.1500
-29.8486,-132.6500
35.1326,23.1224
5.2840,48.6224
40.4166,-4.2367

Y si separamos latitud y longitud obtenemos:

64.9812, -29.8486, 35.1326, 5.2840, 40.4166, X
-158.1500, -132.6500, 23.1224, 48.6224, -4.2367, Y

Para la latitud veo que las coordenadas coinciden con la suma de las dos anteriores, por lo que:

64.9812 + (-29.8486) = 35.1326
-29.8486 + 35.1326 = 5.2840
35.1326 + 5.2840 = 40.4166
5.2840 + 40.4166 = X = 45.7006

La coordenada para la longitud ya es otra cosa, inicialmente intenté con la misma relación pero no me llevaba a ningún sitio... Sigo haciendo pruebas y descubro que las coordenadas en parejas tienen una diferencia de 25,5 puntos. Desarrollandolo sería:

158.1500 – 132.65 = 25.5
48.6224 – 23.1224 = 25.5 (He cambiado el orden para evitar el negativo)
4.2367 – Y = 25.5

Despejo Y de la ecuación anterior de la siguiente manera:

- Y = 25.5 – 4.2367
Y = -25.5 + 4.2367 = -21,2633

Las coordenadas obtenidas son 45.7006,-21.2633 y la busco para comprobar que hay en ella


Y dándole al zoom


Hay algo que no cuadra... Debería haber por lo menos algo, pero el mar???? De nuevo, Vicente me aclara... La longitud no es negativa. Entonces, las coordenadas quedarían 45.7006,21.2633


La explicación:
Los pares de coordenadas deben tener una diferencia de (+ = positiva) 25,5 puntos por lo que:

Y – 4.2367 = 25,5
Y = 25,5 – 4,2367 = 21,2633

Siendo la coordenada correcta... ;-)

El reto me ha resultado muy entretenido y educativo dado que no conocía esta API ni los usos que se pueden dar a ella... Quiero dar las gracias a Vicente por la ayuda y las pistas dadas porque sino nunca habría podido resolver el reto, me ofusque en buscar la coordenada en el mapa y no ví más alla... ;-)

Un saludo, Brixton Cat.