javisantana.com

cosas que pasan: MGS mobile

Me bajo metal gear acid mobile, la versión 3D para probarla en mi móvil y así saber si los shots que había visto hace ya meses eran verdad y el juego prometía tanto, lo paso al móvil y después de defraudarme miserablemente (por ahora, no me gustan los juegos por turnos) me dispongo a decompilarlo para ver un poco qué hacían.

ejecuto:
“””
C:\temp\metal_gear_acid_mobile_3d_n70\src>java -cp jode.jar;C:\WTK22\lib\cldcapi10.jar;C:\WTK22\lib\midpapi20.jar;C:\SonyEricsson\JavaME_SDK_CLDC\PC_Emulation\WTK2\lib\mobile3d.jar;C:\WTK22\lib\mmapi.jar jode.decompiler.Main –dest src meta l_gear_acid_mobile_3d_n70.jar
“””

y cual es mi sorpresa que no está ofuscado!. Ahí está, el código del juego completito, salvo métodos que están, parece ofuscados, todo el resto de cosas se pueden ver perfectamente. Ahi está, todo el código de 3D, su A* (ver AStarSearchpor ejemplo), la animación a la antigua usanza (quake2 style pero sin interpolar) de Snake (ver JSR184_LoadSnake).

Soy fan de decompilar juegos para móvil, es divertidísimo intentar saber qué están haciendo sin ver ni una sola variable (normalmente todo se llama ‘a’) o ver los formatos de fichero que usan o como cargan las imágenes. Por ahora lo que más he visto ha sido lo de empaquetar recursos y “xorear” parte de los datos, “swapear” el comienzo y fin del fichero (ves cosas como “GNP” de la cabecera de los png)… aunque luego tienes casos como gameloft del cual aún no he conseguido ver como lo hacen, es demasiado difícil de descifrar para un rato.

Si algo bueno tiene java (de lo poco) es que se puede decompilar y mirar dentro.

KML y la privacidad

Este post pretender ser dos cosas: primero un pequeño manual de como hacer un servidor de KML con python y cherrypy y segundo demostrar qué se puede hacer para recibir feedback indiscriminado usando lo anterior.

Conocimientos previos:
- cherrypy es un API que permite implementar una aplicación web en dos patadas
- KML es un formato usando principalmente por Google Earth que sirve como contenedor de información geográfica, puntos de interés, etc, etc

KML no deja de ser un xml (*sic*) en el cual cabe de todo puntos, líneas, elementos 3D, animaciones y lo que nos interesa, conexiones a un servidor para obtener datos enumrados anteriormente. De esta forma es posible indicarle en un enlace que vaya a un servidor a buscar datos. Hay un pequeño pero efectivo tutorial en la página del api de google earth.

Tomando ese ejemplo creamos el servidor con cherrypy:

import cherrypy

class Root:
def get_kml(self, latitude, longitude):
kml = (
‘<?xml version=”1.0” encoding=”UTF-8”?>\n’
\\n' '\\n' 'Random Placemark\\n' '\\n' '%f,%f\\n' '\\n' '\\n' '
) %(longitude, latitude)
return kml

def index(self, directory=”.”):
cherrypy.response.headers[“Content-Type”] = “application/vnd.google-earth.kml+xml”
return self.get_kml(-3.332565,42.600353);

index.exposed = True

if __name__ == ‘__main__’:
root = Root()
cherrypy.quickstart(root);

El tema web no me va, pero estaba interesado en saber como va este tema en python. Me da la impresión que aún está por detrás de Ruby. He estado mirando turbogears y la verdad me ha gustado.

En el tutorial ponen un ejemplo de KML que se conecta a un servidor, podríamos cambiar la sentencia Link por lo siguiente:

http://localhost:8080/

</link>

De esta forma al cargar ese fichero en google earth se conectaría al servidor y bajaría kml.

Ahora la segunda parte: qué pasa si ese kml es generado por una aplicación y el usuario lo carga en su google earth. Pongamos, por ejemplo, un software de guiado para maquinaria agrícola, en el cual después de haber trabajado se puede guardar ese trabajo a KML para poder verlo más tarde en el PC. Pongamos que ese software escribe algo así dentro del fichero kml:

http://servidor.com/?license\_no=1234&lat=-3.332565&lon=42.600353

</link>

Gracias al número de licencia conoces al usuario y con latitud y longitud conoces la localización de sus parcelas. Eso por no hablar que con unos pocos bytes se puede enviar _de todo_. Tiene su parte mala, pero también su parte buena, se le pueden dar bastantes usos.

Por cierto, y no digo que tenga algo que ver, ya he implementado el writer para kml de agroguía :):

partes de un negocio: El negociador

Mañana he quedado con una empresa Argentina que está interesada en agroguía. Veremos a ver por donde salimos :).

Python, generators y pipes

Para rematar el artículo del otro día sobre generators en python conviene leerse este otro sobre Pipelined Python que no deja de ser syntactic sugar (como diría alguno), pero queda la mar de c00l.

Partes de un negocio: cuando te caen piedras encima

Hoy me ha pasado una cosa muy curiosa. Hace cosa de unos meses le vendí un sistema de guiado a una persona, cercana a mi pueblo y que llevaba tiempo detrás de ello. Después de meses intentando que le rebajase el precio y tras repetirle mil veces que es precio único, accedió a comprarmelo al precio original. Se hizo una factura desglosando los conceptos y pasó al circuíto habitual (esto es, a pachas con hacienda)

Hoy me llama completamente fuera de si, insultándome y llamándome estafador ¿?. En cosa de dos minutos ha dijo todos los improperios que conocía y alguno más, tras lo cual colgó. En ese momento te preguntas, ¿realmente le habré estafado? porque lo mismo no me he dado cuenta y no le he enviado el sistema… pero es que fui yo con mis propias manos a instalarlo.

Lógicamente estaba fuera de sí, en persona parecía una persona amable, así que minutos después le llamé para intentar aclarar las cosas. En esa llamada ya me insultó menos :), aunque mantenía que le había estafado 40€, con pocos argumentos, la verdad. Suerte de facturas, mañana he quedado con él para enseñarle la factura, ver qué ha pasado y dar la cara, cosa que cada vez tengo que hacer más, para bien o para mal.

Obviamente, lo primero que espero mañana son unas disculpas, si no es así daré por finalizada la relación con esta persona y listo. Ahora pasa que por un individuo encolerado puede que el boca a boca que tanto nos ha ayudado hasta ahora deje de funcionar tan bien como lo ha hecho. No me preocupa mucho, pero molesta que a pesar de esforzarte en hacer las cosas lo mejor posible haya gente que lo pague con malos modos y amenazas.

Cada día tengo más claro que la mayoría de las veces, ante situaciones de este tipo lo mejor es dar la callada por respuesta y mantenerse firme, sobretodo cuando se sabe con cierto grado de seguridad que se tiene la razón. Es muy común la creencia de que “montando el pollo” puedes solcionar algo que no puedes usando argumentos… como dice un refrán que yo me sé: “ante el vicio de pedir … la virtud de no dar” (como me gusta el refranero)