sábado, 6 de mayo de 2017

J-Music: la aplicación de música para Android (Soporte finalizado)

¡Descarga APK haciendo clic aquí!

Ya esta disponible para Android la app que tantos me habíais pedido, y que tanto retraso ha tenido su lanzamiento: J-Music

Esta aplicación permite:
-Escuchar canciones de Youtube descargando solo el audio. ¡Ideal para ahorrar datos moviles!
-Descargar las canciones en formato MP3
-Explorar las canciones buscando ya sea el cantante o nombre de la canción

La aplicación esta desarrollada con PhoneGap, por lo que el codigo fuente se encuentra dentro del propio APK para los curiosos. Ademas, ¡no tiene publicidad!

La aplicación, a pesar de que los conversores Youtube-MP3 son legales de momento (siempre que sea únicamente para uso personal) no estaría aprobada para la Play Store (ya que es de Google) por lo que descargar el APK desde aquí es la única manera de instalarla. Recordad que podeis comentar aqui si tenéis alguna duda.

En caso de producirse un mínimo problema legal por parte de la aplicación, esta sera retirada de inmediato del blog.

Es posible que la aplicación no sea totalmente compatible en versiones antiguas de Android aunque siempre deje instalarla.


lunes, 1 de mayo de 2017

DInput key switcher. Personaliza el teclado en tus videojuegos.

Descarga el proyecto haciendo click aquí.
¿Quien no ha jugado nunca al Rayman 2 y no ha deseado poder cambiar los controles? Algunos videojuegos (sobre todo los que tienen ya tiempo) no permitían re-mapear las teclas de ningún modo, y no siempre era sencillo hackearlos para cambiar los controles. El videojuego anteriormente mencionado NUNCA vio una forma de cambiar los controles de teclado.

Esto se acabo... Gracias a mi como de costumbre.
Con mi nueva aplicación podréis generar un fichero DINPUT.DLL "hackeado" que al copiarse al directorio donde tenéis instalado vuestro juego cambiará vuestros controles de teclado a los que vosotros queráis.

De momento solo tiene versión de 64 bits, aunque si alguno por casualidad estuviese interesado en una versión de 32 bits, decidmelo, y me plantearía portarla a 32 bits.

Edición: Codigo fuente disponible a peticion de "Rayman Pirate Community"

Algunos juegos donde funciona dinput.dll:

-Rayman 2
-DosBox
-.....

Algunos juegos donde funciona dinput8.dll:

-Rayman 3
-Crazy Taxi
-.....

¡Sugerid mas juegos!

jueves, 20 de abril de 2017

(OBSOLETO) Vulnerabilidad de phishing en Chrome y Firefox

Demostración aquí.

¡Hola a todos!
Aunque tengo esto un poco abandonado por motivos académicos, quería escribiros un post sobre una vulnerabilidad presente en Google Chrome y Firefox (entre otros navegadores), y que hasta que se solucione, puede ser un gran problema a la hora de seguir cualquier enlace desde el PC. Estos enlaces por lo general se mostrarán como seguros a pesar de ser paginas totalmente diferentes.


Se trata de ataques phishing basadas en direcciones Unicode, y es que los navegadores implementan esta funcionalidad Unicode para que puedan haber direcciones web con caracteres chinos, por ejemplo.

El problema es que mediante estos caracteres podemos suplantar sitios web. Aunque se ha puesto de moda el ejemplo de apple.com (aquí) lo cierto es que tambien se pueden aplicar a paginas tipo Tumblr o Blogspot donde nuestro nombre pueda ir al principio de la URL, llegando a reemplazar incluso a "www" (Como en mi ejemplo de arriba)

Os animo a los usuarios de PC a que hagais click en el enlace que hay puesto al principio y me digais si podeis diferenciar la pagina de Tumblr real de la falsa.

sábado, 25 de febrero de 2017

Crear fotos con emojis

Seguro que mas de uno ya conocía alguna pagina web para convertir imagenes a caracteres ASCII.

Esto tuvo cierta popularidad hace tiempo.

Ahora en la epoca del Whatsapp donde lo que esta de moda son los emojis me pregunté... ¿Existe alguna pagina para convertir una imagen a emojis? Como vi que no, decidi crear una yo mismo.  La comparto con vosotros:
Enlace Versión nueva (2019)
Enlace versión antigua

Si teneis algun comentario o duda sobre su funcionamiento comentad abajo.

Si os gustan las chorradas con emojis, probad también Lovewords.


sábado, 18 de febrero de 2017

Descargar canciones de Youtube con la maxima calidad posible (audio nativo sin recodificar)

Como sabéis existen gran cantidad de paginas web que permiten descargar las canciones de los vídeos de Youtube en formato MP3.
Partiendo de que la calidad de audio de Youtube es bastante baja de por si, al recodificarlo a MP3 se pierde aun mas calidad*, por lo que no hace falta ser un audiofilo para darse cuenta incluso con unos auriculares básicos.
Muchas veces el MP3 llega a ocupar bastante y la velocidad de descarga en estos sitios suele ser baja.

¿Cual es la alternativa? Descargar el audio en formato nativo. Esto se puede hacer mediante youtube-dl.

Para los usuarios de Windows os adjunto un archivo *.zip que podeis extraer en una carpeta con los binarios y unos pequeños scripts *.bat que os simplificará el proceso:
Descarga aquí.

Solo hay que abrir los *.bat y pegar la URL del vídeo (ej: https://www.youtube.com/watch?v=uh6TKlo_BFM) o el ID del vídeo (uh6TKlo_BFM). ¡Veréis que la descarga va rapidísima!

Los vídeos de Youtube se pueden descargargar en distintos formatos de audio nativo cada uno: AAC, OGG Vorbis, y en la maxima calidad OPUS**

-Para reproducir en moviles android podeis usar OGG
-Para reproducir con Windows Media, y Itunes/IOS usad AAC
-Si vuestra intención es reproducirlo con VLC en el ordenador, usad el script de maxima calidad

Si han pasado meses desde que escribí este post, y veis que ya no funciona actualizad a la ultima version de youtube-dl con actualizar.bat.

No todos los videos tienen disponibles todos los formatos. Si por ejemplo un video no esta disponible en OGG probad la descarga en AAC.

* Os recomiendo mi post sobre como detectar MP3 recodificado
** Os recomiendo mi post comparativa de distintos formatos de audio

domingo, 8 de enero de 2017

Experimentos con la Raspberry Pi

¡¡Feliz año nuevo followers!!
En esta ocasión como no se me ocurre nada que publicar, os pongo dos experimentos recientes que hice recientemente con mi Raspberry Pi a ver si os inspiran.

El primero se trata de un ejemplo de Domotica muy simple, en el que creamos un portal web con PHP desde el cual podemos hacer cosas como abrir la puerta del garaje desde un ordenador o un telefono movil ¿Quien necesita llevar el mando encima?



El segundo se trata de la modificación del código fuente de un videojuego para que actue con los GPIO, pudiendo hacer cosas como añadir un segundo display, aunque se podría hacer que activasen motores, encendiesen bombillas, y mas cosas dependiendo de lo que ocurre en el videojuego. ¿Se os ocurren ideas? Bajad el volumen cuando pongais el video :')


sábado, 7 de enero de 2017

Bots: resolviendo los re-capchas: human-tunnel by Juanmv94

Antes cuando los captchas eran simples textos deformados con lineas pintadas por encima no era demasiado complicado mediante OCR obtener una determinada tasa de acierto resolviendo los catchas en los bots.

Ahora con la tecnología re-captcha de Google, implementada en muchísimos sitios esta tarea es casi imposible, ya que las técnicas de visión artificial aunque han avanzado mucho estos últimos años, siguen siendo insuficientes para la complejidad que este tipo de capchas presentan.

Nos podríamos calentar la cabeza haciendo unos algoritmos de visión artificial super avanzados... O podríamos resolver este problema de una forma sencilla, eficiente, y que nadie se esperaba. Como dijo Bill Gates: “Siempre escojeré a un vago para hacer un trabajo difícil… porque, encontrará una manera sencilla de hacerlo”


Pues bien: tenemos un servicio (pagina) web con usuarios que pueden registrarse, loguearse, interactuar,... Y aparte tenemos nuestro bot encargado de hacer alguna función repetitiva (buscar en Google, registrar cuentas, publicar comentarios,...) que puede estar o no relacionada con nuestra web.

Cuando a nuestro bot le aparezca un captcha, solo tendremos que enviar ese captcha a la primera persona de nuestra web que vaya a hacer algo, ya sea registrarse, loguearse, o cualquier otra actividad (esta decisión dependerá de la cantidad de actividad de nuestra web en proporcion con la del bot). ¡Esa persona lo resolverá por nosotros! Aparte le daremos mayor seguridad a nuestra web de una forma gratuita.

La forma de hacerlo sería algo así: 
-Nuestro servidor establece una conexion HTTPS con re-capcha y le mostramos al usuario ese mismo re-capcha desde nuestra web, (normalmente tambien desde HTTPS) creando una conexion parecida a un proxy en la que nuestro servidor hace un man-in-the-middle.
-Cuando el usuario resuelva correctamente el captcha (A veces puede darse el caso de que lo fallase) nuestro servidor que intercepta la comunicación lo sabrá, permitiendole acceso al usuario, y continuando la ejecución del bot.

De momento es solo un concepto, que no debería ser muy dificil de implementar.
Comentad cualquier duda que tengáis, comentario, o agradecimiento.

martes, 13 de diciembre de 2016

Problema de informatica para pensar (pero sin pasarse): El fichero "llave"

En esta ocasión os quería traer otro problema en este caso mucho mas sencillo que el anterior.

Venga chicos, ¡a por el premio! ;) Espero vuestras respuestas en los comentarios

En la empresa "Soluciones informaticas de Tedelche SA" Tienen en mente un proyecto importantisimo, contenido en 2 PDFs totalmente distintos de 20mb cada uno.

No obtante ocurre que algunos empleados solo tienen el PDF 1, y otros solo tienen el PDF 2 y necesitan tener los dos. El director decide mandarles a todos el PDF que no tienen en un correo que será el mismo para todos. En este correo, que tiene un limite de 21mb el director adjunta un fichero "llave" de 20mb y un EXE de muy pocas Kilobytes.

-Los empleados que tienen el PDF 1 abren el EXE introduciendo el fichero "llave" y el PDF 1 y... ¡les aparece el PDF 2!

-Los empleados que tienen el PDF 2 abren el EXE introduciendo el fichero "llave" y el PDF 2 y... ¡les aparece el PDF 1!

Los empleados, que no entienden mucho de informatica/matematicas/ciencia creen que es magia, ¿Que hace el pequeño EXE en realidad?

martes, 29 de noviembre de 2016

Web 3D - El futuro de las paginas web moviles

Todos nos hemos fijado que muchas paginas web tienen su propia adaptación para dispositivos moviles en las que el texto sale mas grande, los botones son mas vistosos...

La cuestión es que algo que permite HTML5 y que apenas se utiliza actualmente es el uso de los acelerometros que detectan la inclinación del dispositivo. Esto permitiría hacer paginas web con efectos como los que traen muchos fondos de pantalla "dinamicos" que nos vienen con el movil y que cambian conforme a la inclinación.

En el caso de las paginas web permitirían hacer que los elementos varíen levemente de posición al mover el dispositivo dando una sensación 3D.
En el mes de Octubre realicé una demo en la que mi pagina web te daba distintas "frases diarias" en un cuadrado que variaba de posición al inclinar el dispositivo, a lo que llamé Web 3D.

Teneis el enlace aquí.
Teneis otra demo para enviar en San Valentin aquí.

Ademas os comento que hacer una pagina web que de frases diarias que cambien cada vez que accedes a la pagina es un ejemplo sencillísimo de cosas que se pueden hacer en Javascript sin necesidad de apenas experiencia y que si alguno tiene alguna idea parecida y no sabe como empezar a hacerlo me puede preguntar.

Otras cosas que permite HTML5 y que apenas se usan en web son:
- Detectar nivel de batería del dispositivo
- Localización GPS en tiempo real

En realidad, cualquier pagina web puede perfectamente hacer estadisticas sobre la inclinación de nuestro dispositivo y de nuestro nivel de batería. En el caso de la localización GPS nos saldrá un aviso de si queremos autorizar la web a usar la ubicación, al que podremos decir que no.

¿Que pensais de todo esto? comentad ;)

sábado, 5 de noviembre de 2016

Problema de matematicas: El chip del Bonillo

Bueno chic@s, esta vez quería cambiar el tema en el que se centra mi blog y proponeros un problema de matemáticas que yo inventé recientemente que os pondrá a prueba, y que seguramente ninguno de vosotros resolverá :') Así que... ejejem...

En la nación/república independiente del Bonillo (Albacete) han decidido implementar por primera vez su propio DNI Electrónico, que permitirá mediante unos pines metálicos obtener un ID único para cada DNI.
El problema es que en el Bonillo no tienen ni idea de electrónica, como era de esperar, así que deciden implementarlo conectando los pines entre si directamente, y creando así distintas combinaciones.
Como veis en la imagen, con 3 pines se pueden obtener 5 combinaciones distintas, y con 4 pines 15 combinaciones.

A partir de 8 pines ya es posible tener al menos una combinación por habitante del Bonillo, pero... ¿Cuantas combinaciones son? O mejor dicho... ¿Como se calculan? (Sin fuerza bruta ehhh)

Si no os sale (lo mas probable) teneis la solución en PDF aquí.
Ademas podeis calcular las distintas soluciones del problema desde vuestro navegador gracias a mi implementación en Javascript aquí:

Introduzca numero de pines: 






FAQ:
P: ¿Quien inventó el problema?
R: Yo.

P: ¿Funcionaría en la vida real?
R: Tecnicamente sí, pero para ello sería necesario altos niveles de aburrimiento.



P: ¡Guapo!
R: Grasia.

jueves, 18 de agosto de 2016

(OBSOLETO) Como encontrar un pokemon que aparece en el radar de Pokemon GO

Como sabreis, hace un tiempo quitaron la funcionalidad de los pasos de la popular aplicación Pokemon GO. Asi que imaginaos que pasaría si os encontrais un pokemon legendario en el radar. ¿Como encontrarlo? ¡Es pura matematica!
Pues bien, es tan sencillo como tener en cuenta que el radar muestra los pokemon en un radio de 200 metros. Cuando excedemos este radio el pokemon desaparece. Y mirad por donde... He  creado una aplicación web que os encontrará a esos pokemon ;)
Podeis acceder en http://juanmv94.tumblr.com/pokemon acordaos de marcar como favorito el enlace en el navegador de vuestro movil.


Los pasos a seguir son:

1.Caminar hasta que el pokemon deje de aparecer en el radar.
2.Introducir nuestra ubicación y dar media vuelta para que vuelva a aparecer.
3.Cuando vuelva a desaparecer, volver a introducir nuestra ubicación.
4.¡El pokemon aparecerá en el radar! (Muestra dos posibles ubicaciones) Ahora solo hay que ir a por él.

lunes, 15 de agosto de 2016

(OBSOLETO) Como ver y descargar todas las fotos de Tuenti en el 2016: Tuenti explorer 1.0

Por fin esta terminada la herramienta que tanto esperabais!
Ya es posible ver y descargar todas nuestras fotos de Tuenti y las de nuestros amigos a 2016 que estamos.
A pesar de que ya no es posible acceder a estas fotos desde la aplicacion movil o desde el navegador, la API (Cosas que nunca entendereis) si permite acceder a estas!!
Por ello he creado una aplicación web que permite verlas.



INSTRUCCIONES:

1. Copiar el siguiente codigo fuente en un fichero nuevo HTML (basicamente es copiarlo todo, pegarlo en el bloc de notas y guardarlo con extension *.htm)

Código fuente eliminado

2. Abrir el fichero con Internet Explorer y pulsar F12 para acceder al modo desarrollador
3. En la pestaña emulación cambiar el User-Agent por el que aparece en la esquina (Mirar imagen). Hecho esto pulsamos en cualquier otra opcion para que IE valide los cambios y ya podemos minimizar si queremos el modo desarrollador ¡Importante no cerrarlo mientras usemos la aplicacion!
4. Introducimos nuestro email y contraseña de Tuenti y pulsamos "obtener sesion"
5. Si todo ha ido correcto, nos saldran unas letras en el recuadro de sesion, si es asi, le damos a acceder.
6. Esperamos a que cargue la lista de amigos. Es importante no tocar nada hasta que termine... ¡YA LO TENEMOS!

Ahora podemos navegar en todas las fotos  de nuestros amigos y ver todas sus fotos etiquetadas, subidas,...
Tenemos una casilla para decidir entre organizar o no las fotos por fechas, y un boton que nos permite al pulsarlo descargar todas las fotos del album que estemos viendo!

En fin, cualquier duda sobre su funcionamiento o sugerencia aqui.
Ya se que la aplicación de por si es fea, pero es lo que pasa cuando quieres hacer una aplicacion muy compleja en 2 dias XD

jueves, 11 de agosto de 2016

(OBSOLETO) Como descargar todas mis fotos de Instagram desde el navegador

Bueno pues resulta que un dia quise guardar todas mis fotos (y videos) que tenía subidas a Instagram en el PC, y vi que mas allá de aplicaciones para el movil en las que introduces tu contraseña de Insta no habia nada que me pudiese ayudar.

Lo cierto es que tu puedes acceder a cualquier foto de un perfil publico en el navegador, asi que pense... ¿Y porque no hago una aplicacion JavaScript que acceda a un perfil publico y descargue a maxima resolucion todas las fotos y videos?
¡Y eso hice! Podeis descargar mi aplicacion HTML copiando el texto de abajo y pegandolo en un nuevo archivo HTML.

¿Y por que no lo pongo como widget en el blog? Lo cierto es que al conectarme a un host remoto como es www.instagram.com me surge un gran impedimento... Y es que JavaScript no permite mandar peticiones web a host distintos a donde se encuentra el script. Por eso para que funcione solo hay dos alternativas: Que el script este presente en instagram.com (lo veo muy poco probable) o abrir el HTML guardado en nuestro equipo (Y esto ultimo no funciona en todos los navegadores, aunque al menos en Internet Explorer funciona).

Tenía pensado hacer una extension de Chrome para poder ejecutar el script desde el host de instagram.com y que asi funcionase en Chrome, pero sabiendo el exito que va a tener... Aun siendo una tarea muy simple ni me molesto en hacerlo XD

Resumen del funcionamiento:
-Obtiene los enlaces a todas nuestras fotos y videos obteniendo los metadatos (fecha de subida, tipo)
-Descarga una por una las fotos y videos, dandoles por nombre la fecha de subida
-Gracias a JSZip empaquetamos todas las fotos en un único .zip sin compresión.

Pero bueno, si teneis alguna duda sobre su uso o funcionamiento no dudeis en comentar.

<html>
<body>
<div>
<b>Descargar todas mis fotos y videos de Instagram</b><br><br>
Usuario:
<input type="text" id="texto" text="Introduce usuario" size="16" />
<input type="submit" value="Descargar" onclick="ejecutar()"/>
</div>
<br>
<div id="instagram"></div>
<script src="https://stuk.github.io/jszip/dist/jszip.js"></script>
<script src="https://stuk.github.io/jszip/vendor/FileSaver.js"></script>

<script>
  var isIE8 = window.XDomainRequest ? true : false;
  var invocation = createCrossDomainRequest();
  function createCrossDomainRequest(url, handler) {
    var request;
    if (isIE8) {
      request = new window.XDomainRequest();
      }
      else {
        request = new XMLHttpRequest();
      }
    return request;
  }

  function callOtherDomain(url,funcion) {
    if (invocation) {
      if(isIE8) {
        invocation.onload = outputResult;
        invocation.open("GET", url, true);
invocation.overrideMimeType("text/plain; charset=x-user-defined");
        invocation.send();
      }
      else {
        invocation.open('GET', url, true);
invocation.overrideMimeType("text/plain; charset=x-user-defined");
responseType = "arraybuffer";
        invocation.onreadystatechange = handler;
        invocation.send();
      }
    }
    else {
      var text = "No Invocation TookPlace At All";
      var textNode = document.createTextNode(text);
      var textDiv = document.getElementById("textDiv");
      textDiv.appendChild(textNode);
    }
  }

  function handler(evtXHR) {
    if (invocation.readyState == 4)
    {
      if (invocation.status == 200) {
 funcion(invocation.response);
      }
      else {
        alert("No se puede encontrar el usuario o no se ha podido conectar remotamente a www.instagram.com recuerde usar Internet Explorer");
      }
    }
  }
</script>
<script>
var funcion;
var nombres=new Array();
var archivos=new Array();
var tipo=new Array();
var i,progreso=0;
var zip = new JSZip();

function dos(num)
{
if (num<10) return "0".concat(num);
else return num;
}

function ejecutar(){
var user=document.getElementById("texto").value;

funcion= function(a) {
var con = JSON.parse(a);
document.getElementById("instagram").innerHTML = "Buscando contenido: "+nombres.length+" fotos/videos encontrados...";
for (i=0;i<con.items.length;i++) {
tipo.push(con.items[i].type);
nombres.push(con.items[i].created_time);
if (con.items[i].type == "image"){
archivos.push(con.items[i].images.standard_resolution.url);
}
else
archivos.push(con.items[i].videos.standard_resolution.url);
}

if(con.more_available)
{
callOtherDomain("https://www.instagram.com/juanmv94/media/?max_id="+con.items[con.items.length-1].id);
}
else {
i=0;
funcion= function(a) {
var it;
var archivo= new Array();
var d = new Date(parseInt(nombres[i])*1000);
var nombre=d.getFullYear()+"-"+dos((d.getMonth()+1))+"-"+dos(d.getDate())+" "+dos(d.getHours())+"."+dos(d.getMinutes())+"."+dos(d.getSeconds());
if (tipo[i]=="image") nombre=nombre.concat(".jpg");
else nombre=nombre.concat(".mp4");

for (it=0;it<a.length;it++) archivo.push(a.charCodeAt(it));

zip.file(nombre, archivo);
i++;
document.getElementById("instagram").innerHTML = "Descargando fotos y videos: "+i+"/"+nombres.length;
if (i==nombres.length)
{
zip.generateAsync({type:"blob"})
.then(function(content) {
    // see FileSaver.js
    saveAs(content, user+".zip");
});
}
else callOtherDomain(archivos[i]);
}
callOtherDomain(archivos[0]);
}
}
callOtherDomain("https://www.instagram.com/"+user+"/media/");
}
</script>
</body>
</html>

jueves, 23 de junio de 2016

CPU-Grabbers: La proxima amenaza en Internet. Codificar MP3 y enviarlo de vuelta en background con javascript

Descarga prototipo aquí.
Virus, ventanas emergentes,... Hay muchos elementos en la web que nos dificultan la navegación. Pero ¿Que es lo siguiente que aparecerá?

Tecnologias como asm.js que permiten ejecutar javascript a velocidad casi nativa, o a compiladores como Emscripten que permiten compilar javascript a partir de codigo C o C++, javascript se esta convirtiendo en el lenguaje de programación multiplataforma del futuro.

Y aqui es cuando yo planteo un concepto... ¿Y si utilizamos la potencia de javascript en nuestra pagina web para que los usuarios que accedan nos realicen tareas computacionales complejas mientras visualizan con normalidad la pagina y conforme los calculan nos lo vayan enviando de forma transparente?

Esta idea que planteo nos evitaría el costo que tendría por ejemplo el uso de super-computadores, a la vez que al usuario le aumenta el uso de CPU y por lo tanto el consumo de energía de su dispositivo.

¿Os imaginais a paginas web con millones de usuarios como Google, Twitter,... Poniendo en practica esta idea para desencriptar claves AES por fuerza bruta en muy poco tiempo?

Mi prototipo:
Aunque descifrar claves sea probablemente uno de las mayores utilidades de mi concepto de CPU-Grabber, en mi prototipo vamos a un caso mucho mas basico: Codificar de PCM a MP3.
Para ello utilizo la librería liblame.js obtenida desde github. Esta no esta optimizada para javascript, pero para un simple prototipo nos sobra.
En el prototipo teneis adjunto el servidor http "miniweb" junto a la libreria libLame.js y el resto de archivos del prototipo, incluyendo un "index.html"

Accediendo al contenido de este servidor web desde por ejemplo, un ordenador o un Iphone sin jailbreak, el dispositivo descarga audios WAV aleatorios de la carpeta "wav" que no se haya codificado aun (Comprobandolo previamente), lo codificará en MP3, y una vez hecho esto, enviará el MP3 resultante al servidor con un POST el cual nos colocara en la carpeta "mp3". Una vez hecho esto, volveremos a coger otro audio aleatorio que no se haya codificado aun, así hasta que cerremos el navegador, o no queden archivos sin codificar en nuestro servidor.

El motivo por el que se selecciona un audio aleatorio, es porque perfectamente podemos tener varios dispositivos conectados a nuestra web a la vez, cada uno codificando audios distintos simultaneamente.

Notas del prototipo:

-Hay dos modos accesibles desde index.html. El modo debug que muestra en todo momento lo que hace el javascript, y el modo poison que muestra una pagina web (politica de privacidad de ask.fm) infectada con poison.js y por lo tanto ¡codificando para nosotros MP3 sin que el usuario se entere!

-En las capturas muestro el tiempo que tardan distintos dispositivos en codificar audios (Distintos a los audios adjuntos) en el modo debug

-Acordaos que podeis insertar vuestros propios archivos "wav". Debeis establecer en index.html o poison.js (depende la demo que esteis usando) el numero de pista mas pequeño y el mas grande de vuestros archivos wav.

miércoles, 15 de junio de 2016

Primera IA que juega a "Blokus"

Descarga aquí. (Código incluido y comentado)
Blokus es un juego de mesa que me regalaron cuando era niño :')
El objetivo del juego es conseguir colocar mas cuadraditos en el tablero que tu adversario. Para ello debes colocar las fichas tipo pentomino de forma que tus fichas estén conectadas por las esquinas sin llegar a tocarse nunca.

Acordándome por casualidad decidí buscar en internet algún sitio donde jugar contra el ordenador a este juego, y mi sorpresa fue que no había ninguno. Lo que si que encontré son sitios que hay (o habían) donde se podía jugar online. En la imagen muestro un juego de PS3 para jugar únicamente online a Blokus.

Y entonces pensé... ¿Tan difícil debe ser crear una IA que juegue a este juego?
Así que me puse a crear una versión Javascript del juego para intentarlo :')

Creando la IA:
Al principio tenia en mente crear una función heurística y usar minimax, pero al final viendo que minimax sería bastante impreciso y desperdiciaría bastante tiempo de computación, vi que usando esta misma heurística de forma voraz, la IA podia generar movimientos muy buenos (Sin ser invencible, lo cual creo es bastante importante) y lo mas importante de todo... ¡Sería muy, muy rápido!
¡Y he aquí el resultado! A pesar de estar hecho en javascript, la IA no tarda ni 0.1 segundos en pensar en mi ordenador. Y va rápido incluso en mi antiguo Iphone 4.

La heurística funciona teniendo en cuenta tres parámetros:

-Expansión en el tablero --> x1
-Incrementar el numero de movimientos posibles --> x1
-P*tear al adversario :') --> x10

Esto quiere decir que la IA le da la misma importancia a expandirse en el tablero que a incrementar su numero de movimientos, y ademas tiene especial interés en que perdamos :')
Lo mejor de todo es que estos tres parámetros se pueden redefinir. Ej: podemos modificarlo de forma que el adversario quiera expandirse "Sin hacernos daño" lo cual seria un poco raro en un jugador real. Solo habría que cambiar el valor de los parámetros.
¿Que os ha parecido?

Aleatoriedad en Flappy Bird. ¿Como se si tengo el juego original?

En este mini-post os voy a contar una curiosidad sobre el mítico juego de Flappy Bird (para variar).
Como sabeis, este juego se basa en la aleatoriedad. En los dispositivos, ya sea un ordenador, tablet, u otro aparato, la aleatoriedad se consigue mediante una semilla que suele obtenerse mediante el PID (Identificador de proceso) o con el reloj.
Así, el color que tendrá Flappy al empezar y el color del cielo será totalmente aleatorio.

Pero... ¿Y las tuberias? No se muy bien si sera de forma intencionada o no, pero la disposición de las tuberias tiene la aleatoriedad basada en una semilla fija. Por ello, cada vez que inicieis el juego independientemente del dispositivo que tengais, e incuso la versión de flappy bird que tengais (siempre que sea original) el "mapa" tendra la siguiente disposición:

Haced click para darle zoom, no seais vagos :')

Y aqui no acaba la cosa. ¿Que ocurre cuando nos chocamos y empezamos de nuevo? Cuando esto ocurre la semilla cambia, siempre de la misma forma (tal vez se incremente en 1 o algo similar).
¿Cuales son las consecuencias de eso? Cuando nos choquemos por primera vez apareceremos en un "mapa" distinto, y ademas empezaremos en una posición respectiva a donde nos hemos chocado. Lo entenderéis con un ejemplo.

Las siguientes imágenes muestran:

-la segunda tubería tras haber chocado una vez en la segunda tubería de la ronda anterior.

-la tercera tubería tras haber chocado una vez en la primera tubería de la ronda anterior

Como habreis observado ¡estamos en el mismo lugar! y si siguiesemos las partidas veriamos que las tuberias seguirian estando a la misma altura, aunque en una de ellas tendremos un punto mas que en la otra.

¿Que os ha parecido? Recordad que una forma sencilla de averiguar si vuestro juego de Flappy bird es el original, es comparando el mapa del inicio con el de la primera imagen.

jueves, 9 de junio de 2016

Como adjuntar (enviar) archivos de cualquier tipo en Ask.fm -> File2PNG

Como sabeis en Ask.fm se pueden adjuntar fotos, GIFs y video-respuestas...
Pero que pasa si quereis compartir con el mundo vuestra cancion mp3 favorita, vuestro ROM favorito, vuestro documento de Word en el que estais trabajando...?
No se podia... hasta ahora :'))) Producto de mi aburrimiento he creado un shell-script para windows que convierte con ffmpeg un archivo ZIP (Aunque tambien valdria RAR y 7Z) en una imagen PNG que podeis subir a ask.fm, para mas tarde poder decodificarla de nuevo.
igual que digo ask.fm también valdria cualquier otro sitio que permita subir imagenes PNG sin perdida.

¿Como funciona? Lo primero que teneis que hacer es descargar ffmpeg si no lo teneis aun, y Crear los siguientes archivos *.bat

"ARRASTRE ZIP AQUI.bat"

@echo off
set /a pixeles= %~z1% / 3
set c=0
:raiz
set /a c= %c%+1
set /a x= %c%*%c%
if %x% LSS %pixeles% goto raiz
echo resolucion %c% x %c%
set /a nbytes= %c% * %c% * 3
set /a nulls= %nbytes% - %~z1%
copy %1% temp.rar
:bucle
if /I %nulls% LEQ 0 (goto ffmpeg)
echo "juanmv94" >> temp.rar
set /a nulls=%nulls%-13
goto bucle
:ffmpeg
ffmpeg -f rawvideo -s %c%x%c% -pix_fmt rgb24 -i temp.rar salida.png
del temp.rar


"ARRASTRE PNG AQUI.bat"
@echo off

ffmpeg -i %1% -f rawvideo -pix_fmt rgb24 salida.zip

El nombre de los archivos son autodescriptivos. Para codificar se arrastra el zip al primer script, y para decodificar se arrastra el archivo PNG al segundo.

Detalles tecnicos:
El script convierte un archivo binario a un mapa de bits de rgb de 24 bits que se codificará en PNG.
Lo primero que hace el script al codificar es calcular las dimensiones que tendrá la imagen calculando la raiz cuadrada. Los pixeles sobrantes del cuadrado mas pequeño que contenga el archivo se rellenaran con la etiqueta en texto plano "juanmv94" la cual se repetira hasta llenar el cuadrado.

Para decodificar simplemente convertimos el archivo PNG a mapa de bits y extraemos el contenido RAW al archivo ZIP en este caso.

domingo, 22 de mayo de 2016

Ya disponible Erosion v.4!

Enlace de descarga aqui.



Han pasado mas de 10 años desde que apareció en 2003 Erosion v.3, un programa que a la vez que simple y lleno de fallos, gano una gran popularidad sobre todo en Youtube.
Este programa esta destinado a cambiar bytes arbitrarios en ROMs y otros archivos con el objetivo de ver como afecta los distintos tipos de corrupción de datos a los archivos en determinados offsets.
Este era el programa antiguo en si:


Solo hace falta buscar en Youtube "Erosion v.3" para ver la cantidad de videos de corrupciones de ROMs realizados con esta utilidad, la cual ademas de su tosca y confusa interfaz (Solo hace falta ver el menu de abrir archivos) estaba lleno de fallos que te cerraban la aplicacion a mitad de progreso obligandote a volver a abrirla y a volver a buscar el archivo en su horrible menu.
¡¡Eso sin hablar de lo lento que era!!
Por suerte todo eso ha acabado. Mejoras y novedades en Erosion v.4:


-Velocidad: ¡Entre 100-1000 veces mas rapido que v.3! Ademas al terminar su trabajo, en vez de abrir una molesta ventana emergente, simplemente notifica con el sonido "ding" de windows.
-Menu de archivos: Utiliza el menu abrir archivo de windows de toda la vida recordando el ultimo directorio abierto. ¡Se agradece bastante!
-Bugs: Gracias a su gestor de excepciones, es practicamente imposible que haga crash. En caso de que un archivo este siendo utilizado, haya sido borrado, o sea de solo lectura, se notifica y se detiene la erosión.
-Log: Mensajes mucho mas completos y posibilidad de borrarlo en cualquier momento.
-CRC32: Permite asegurarnos que hemos elegido un ROM correcto o que no haya sido modificado/erosionado con anterioridad.
-Rango de erosion: ¡Totalmente rediseñado! Las direcciones ahora estan en hexadecimal, como siempre debían haber sido, y empezando en 0x0000. Ademas incluye dos sliders que indican las posiciones relativas del archivo, haciendo la tarea mucho mas visual, sencilla y agradable
-Intervalo de erosion: Ademas de darle un nombre mas entendible (antes era "power") permite especificar los valores entre los que se encuentra el intervalo aleatorio, porque... ¿De que sirve si solo podía ser entre 1 y 4000?
-Nuevos valores del byte: Lo primero es que la funcion de erosionar Long que daba tantos errores y era tan poco util (El programa trabajaba en bytes) ha sido eliminada. La función "Slope" se ha reemplazado por invertir byte, lo cual es bastante util, y la funcion predefined Values, que era demasiado compleja y con muy poca utilidad, se ha reemplazado por una mucho mas util, que son valores aleatorios en un rango.
-Botones: Los botones "Erode" y "Re-Erode" se han fusionado en uno solo evitando confusiones, y creando una interfaz mas limpia. Gracias a la casilla "restore before re-erode" se elije la funcionalidad de este boton.
-Backup: No solo detecta automaticamente si ya existe un backup al abrir un archivo, sino que ademas estos ahora se guardan en el mismo directorio que el .exe con extension *.backup y se ha añadido una opcion para borrarlos dentro del menu "File".
-Menus de ayuda: Totalmente resideñados, son mas breves y sencillos.




lunes, 2 de mayo de 2016

Como ver si un audio mp3 ha sido re-codificado / Descubrir emisoras de radio piratas

No es la primera vez que encuentro un archivo de audio mp3 con un bitrate de 192kbps que al reproducirlo suena como uno de 64kbps. Esto ocurre cuando alguien coge un MP3 a 64kbps y lo recodifica a 192kbps, ya sea porque alguien piense que haciendo eso obtendra mejor calidad (a dia de hoy aun hay gente asi xd) o para "engañar" a los usuarios que descarguen ese audio.
¿Como podriamos saber si un mp3 ha sido recodificado a partir de un mp3 inferior?

Una caracteristica de MP3 (Y de practicamente todos los archivos de audio) es que elimina el espectro de audio que el oido humano no puede oir (o escucha con menor intensidad), en concreto los agudos, y conforme la compresion es mayor, este espectro de audio es menor, llegando a cortar demasiado los agudos a bajos bitrates.

Gracias a la aplicación Audacity podemos visualizar estos espectros, asi que realicé el siguiente experimento:
A partir de un archivo de audio .FLAC (losless, igual que en los CD audio) codifique una misma muestra en MP3 con diversos bitrates, y visualicé los espectros resultantes, que son los siguientes:

Vemos que a partir de un determinado bitrate, se corta a una determinada frecuencia:
19/16,5 kHz (variable) en un mp3 a 192kbps
16,5 kHz en un mp3 a 128kbps
15,5 kHz en un mp3 a 96kbps
11,5 kHz en un mp3 a 64kbps

Entonces... ¿como podemos saber si un audio esta recodificado? Si abrimos un mp3 a 360 kbps y en el espectro vemos que nunca supera los 16,5 khz, podremos deducir que ha sido recodificado a partir de un mp3 a 128kbps.

Como descubrir emisoras de radio piratas:

Con esto me refiero a emisoras de radio que en vez de emitir las canciones en sus CDs originales, las emiten a partir de un mp3 a 128kbps, por ejemplo (pirateado).
Pues bien, para grabar una emisora de radio fm en Audacity conectamos con un cable 3,5mm macho-macho desde la toma de auriculares de una radio a la toma de microfono del ordenador. Si teneis una tarjeta sintonizadora de radio en el ordenador, pues ese esfuerzo que os ahorrais.

Tras 15 minutos grabando el espectro de distintas emisoras de radio me encuentro con una emisora (no diré cual para evitar problemas xd) en la que se oye una canción y veo lo siguiente:

La canción acabó en el minuto 13:40. ¿A que bitrate decis que estaba la cancion mp3 que estaban emitiendo? Comentad ;) El primero que acierte se lleva premio.


sábado, 23 de abril de 2016

Experimento random: Que ocurre cuando desconectas la camara interna de tu telefono + Añadir tu logo transparente a un video con ffmpeg


Pequeño experimento realizado por puro aburrimiento en mi antiguo Nokia 5800.
En este experimento desarmo mi móvil, extraigo la cámara frontal del movil, vuelvo a armarlo sin la cámara, e intento hacer fotos con ella.

FAQs:
P: ¿Song name?
R: Darude - Sandstorm

P: ¿Como conseguiste el destornillador especial para nokia?
R: No lo conseguí, simplemente utilicé un destornillador linea de precisión, el cual sorprendentemente encajaba a la perfección.

P: ¿Volvía a funcionar la cámara tras volver a conectarla y rearmar el móvil?
R: Si

P:¿Porque la cámara tiene esa forma tan rara?
R: Lo que veis extraído es un modulo que se conecta a la placa base del móvil y lleva la cámara frontal, el detector de proximidad, y el conector del altavoz de llamadas, que es ese trozo de metal que veis también en la mesa

P: ¿Porque la cámara delantera y no la trasera?
R: En el nokia 5800 la camara trasera va soldada a la placa.

P: ¿Y esa foto tan cutre en la esquina?
R: Es otro pequeño experimento con ffmpeg, en el cual añado un PNG con transparencia a un video. El comando para añadirlo sería:
ffmpeg -i mivideo.mp4 -i miimagen.png -filter_complex overlay=0:0 salida.mp4
Aquí 0:0 son las coordenadas donde colocas la imagen, en este caso en la esquina superior izquierda.