Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

jueves, 28 de mayo de 2015

Unas piezas de Lego tocan la guitarra mejor que tú

Parece ser que Skynet está a la vuelta de la esquina. A las pruebas me remito:


Aún nos queda la esperanza de que sea fake.

Ya de paso os dejo esta otra marcianada hecha por el hijo del dueño de la fábrica de los lego, espero. Atención a la parte del básket.


lunes, 20 de abril de 2015

sERVER sENT eVENTS

Hola sukarrats... Hace unos días intenté poner la versión web de whatsapp en el iPad y me he encontrado lo siguiente:


Curioso porque el navegador que estaba utilizando era Chrome... He buscado información y me he encontrado con la siguiente noticia de Gizmondo http://es.gizmodo.com/exclusiva-por-que-whatsapp-web-no-esta-en-ios-ni-lo-e-1680954309# donde los ingenieros de iOS en San Francisco responden al problema:

Las APIs de multitarea en iOS sólo nos permiten hacer ciertas funciones concretas cuando una aplicación se encuentra en el background. Para lo que trata de hacer WhatsApp, una aplicación de iOS tendría que ser capaz de mantener una conexión abierta a un servidor, o bien aceptar conexiones entrantes desde el navegador, sin importar que el usuario haya puesto la aplicación en segundo plano.

Ante esto, me pregunto, y qué hay de los Server Side Events de JavaScript, compatibles con el navegador Safari de iOS? http://caniuse.com/#feat=eventsource ... A mi esto me suena a una excusa barata.

Los Server Side Events permiten a una web html5 recibir eventos desde un servidor. Con esto conseguimos que la web que estamos viendo en el navegador pueda interactuar con el servidor y responder dinámicamente a cambios en el servidor sin la interacción del usuario (vamos, sin darle al botón de recargar la página).

En un caso práctico, imaginando una web de noticias, permitiría que nuestra página web nos indicara cuando hay una noticia nueva. Y aplicándolo al desarrollo de aplicaciones híbridas o webapps, implimentar una notificación de aviso.

En cuanto al código, no resulta muy compleja la implementación, veamos:

En el servidor, en nuestro caso PHP, podemos tener un fichero llamado servidor.php con el siguiente código:

header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");

donde hemos dicho que no use el caché y que el tipo de contenido es event-stream.

Luego hacemos un echo de la información que queremos enviar al cliente, precedido por data:

echo "data: Tienes un mensaje nuevo";

finalmente hacemos un flush(); para enviar la información al cliente.


En la parte cliente, usamos JavaScript para implementar el evento que escuche al servidor:

if(typeof(EventSource)!=="undefined" && typeof(source)==="undefined") {
  var source = new EventSource("servidor.php");
  source.onmessage = function(event) {
    // nuestro código donde recuperamos la información enviada por el servidor en event.data
  ...
  };
}

El primer if comprueba si nuestro navegador soporta Server Sent Event.

En un próximo artículo os explicaré como utilizo esta artimaña para implementar avisos en la app que estoy desarrollando. Más información en la página de w3schools, una web muy útil para iniciarse en la programación.

domingo, 18 de mayo de 2014

Concurso de Robots

Ayer pude asistir en familia a uno de los eventos de la sexta temporada de la Liga Nacional de Robótica, en el CosmoCaixa. Había dos tipos de competiciones, la de sumo (de naranja), y la de velocidad. Y en el primer caso, había un premio para aficionados y uno para profesionales. Lo que más me gustó fue poder estar en la sala donde los diseñadores ponían a punto su robot, pues podías preguntar todas las curiosidades que tuvieras (tipo de sensores y su situación, cantidad y potencia de los motores, procesador, tipo de ruedas, ...), y éstos te explicaban con mucho entusiasmo, aunque se guardaban algunos detalles (secreto de sumario, supongo). Después de la competición se realizaron talleres para construir un robot propio, pero ya estaban todas las plazas llenas (cachis!!!). Como curiosidad, los robots no profesionales estaban todos basados en la tecnología Arduino. Actividad muy recomendable para los más pequeños. Bueno, os dejo unos vídeos del evento. Mi móvil es el que es y se ven así, sin zoom ni nada, pero es lo que hay. Disfrutad.

En este primer vídeo la competición de sumo para aficionados (son coches suicida). Atentos al detalle "Galáctica":



Comparad la diferencia con los profesionales:



Y finalmente uno de velocidad. Esta prueba consistía en poner dos coches en dos puntos de un circuito. El que primero alcance al otro gana. Os he puesto el vídeo de la prueba que más duró, aproximadamente 3 minutos. Justamente éste es el tiempo que duran las baterías, con lo que unos segundos más y los coches se hubieran parado. Parecen coches de un Scalextric sobre unos raíles, pero en realidad simplemente están siguiendo la línea negra del suelo:


martes, 26 de noviembre de 2013

Librería 3D Web three.js

Me he topado con esta librería para crear y gestionar elementos 3D en el navegador. Se programa con javascript y solo necesitas un navegador actualizado para ver el resultado.

Aquí os dejo una prueba que he hecho intentando no complicarme mucho. Al mover el ratón el objeto rota en la misma dirección y al hacer click se eliminan algúnos cubos aleatoriamente. Cuando elimines todos vuelve a llenarse.

Testingtons

Se puede escoger la complejidad del objeto, sería un buen test para ver cuantos cubos puede gestionar vuestro PC. Aquí con un Celerón 1,73GHz y 1GB de RAM empieza a dar saltos si pongo 8 (512 cubos).

El código está ahí mismo en el html (Ver código fuente), solo tenéis que descargar el archivo al escritorio, editar lo que sea y dar doble clic para ver cómo cambia. Con un poco más de seriedad se podría convertir por ejemplo en un cubo de rubik de tamaño N.

En la web oficial muestran que se puede sacar mucho partido y crear juegos o entornos interactivos impresionantes.

lunes, 7 de octubre de 2013

Javacup 2013

Vayan preparando las vuvuzelas que la JavaCup 2013 ya está aquí!


El objetivo de este primer año como entrenador debería ser pasar de la liguilla, pero como dicen los intelectuales (millonarios) que viven de esto y salen por la tv: 'fútbol es fútbol', 'juegan 11 contra 11' y 'no hay rival pequeño', así que a ver qué tal se nos da.

El plazo de inscripción termina el miércoles. Atentos que esto empieza ya!

sábado, 25 de mayo de 2013

Deberían Trabajar Para Ti: el código

Para los curiosos, he subido a GitHub el código de la web que he montado para que presente los datos de las diferentes consultas y agregaciones. Por ahora sólo muestra los rankings de ausencias y presencias y algunos datos agregados de las diferentes votaciones parlamentarias. Iré añadiendo algunos más poco a poco.

Como comentaba en mi anterior post, los datos han sido cogidos de la web del congreso (por ejemplo, sesión plenaria #108) y ligeramente adecuados para mejorar el posterior acceso a los mismos. El script es tan tonto que no creo que valga la pena ni comentarlo. Sólo hay que tener en cuenta que los xml se encuentran en urls del tipo

http://www.congreso.es/votaciones/OpenData?sesion=XXXX&completa=1&legislatura=10

y que hay sesiones sin datos!

El website corre sobre Silex, un micro-framework PHP basado en Symfony y utiliza una base de datos NoSQL (MongoDB) para la persistencia y explotación de la información.

Estoy preparando el site público en http://dtpt.eu01.aws.af.cm/. Cuando lo tenga funcionando 100%, ya avisaré.

jueves, 16 de mayo de 2013

Programando para Android - 4. La chispa

Ya que el protipo empieza a funcionar le he buscado alguna vuelta de tuerca para que no sea un plataformas tradicional, para que tenga una jugabilidad especial. De momento he hecho que el jugador pueda controlar la dirección de la gravedad con unos nuevos botones:


El primero rota 45º y el segundo -45º. Además si arrastras de un botón de rotación hacia el otro  rotas de golpe 180º.


La idea es diseñar los niveles de manera que solo se puedan superar usando adecuadamente los cambios de gravedad. Para limitar este superpoder habrá un número limitado de cambios disponibles que se pueden consultar en la parte inferior (G-Changes). Habrá que tomar decisiones de si vale la pena dar los 180 de golpe o ir por pasos, si hay que rotar en el aire, dar dos cambios seguidos de 180º para hacer una especie de salto largo...

El efecto físico que muestra el personaje cuando se cambia la gravedad es muy convincente y es bastante cómodo de controlar. Claro que al principio cuesta acostumbrarse a apretar izquierda para ir a la derecha cuando está boca abajo, pero ahí está parte de la gracia.

El problema ahora es que ha dejado de tener sentido diseñar las pantallas a base de bloques gordos. En la imagen de arriba se ve el personaje intentando andar en diagonal y el suelo le queda como un diente de sierra y no puede andar bien. Lo próximo tendrá que ser cambiar la creación del escenario y la gestión de las colisiones con el suelo y paredes para introducir unos mapas de este estilo suavizado:

Por tanto con este cambio deja de tener importancia el debate sobre si usar txt o png para guardar los mapas. Pero con suerte empezaremos otro: cómo debería almacenar la información para unos mapas redondeados como estos? Inicialmente voy a apostar por png optimizado. Este mapa concretamente tiene una resolución de 1000 por 700 px y ocupa unos 3kbytes. Otras opción podría ser usar algún formato vectorial, guardar líneas bezier con información de los vértices y curvaturas. Podría ser quizás el formato svg aunque he probado guardarlo y comprimir en zip y ocupa 1,7KB, que tampoco es tanto ahorro para los problemas que traería. Se aceptan sugerencias.

miércoles, 17 de abril de 2013

Programando para android - 1. Inicio

Voy a iniciar otra serie (incluso sin haber acabado la del pedal, qué nivel) para poner en marcha un pequeño juego para android. La motivación es practicar un poco el java que lo tengo peor que oxidado. El hecho de ponerlo aquí en el blog me sirve para no dejarlo abandonado a la primera de cambio y para que os apuntéis los que estéis interesados en trastear un poco todo este tinglado.

He decidido usar una librería que parece interesante libgdx, sirve para facilitar un poco las cosas típicas de juegos como la gestión de los gráficos, la música, etc... y además se encarga de que el resultado sea compatible con pc, android, web y iphone. Para quien se apunte aquí está lo que hay que instalar previamente y aquí posteriormente.

Para iniciar el proyecto y preparar todos los archivos y dependencias viene un pequeño ejecutable (gdx-setup-ui.jar) que genera el esqueleto inicial:


Después voy a importarlos a Eclipse mediante Import => Existing project into workspace. Aquí ya podríamos empezar a picar pero si somos un poco elegantes preferiremos...

Ponerlo en sistema de control de versiones: He usado el subclipse para subirlo a code google goingnowhere. Ahí ya podéis ver el código inicial generado que es una especie de Hola mundo. Para verlo en funcionamiento hay que compilarlo en el Eclipse. Es muy útil lo de que se compile por igual en varias plataformas, no será necesario abrir un emulador de android ni conectar un dispositivo en modo debug porque simplemente podemos ejecutar la versión PC que es más directo y sabemos que luego funcionará también en las otras versiones.

Al ejecutar se muestra esto:

Una pantalla de inicio sencilla que muestra una imagen.

Si solo queréis probar (y colaborar) justo esta aplicación que he colgado los pasos se reducen y se simplifican:
  • Instalar el JDK de Java.
  • Instalar el ADT-Bundle de google (que lleva eclipse + un montón de cosas necesarias).
  • Añadir el plugin subeclipse al Eclipse en Help => Install new software y en Work with ponemos la dirección  http://subclipse.tigris.org/update_1.8.x e instalamos los paquetes que aparecerán.
  • Importar mi proyecto mediante File => Import =>SVN => y ponemos la url https://goingnowhere.googlecode.com/svn/trunk
Para probar si funciona hacéis botón derecho en la carpeta goingnowhere-desktop y vais a Run as => Java Aplication (y marcáis el Main si lo pregunta).

martes, 22 de mayo de 2012

Setters y getters, friend or foe?

Esto me lo he preguntado alguna vez y Kpacha al final me convencía, aunque ahora no recuerdo sus argumentos. ¿Por qué quiero programar así?:

private String nombre;
public void setNombre(String nombre) { this.nombre = nombre; }
public String getNombre() { return nombre; }


En lugar de hacer simplemente esto:

private String nombre;

y acceder directamente a las propiedades cuando haga falta...¿?
Hay buenos motivos para usar esas funciones get, set, como por ejemplo:

  • Encapsulación: Así nos protegemos frente a cambios de implementación. Por ejemplo si decidimos que hay que verificar algo antes de hacer el set solo habrá que hacerlo en ese método.
  • Es necesario para que sean compatibles con clases como serialize.
  • Al heredar puedes modificar el funcionamiento.

Peeeeeroooo...

Realmente el uso de getters y setters sigue sin ser una buena práctica, no sigue la filosofía de la programación con objetos. ¿Por qué?
Uno de los principios que engrandecen la OOP es la abstracción de los datos. Un objeto no debe mostrar cómo funciona internamente, de ese modo siempre se puede modificar ese comportamiento sin afectar a los que hacen uso de él. Por eso las propiedades han de ser privadas como norma general.
Usar getters y setters son un rodeo para, en realidad, hacer pública una propiedad. Si por ejemplo tenemos que cambiar el tipo que devuelve el getCantidad de int a long tendremos que recorrer todo el código donde se use ese método para arreglar la recepción del dato. Esos datos no tendrían que ir pululando por ahí de clase en clase, en vez de pedir el dato para hacer algo, habría que decirle a la clase que tiene la información que lo haga.

En resumen, hay que tener todos los getters y setters si tienes pensado usar serialize o similares. En caso contrario hay que reducir al mínimo posible este tipo de accesos porque exponen el funcionamiento interno de la clase y por tanto hacen el código más difícil de mantener. Para conseguirlo hay que planificar previamente la visión global del funcionamiento de las clases y su interacción, es decir hacer bien las cosas desde el principio. ¡Qué fácil es decirlo!

Voy a avisar a Kpacha para que se pase por aquí a poner los puntos sobres las íes.

martes, 15 de mayo de 2012

Un chiste para programadores

Hay que pensar el resultado que da esta expresión. Lo pillas?
Array(16).join( 'hero'-1) + "Batman";

Si lo explico ya pierde la (poca) gracia, hay que ejecutarlo, aquí tenéis los pasos:

Crear un archivo de texto con extensión .htm
Editarlo con Bloc de notas o similar.
Copia y pega este código:

script type="text/Javascript"
var data=Array(16).join( 'hero'-1) + "Batman";
alert(data );
/script

El Blogger no me deja poner los símbolos < y > en el código, añádelos para que quede como en esta imagen:



El código de más simplemente lo he puesto para que se muestre el valor de la expresión.
Guarda el archivo y ejecútalo haciendo doble clic.

Por si acaso: Nan significa Not a Number,  es una especie de error en la manipulación de los datos.

miércoles, 22 de febrero de 2012

Aprendiendo (o enseñando) a programar

Estos días estoy probando una web muy currada para aprender a programar desde cero. Se trata de Codecademy y de momento se centra en aprender Javascript pero se nota que tienen pensado ampliar la oferta enseñando Ruby, Python o incluso Trololo (es cierto, entrad al enlace).

Chorradas aparte las lecciones están muy bien, te explican algún concepto, te proponen un ejercicio y el programa comprueba si pones correctamente los códigos (deben ser una especie de pruebas unitarias como me explicó kpacha que hace él en su trabajo). A medida que haces más cursos se van desbloqueando "Logros" y lecciones nuevas. Se empieza de cero pero no se saltan los puntos más conflictivos. Salen cosas interesantes como la diferencia entre false, 0, null, void y undefined y su utilidad. También el uso del operador = = =, un poco de recursividad... y eso que he hecho pocas lecciones de momento:
Es una buena manera de autoaprender las bases de programación, quizás no os sirva directamente para vosotros (que seguramente ya sois bastante gurus de la programación) pero sí para recomendarlo a quien quiera empezar y que pueda seguir las explicaciones en inglés. Además hay la opción de crear nuevos cursos, aunque no lo voy a hacer mientras que no se puedan exportar para usar sin la web.

martes, 21 de febrero de 2012

Juego planetoides, ahora en serio

He completado los detalles que quedaban de la demo de Planetoides para conseguir algo jugable. En esta versión alpha 0.54b encontraréis grandes mejoras como:

  • El protagonista ahora es un personaje adorable con el que os identificaréis enseguida.
  • Hay una pantalla de título para darle un aire más profesional.
  • Ahora hay una meta, el objetivo es llegar al planeta blanco. Al conseguirlo simplemente el juego se reinicia. Podría poner un cronómetro para ver quién tarda menos. Hay un cronómetro para ver quién tarda menos.
  • He podido solucionar más o menos la posición de la cámara. Blender facilita ciertos automatismos como "Parent" y "Track to" para el movimiento de la cámara, pero en este caso en que a veces estamos cabeza abajo no funcionaban bien. Así que al final ha sido necesario Python y otro vector director . Así se desplaza con suavidad y se sitúa en una posición que permite ver los planetas cercanos.
Podéis descargar planetoides aquí. Se ejecuta igual que el anterior, mediante Blender 2.61 y pulsar P.

Por último para facilitaros el acceso he descubierto un plugin para reproducir archivos Blender directamente en el navegador. Así podríais usarlo directamente aquí abajo:


miércoles, 15 de febrero de 2012

Juego planetoides

He estado dándole vueltas al concepto de gravitación en Blender que os puse el otro día y he preparado una demo de juego basada en la gravedad entre planetas.

He anulado la gravedad “por defecto” de Blender (siempre hacia abajo, eje menos Z) y he aplicado fuerzas hacia el centro de los diferentes planetas. Así podremos recorrer pequeños planetas como el Principito y saltar entre ellos. Algo parecido al Mario Galaxy, si lo conocéis. 

De momento tengo los planetas fijos, no interactúan entre ellos, pero será interesante ponerlos en órbita y así será más difícil viajar de uno a otro. Aquí un vídeo:








Como podéis comprobar no tengo muy claro qué hacer con la cámara, que es un elemento más importante de lo que parece en los videojuegos. Podría estar fija desde una posición lejana, o fija pero apuntando hacia el personaje (lo que hace ahora), o moverse en un plano aparte del escenario situándose en la normal respecto al personaje... o las típicas vistas en primera o tercera persona... no lo sé. 

Algunas órdenes interesantes del API de Blender que he usado son:
dist = obj.getDistanceTo(planetatemp) para poder detectar el planeta más cercano y así apuntar la base del personaje hacia ahí.

vdirector=planetasuelo.position-obj.position #Obtener el vector director simplemente restando las coordenadas
vdirector.normalize() #Hacer que tenga módulo uno
obj.alignAxisToVect(-vdirector,2,1) #Alinear el personaje al contrario del vector director




Si queréis ejecutarlo hay que abrirlo con Blender 2.6, situar el cursor encima de la vista 3D y presionar P. Se controla con las teclas A,W,D y salta con el espacio. Se puede descargar aquí: Demo Juego Planetoides.