Google AI Challenge 2011!

Ya está aqui!

Para este año me he propuesto sacar algo de tiempo y mejorar el ranking del año pasado, a ver si aguanto esa vez entre los 100 primeros y no bajo en las ultimas horas del concurso como el año pasado :)

La temática, Hormigas!
Las reglas, Simples!

Un unico ciclo para elegir cual será el siguiente movimiento de todas las hormigas de tu enjambre.
Solo una opción, desplazamiento de 1 casilla al Norte, Sur, Este , Oeste.

  1. Si se encuentran con comida, al más puro estilo mitosis, el resultado será dos hormigas.
  2. Si se encuentra con agua, no podrá avanzar.
  3. Si se encuentra con una hormiga enemiga habrá lucha 1 a 1 con neutralización para ambas.

La gracia estará pues en el enjambre que mejor administre el territorio para alimentarse y duplicar hormigas (la comida aparece random en el grid)
y la disposición de las hormigas para la lucha, ya que han tenido a bien de complicar la lógica de las batallas en base a la disposición de las hormigas en la grid.

Así que la diversión está servida:

Más info: http://aichallengebeta.hypertriangle.com/
(Pd aún está en beta, pero ya podemos empezar a trastear con las IA’s de pruebas)

Publicado en Inteligencia Artificial, PHP | Deja un comentario

Averigua como moriras con Estas Muerto! Aplicación Android & Iphone

Recientemente hemos publicado la aplicación oficial de la ya famosa página aragonesa http://estasmuerto.com, ahora con versión en Ingles http://howiwildie.com

La aplicación sale en versión FULL y LITE tanto en Ingles como Castellano para dispositivos Android e IPhone.

Se puede realizar un test corto y uno rápido. Los dos modos del test devolverán la esquela con el día y hora exacta de la muerte y una descripción del modo.

En la versión larga, podremos escuchar el audio narrando la historia.

Para finalizar podremos compartir la tragedia en las redes sociales :)

IPHONE
Version Full
Version LITE
ANDROID
Version Full
Version LITE
Publicado en Android, Iphone | Etiquetado , , | Deja un comentario

WhatsApp, ¿Crees que tu información está segura?

Si alguien me dice XMPP, a mi cabeza vienen en orden 3 nombres: jabber, Gtalk y WhatsApp. Y es que no podemos negar que Whatsapp se ha convertido en una aplicación de comunicación líder presente en casi todos los terminales móviles.
Pero, ser grande y famoso no significa hacer las cosas bien.

Hoy le voy a dar un buen repaso a Whatsapp y como NO hacer las cosas.

Todo comenzó cuando me dí cuenta la cantidad de batería que consumía Whatsapp en un symbian, haciendo que la batería de un sony ericsson vivaz pasase de los 4 días de autonomía a menos de 14horas. (INCREÍBLE)

Así que me puse a hacer un poco de debug a la aplicación con la idea de crear una nueva para symbian centrando el esfuerzo en minimizar el impacto que causa el canal abierto, sobre la batería.

Y atención! Whatsapp no cifra la comunicación ¿o_O?, ¿como es posible a estas alturas que alguien piense en hacer un programa de comunicación y no le ponga algún tipo de cifrado?

Bueno, pero la cosa va mucho más lejos. Whatsapp guarda en dos archivos sqLite (lo normal) las conversaciones mantenidas, y como no, NO ESTÁN CIFRADAS.
Y mejor aún, si borras el histórico de chats de la aplicación, los datos no se borran de la memoria, ahí seguirán por siempre jamás :) Lo curioso es que incluso guarda la geo-localización si los datos del GPS están disponibles en el momento de la transacción.

Y aún hay más, whatsapp por defecto guarda logs de la ejecución del programa com.whatsapp/files/Logs, y el nivel de debug en terminales android es para llorar. Lo guarda todo! Creo que alguien se olvidó de bajar en nivel de debug antes de compilar, si no, esto no se entiende.

En definitiva, otro ejemplo más:

  • a) Se el más nombrado en algo no significa ser el mejor o hacerlo bien.
  • b) Las prisas por publicar aplicaciones son siempre un enemigo.

En fin, a fin de cuentas, en todos los lugares se cuecen habas ;)

Pd: Si tenéis curiosidad, con cualquier programa que cargue sqLite, os animo a echar un ojo a vuestros terminales y la información que almacenan.

Publicado en Android, Iphone | Etiquetado , | Deja un comentario

Threads en Android, Mostrar ProgressDialog durante GET Request

Esto es lo que me han preguntado hoy…
Parece una tontería, pero quizás si todavía no se entiende como se procesan las aplicaciones en Android, puede ser lioso cuando se está programando.

En el ciclo de vida de las aplicaciones Android, como en todas las aplicaciones con un modelo vista controlador, se ejecuta la lógica y luego se pinta la vista.
Por ende a casi todos nos ha pasado alguna vez la siguiente situación:
Cargamos la vista y solicitamos algún dato externo por ejemplo, la cotización de alguna acción en bolsa. Mientras se ejecuta la conexión y recibimos el valor, la aplicación queda pausada sin llegar a pintar la vista ya que todavía se está ejecutando la lógica. Y una vez termina ese proceso, pinta la vista.

Esto obviamente, no es muy estético ni practico, es mucho mejor cargar la vista y mostrar un popup de Loading, o algún mensaje que alerte del motivo de la espera al usuario.
Así pues, vamos a ver de un vistazo rápido, como ejecutar la consulta en background mostrando mientras un ProgressDialog con un mensaje.

public class testRapido extends Activity {
	ProgressDialog dialog;
	String resultado;
	public void onCreate(Bundle savedInstanceState) {
                dialog = ProgressDialog.show(testRapido.this, "", "Loading...", true);
                Thread thread = new Thread(){
			@Override
			public void run() {
				String urlBase = "http://www.ejemplourl.com";
				if (getData(urlBase)) {
					Intent intent = new Intent(testRapido.this, visorRespuesta.class);
					intent.putExtra("respuesta", resultado);
					startActivity(intent);
					finish();
				} else {
					Toast tx;
					tx = Toast.makeText(getApplicationContext(), "No se ha podido conectar", Toast.LENGTH_LONG);
					tx.show();
				}
				dialog.dismiss();
		     }
	     };
	     thread.start();
	}

	public boolean getData(String url) {
		try {
			HttpClient client = new DefaultHttpClient();
			String getURL = url;
			HttpGet get = new HttpGet(getURL);
			HttpResponse responseGet = client.execute(get);
			HttpEntity resEntityGet = responseGet.getEntity();
			if (resEntityGet != null) {
				resultado = EntityUtils.toString(resEntityGet);
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			Log.i("ERROR", "CONECTION PROBLEM");
			return false;
		}
	}
}

En el ejemplo anterior se define un ProgressDialog de acceso publico y se muestra el mensaje de Loading.
Posteriormente, se crea un Thread con la lógica para la petición Web, si el resultado es correcto, enviará la aplicación a la nueva vista de resultados, y de lo contrario mostrará un mensaje de alerta con el mensaje de error de conexión.
Lo importante a tener en cuenta es que el dialog.dismiss(); debe hacerse en el paso final dentro del Thread, si lo pusiésemos fuera, a continuación del thread.start(); Al pintar la vista, se mostraría y ocultaría instantáneamente.

Por lo demás, no tiene ningún misterio.
Quizás para las personas que nunca han desarrollado arquitecturas de un solo ciclo de vida, es un poco tedioso al principio, pero no tiene mucho misterio.
Solo hay que pensar en esto. Primero hará los “cálculos” y luego mostrará el resultado, al igual que si programásemos para una web.
Cualquier lógica posterior, vendrá ejecutada por algún evento definido. Para todo hazte costurero y usa los hilos :)

Saludos

Publicado en Android | Etiquetado , | 7 comentarios

Appcelerator, como Localizar la aplicación para varios idiomas

Appacelerator acelera sin duda el desarrollo de aplicaciones si se requiere sacar una aplicación compatible /Android/Iphone/Ipad/Blackberry.

Pero una vez comenzamos a trabajar con el, podemos ver que no es todo de color de Rosa. Aunque el proyecto es una gran idea, y le están dando buen movimiento, yo prefiero seguir con el desarrollo nativo, no obstante destaco su potencia y fácil desarrollo.

Dicho esto, si desarrollamos una aplicación con Appcelerator y llegamos al punto de localizarlo para ponerlo en varios idiomas, encontraremos una falta de documentación interesante. Pero como todo, se puede hacer.

Voy a explicar la estructura y los métodos más comunes:

Lo primero estructura de directorios.

/Carpeta Aplicación
  |-/Resources
  |-/build

Creamos una carpeta nueva llamada i18n, y dentro de esta carpeta, dos subcarpetas más una de nombre en y otra de nombre es. Obviamente, indican English y Español.
Con esto le decimos al compilador, que hay localización y tenga en cuenta los archivos de dentro de esas subcarpetas.

Ahora creamos dos xml dentro de cada carpeta, uno app.xml y otro strings.xml, deberá quedar así:

/Carpeta Aplicación
  |-/Resources
  |-/build
  |-/i18n
        |-/en
             |-app.xml // Locale para Aplicación
             |-strings.xml // Resource de strings traducidas.
        |-/es
             |-app.xml // Locale para Aplicación
             |-strings.xml // Resource de strings traducidas.

El contenido de app.xml en English de un ejemplo sería:



	Hello World

y el strings.xml en Español que usaré en el ejemplo:



	Hola! La localización funciona correctamente

Una vez dentro del código de la aplicación, cuando queramos cargar una string, solo debemos usar Titaniun.Locale o su alias L
por ejemplo

var comentario= L('mensaje');
alert(comentario);

Esta es la forma correcta de localizar el nombre de la aplicación, y su contenido.
Saludos!

Pd. Si alguien sabe como localizar también el Splash, sería curioso saberlo.

Publicado en Android, Iphone | Etiquetado | 4 comentarios

Como pedir el desarrollo de una aplicación

Todo el mundo tiene cientos de ideas, traer del mundo onírico a la realidad una idea requiere muchas veces delegar el desarrollo a una empresa / persona preparada.
En mi campo, para el desarrollo de aplicaciones web, móvil o escritorio, a causa del desconocimiento es habitual recibir consultas del tipo:

“Muy buenas.
Me llamo X y estoy buscando empresas que me hagan una aplicación web que haga Y
Un saludo.”

Voy a repasar las fases que tiene un desarrollo y a definir que puntos debemos entender para conseguir transmitir correctamente nuestra idea. De esta forma ahorraremos esfuerzos y tiempo a la hora de obtener un presupuesto coherente.
Es lógico que dependiendo del proyecto pueden existir puntos de mucha importancia o irrelevantes, siempre dependerá del tipo de aplicación. Voy a tratar de generalizar.

/* 1º Estudio de la bibliografía */
Punto imprescindible.
 Ya sea leyendo una compleja  documentación, una conversación con un usuario portador de la necesidad, o la explicación del dibujo en una servilleta. Tenemos que partir de un inicio que permita detallar en texto de la forma más completa posible el problema, o dicho de otro modo, la necesidad.  Por ende, cuanto mejor sea la fuente de información, o mejor se exprese el emisor de la idea, mejor será el resultado.
En este punto se define que es lo que realmente se pretende lograr. La calidad de todos los pasos posteriores vendrá definida por la dedicación que prestemos a este punto. A menudo el más olvidado.

/* 2º Estudio de soluciones posibles */
No todo se resuelve de la misma manera. Desglosar las posibles soluciones, enumerando sus pros y contras, son tareas que ayudarán a elegir la mejor solución. Pero será siempre la necesidad final quien defina el método adecuado.

/* 3º Análisis y Diseño de la solución */
Aquí intervienen Analistas, Diseñadores, Técnicos ,etc...
En resumen los recursos técnicos necesarios evaluarán su parte del trabajo. Se realizan bocetos, pseudocodigos de aplicaciones, glosarios de requisitos de hardware, etc..
En el caso de los analistas mostramos las cartas y ponemos la mente a trabajar, pensando la lógica de la aplicación, todos sus caminos y excepciones. El resultado será un pseudocodigo rápido de interpretar que sirva de guía en el desarrollo.

/* 4º Diseño de una prueba de concepto de la solución */
Todas las partes hacen su labor.
Es importante entender que todo desarrollo sufre modificaciones por el camino, de ahí que no diga en el titulo diseño de la solución. En la practica todos sabemos que por el camino, hasta obtener el resultado final, se realizan muchos cambios
ya sean pedidos por el cliente o por mala interpretación de la necesidad.

/* 5º Prueba y Ensayos */
Se realiza la revisión pertinente para ver si realmente se ha conseguido el objetivo planteado inicialmente.

/* 6º Documentación */
El otro gran fugitivo en el mundo real. Documentar un proyecto una vez realizado es algo que TODO el mundo debería pedir cuando encarga un desarrollo.
Esto será la mejor herramienta si se decide hacer cambios o implementaciones en el futuro.

Una vez entendido el ciclo de desarrollo, vamos a posicionar conceptos como Presupuesto.
Para poder realizar un presupuesto es necesario tener un vistazo general y rápido de todos los puntos, los requisitos humanos, técnicos… que serán necesarios y así hacer una valoración del conjunto.
Esta parte puede ser muy complicada para una empresa si el cliente no tiene claro el punto nº 1.

  • “Para que un taller nos haga el presupuesto sobre cambios en nuestro coche, tendremos que llevar el coche al taller y que vea que falla.”
  • “Para que alguien nos desarrolle una idea, tenemos que poder transmitirle la idea lo mejor posible.”

No es necesario conocer los requisitos para lograr nuestra idea, pero si es necesario tenerla bien clara. Por esto, el trabajo del equipo al que se encarga el desarrollo es asegurar el punto nº1.
Muy a menudo los clientes no saben expresar su necesidad. Intentar ponerse en su lugar y hacer de uno mismo la idea de otro puede evocar en mejoras sobre la idea inicial o como poco, en una mejor comprensión de la necesidad.


En definitiva, si quieres que alguien te desarrolle una aplicación tendrás que definirla.
Puedes hacerlo tu solo, puedes pedir ayuda de los usuarios finales a los que quieres facilitar la “tarea” con tu idea, o puedes pedirle a otra persona como puede ser el propio equipo de desarrollo que intente ampliarla. Pero es necesario tener en mente que las ideas son conceptos abstractos que hay que definir.

Publicado en Sin categoría | Etiquetado , | 3 comentarios

Android TextView y los cuadraditos. Solución

Un error que se repite es cuando vas a mostrar un charSecuence en un TextView que has recibido de otra fuente y se supone que está en texto plano. Pero al mostrarlo aparecen cuadraditos.
Bien, estos son algunos ascii que el objeto no interpreta.

Para solucionarlo siempre acabamos reemplazando en la cadena y como no es la primera vez que me toca, aquí dejo una pequeña función con los que más problemas dan habitualmente.

	public static String unEncode(String str) {
	    if (str != null) {
	        while (str.indexOf("&") != (-1)) {
	            str = str.replaceAll("&", "&");
	        }
	        str = str.replaceAll("<", "<");
	        str = str.replaceAll(">", ">");
	        str = str.replaceAll(" ", " ");
	        str = str.replaceAll("\r\n", "\n");
	    }
	    return str;
	}
Publicado en Android | Etiquetado , | Deja un comentario

Medir el pulso como Aplicación Android – Check your steadiness

Cuando empecé a trastear con Android, de las primeras aplicaciones que hice fue esta:

Check Your steadiness.

Es en resumen, una aplicación que realiza un test rápido usando los acelerometros de los dispositivos móviles, para medir la capacidad de mantener el móvil inmóvil :)

Bien, el otro día me di cuenta que ronda ya las 5 mil descargas y un 60% de instalaciones activas. La verdad que es una autentica tontería de programación lo que conlleva, pero es original.
Una prueba más que en Internet, por idiota que sea una cosa, y por poco que cueste hacerla. A nada que sea un poco original, se destaca. Luego ya si se sabe mover = éxito.

Lo que me recuerda el market de Android, hablemos un poco sobre esto:
Actualmente, el market de android tiene un mercado poco dispuesto a la compra de aplicaciones. Como siempre hay gente dispuesta a pagar por aplicaciones, pero nada que ver con el mercado de Iphone, Ipad, etc.
La forma de rentabilizar una aplicación en android es la publicidad. Lo que me recuerda que AdMob ha baneado recientemente miles de cuentas de su sistema.

¿Por Qué?. Porque.. Admob pertenece a Google y lo está fusionando de alguna manera con Adsense, así que todas las cuentas que tenía baneadas en Adsense, han sido baneadas en Admob.

Bien, volviendo al market de Android. Creo que la calidad de las aplicaciones del market, en general, es muy baja. Posiblemente porque no hace falta revisión para subir una aplicación al market, pero hay infinidad de aplicaciones y pocas “buenas”.
Yo por ejemplo, he subido todas mis “pruebas” de aplicaciones mientras aprendía un poco como trabaja Android, y no he publicado todavía nada a lo que se le pueda llamar Aplicación.

Actualmente, creo que el desarrollo nativo para Android, es una perdida de tiempo. Por eso, yo optaría por invertir tiempo y recursos en desarrollos a framewokrs que posteriormente, permitan hacer deploys en varios sistemas.
Unity3D me parece una oportunidad, PERFECTA para hacer desarrollos INDIE y ganar algo de dinero.
En cuanto a Aplicaciones, actualmente, me decantaría por MONO.

Market – Check your steadiness

Publicado en Android | Etiquetado | Deja un comentario

Unity3D, Calcular el resultado de un dado con físicas.

Dado3D

Recientemente he estado trabajando en un juego usando Unity3D. En el se utilizan dados para decidir el movimiento y se decidió usar la física del motor para calcular la tirada.

A grandes rasgos el script de control del dado funciona así:

function Update () {
	if(!doAnything){
		doAnything = true;
		if(throw)step=1;
		DoActions();
	}
}

throw” es un boolean para poder activar la secuencia de lanzamiento desde otros scripts.
y “doAnything” es otra boolean que controla si se está haciendo algo o no, para evitar que el refresco pise la misma acción varias veces.

DoActions contiene los diferentes pasos del lanzamiento

function DoActions(){
	switch(step){
		case 1: 
// 1º Posiciona el dado en su posición correcta.	
		break;
		case 2: 
 // 2º Genera giros aleatorios a la espera de un click		
		break;
		case 3:  
// 3º Si se produce el click sobre el dado, se activa la física y esté cae al tablero
		break;
		case 4:  
// 4º Se calcula el numero de la tirada en base a la cara del dado en Top.
			yield WaitForSeconds(1);
			resultado=CalcVal();
			if(resultado > 0)step =5;
		break;
		case 5: 
// 5º Finaliza la secuencia.
		break;
	}
	doAnything = false;
}

BIen, de todo lo anterior, lo que realmente puede tener algo de complicación es “calcular la cara del dado” para sacar el valor de la tirada.
Yo lo he hecho así:

function CalcVal() {
    var dotFwd:float = Vector3.Dot(transform.forward, Vector3.up);
    if (dotFwd > 0.9) return 1;
    if (dotFwd < -0.9) return 6;
    var dotRight:float = Vector3.Dot(transform.right, Vector3.up);
    if (dotRight > 0.9) return 2;
    if (dotRight < -0.9) return 3;
    var dotUp:float = Vector3.Dot(transform.up, Vector3.up);
    if (dotUp > 0.9) return 4;
    if (dotUp < -0.9) return 5;
    return 0;
}

Como veis utilizo un valor de inclinación de cada eje respecto a la normal y dependiendo de los valores resultantes devuelvo un resultado u otro.
A saber que estos valores encajan en mi dado que de inicio tiene el 4 en la cara superior. Para otros dados tendréis que jugar con debug y en unas 3 o 4 tiradas ya habréis sacado todos los valores.

Iré poniendo pequeños tips de Unity3D poco a poco que la verdad me han salido bastantes curiosidades en este proyecto.
Saludos!

Publicado en Unity3D | Etiquetado , , | 2 comentarios

Threads en PHP

Disponer de Threads en PHP puede ser útil en algunos casos, por ejemplo mantener un numero de peticiones por segundo constante, si estas son asíncronas dada su naturaleza de ejecución.
Y aunque técnicamente no se pueden usar Threads en PHP si se puede emular y a la practica resulta lo mismo.

La idea es usar proc_open(), abrimos un proceso y seguimos su ejecución accediendo a el cuando necesitemos para consultar su estado y salida.
Aquí una clase de mi librería que he usado alguna vez para tal fin con un pequeño ejemplo:


$process[0] = Thread::create("do_something.php paramOne");
$process[1] = Thread::create("do_something.php paramTwo");

foreach($process as $k => $p){
	$result=$p->listen();
	if($result){
		echo "Process [$k] => result $result\r\n";
	}else{
		if(!$p->isActive()){
                	$p->close();
			unset($process[$k]);
		}
	}
}

class Thread {
	var $pref ; // process reference
	var $pipes; // stdio
	var $buffer; // output buffer
	function Thread() {
		$this->pref = 0;
		$this->buffer = "";
		$this->pipes = (array)NULL;
	}
	function Create ($file) {
		$t = new Thread;
		$descriptor = array (0 => array ("pipe", "r"), 1 => array ("pipe", "w"), 2 => array ("pipe", "w"));
		$t->pref = proc_open ("/usr/local/bin/php -q $file ", $descriptor, $t->pipes);
		stream_set_blocking ($t->pipes[1], 0);
		return $t;
	}
	function isActive () {
		$this->buffer .= $this->listen();
		$f = stream_get_meta_data ($this->pipes[1]);
		return !$f["eof"];
	}
	function close () {
		$r = proc_close ($this->pref);
		$this->pref = NULL;
		return $r;
	}
	function tell ($thought) {
		fwrite ($this->pipes[0], $thought);
	}
	function listen () {
		$buffer = $this->buffer;
		$this->buffer = "";
		while ($r = fgets ($this->pipes[1], 1024)) {
			$buffer .= $r;
		}
		return $buffer;
	}
	function getError () {
		$buffer = "";
		while ($r = fgets ($this->pipes[2], 1024)) {
			$buffer .= $r;
		}
		return $buffer;
	}
}

Bueno, creo que se ve la idea.
Dicho esto, se puede aprovechar de muchas formas y se le puede implementar muchas cosas.
Control de consumo, lanzar los procesos usando prioridades con nice, control de tiempos de ejecución, etc.etc.
Por ejemplo para una AI, lanzando muchas evaluaciones de situación simultaneas y así aprovechar al 100% la CPU.

Publicado en PHP | Etiquetado , , | 4 comentarios