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.

domingo, 17 de abril de 2016

Como crear un video a partir de un GIF y un audio para subirlo a Youtube (Por ejemplo)

Bueno, pues en esta ocasión os traigo un shell-script para windows (Archivo .bat) que si tenéis descargado el programa FFMPEG y lo colocáis en el mismo directorio en el que tenéis el ejecutable, os permitirá obtener un vídeo con un GIF que se repite el tiempo que queráis con el audio que queráis de fondo.


Versión nueva optimizada 2018:
Para crear el archivo .bat debéis abrir el bloc de notas y pegar el contenido a continuación:

@echo off
cls
echo INTRODUZCA GIF
ECHO _______________
set /p gif="-> "
echo.
echo INTRODUZCA CANCION
ECHO ___________________
set /p cancion="-> "
echo.
echo INTRODUZCA FRAMERATE PARA EL VIDEO
ECHO __________________________________________
set /p rate="-> "
ffmpeg -r %rate% -i %gif% -filter_complex "loop=-1:32767,setpts=N/%rate%/TB" -i %cancion% -acodec copy -shortest salida.mkv

Lo guardáis con extensión .bat y lo ejecutáis.
Os preguntara que introduzcáis el GIF y la canción. Para ello, basta con arrastrar el archivo a la terminal y pulsar intro, o si se encuentra en el mismo directorio también podéis escribir su nombre.
También os pregunta el framerate, para que podais elegir la velocidad a la que quereis que se reproduzca el GIF. Poned un valor numérico como por ejemplo 24. A mayor valor mas velocidad.

Versión antigua 2016:
No hagais caso a esta versión, la conservo solo por motivos historicos.

@echo off
cls
echo INTRODUZCA GIF
ECHO _______________
set /p gif="-> "
echo.
echo INTRODUZCA CANCION
ECHO ___________________
set /p cancion="-> "
echo.
echo INTRODUZCA DURACION VIDEO (Sec / Min:Sec)
ECHO __________________________________________
set /p dura="-> "

del temp.ts temp.mp4 salida.mp4
ffmpeg -i %gif% -c libx264 -preset ultrafast -qp 0 -g 0 -r 60 temp.ts
ffmpeg -stream_loop -1 -i temp.ts -t %dura% -preset veryfast temp.mp4
ffmpeg -i %cancion% -i temp.mp4 -c copy -shortest salida.mp4
del temp.ts temp.mp4

Ahora lo guardáis con extensión .bat y lo ejecutáis.
Os preguntara que introduzcáis el GIF y la canción. Para ello, basta con arrastrar el archivo a la terminal y pulsar intro, o si se encuentra en el mismo directorio también podéis escribir su nombre.
También os pregunta la duración del vídeo, que será lo máximo que dure el vídeo: Si introducís un tiempo menor a la duración del audio, el vídeo solo durará ese tiempo. Si introducís un tiempo mayor al audio, el video resultante tendrá la duracion que tenga el audio. Si esto es lo que queréis, introducid 5 segundos mas de lo que dura el audio por ejemplo, ya que el tiempo introducido sera el tiempo de vídeo a codificar.
Por ejemplo: si tenéis una canción de 3 minutos e introducís 50 minutos, el vídeo resultante tendrá 3 minutos pero el ordenador se quedará procesando durante muchísimo mas tiempo que si ponéis 3:05.

Aqui teneis un ejemplo obtenido con el script y este GIF:


A continuación detalles técnicos para informáticos:

En las ultimas versiones de FFMPEG se introdujo la opción -stream_loop para hacer un bucle con la señal de entrada y asi obtener una señal de salida en bucle. No obstante, esta función es nueva y tiene un gran problema, y es que no procesa nada, simplemente copia y pega el contenido del archivo sucesivamente. Esto significa que esta señal de entrada para que funcione, debe estar en formato *.ts y no debe contener i-frames (opción -g 0).
En este script, se pasa el archivo GIF a un archivo de vídeo .ts temporal con el contenido sin perdidas o lossless (opcion -qp 0), el cual va a ser la entrada en bucle del vídeo temp.mp4 a obtener durante el tiempo establecido. A este video finalmente se le añade el audio y obtenemos la salida.

Mis programas de hacker ❤

Tanto para hacer mis pequeños experimentos de informática como para usos mas importantes, hay gran cantidad de programas a los que uno se acostumbra, y que si por alguna razon se me formatease el ordenador o simplemente me lo cambiase, lo primero que haría sería instalarmelos de nuevo.

En este post quiero compartir con vosotros programas que seguramente no conozcáis y a los que yo en gran cantidad de ocasiones he dado mucha utilidad. Pienso que esto puede ser de gran interés para vosotros, no voy a enumerarlos todos, pero si a los que no podrían faltar en mi equipo:

Multimedia:

VLC: Gran conocido par muchos de vosotros, actualmente es la mejor alternativa de reproductor multimedia por todas sus opciones y características, y aun mas teniendo en cuenta que últimamente reproductores como Windows Media player le tienen fobia a los nuevos formatos como OGG Vorbis o H265.

Audacity: Este programa en realidad no es tan desconocido. Me sirve entre otras cosas para grabar desde el micrófono con gran cantidad de opciones, para detectar grabaciones de audio en ROMs, o simplemente sonidos RAW dentro de los archivos con la opción "importar audio en bruto", y como no, su función principal: para hacer cualquier tipo de edición de audio, desde las mas simples como acelerar velocidad, ritmo o volumen, recortar el audio, hasta opciones mas complejas como eliminación de ruido o filtrar las voces en las canciones.

FFmpeg: Este programa a pesar de funcionar exclusivamente en linea de comandos... Es lo mejor que existe en cuanto a multimedia. Os explico: De forma resumida, este programa permite convertir cualquier formato de audio, imagen, o vídeo, a cualquier otro con la calidad que se quiera, con gran cantidad de opciones de filtro (como cambiar la velocidad del audio, cambiar la resolucion del video, invertir video horizontalmente,...) Tambien puede importar/exportar multimedia desde internet ya sea por http ,rtmp,.... desde dispositivos de hardware como la webcam... ¡Lo hace todo! Con el hasta se puede convertir un video mp4 a GIF... O viceversa, como os quiero explicar en mi proximo post ;)

Compresión:

7zip: ¿De verdad no lo esperabais? No solo permite comprimir en 7z, sino que a la hora de comprimir en formato ZIP es el programa mas eficiente y permite descomprimir gran cantidad de archivos, como los *.DEB, los *.IMG,... Incluso puede extraer archivos de algunos .EXE autoextraibles.

WinRar: vale... ¿Y para que necesito WinRar instalado teniendo 7zip? Aunque 7zip me permita descomprimir los RAR, WinRar es el único programa capaz de comprimir en RAR debido a su licencia. 7zip va mejor, vale, pero tampoco viene mal tener instalado una alternativa ;)

Offzip: Pues este es otro programa que solo funciona en linea de comandos. ¿Que hace? Imaginaos que teneis un archivo de una aplicación Shockwave, un firmware de un aparato (como los de LG) ... Lo que sea, lo abris en un editor hexadecimal por ejemplo y no veis nada ademas de bytes dispersos, lo que parece contenido comprimido. 7zip no lo va a abrir, porque el contenido comprimido no es el archivo... Esta dentro del archivo. Offzip lo que hace es buscar dentro de archivos contenido comprimido en zip o deflate. Muchas veces solo os sacará archivos de pocos bytes con m**rda, pero si realmente ese fichero tiene contenido comprimido, lo sacará sin errores.

Imagenes y unidades de disco:

OSFMount: Olvidaos de Daemon Tools y todo ese rollo que siempre buscais tutoriales de como piratear. Este programa es gratuito, y sirve no solo para montar imagenes ISO como dispositivo virtual. Tambien permite montar imagenes de discos duros (ejemplo imagenes IMG), ya sea como solo lectura o tambien de escritura como si estuviesen conectados al ordenador. Tambien os permite montar unidades virtuales... ¡En la RAM! Puedes por ejemplo reservar 1 GB de RAM a una unidad virtual cuyos archivos se leeran y escribirán, como no, a una velocidad enorme, y cuando ya no te valga lo que tengas alli, desmontarla, y recuperar la RAM.

Recuva: Explora el sistema de archivos de un disco duro o pen drive en busca de archivos eliminados que se puedan recuperar. Te permite incluso recuperar información borrada de una unidad formateada.

ISOBuster: Sirve entre otras cosas para explorar archivos de imagen, ver y extraer sus archivos, ver que sectores ocupan sus archivos, propiedades,... Tambien sirve para extraer ficheros desde CDs dañados. Esto me fue muy util con un CD en el que tenia dos copias en muy mal estado con gran cantidad sectores irrecuperables en cada uno (Casi siempre sectores distintos). Gracias a un programa que hice en c y a Isobuster, pude recuperar el 99,9% del contenido.

Imagenes (Me refiero a dibujos/fotos):

Gimp: Muchas veces he tenido la intención de pasarme a Photoshop por el hecho de que lo veo mas profesional, pero de momento sigo usando Gimp, ya que es el programa al que estoy acostumbrado y a fin de cuentas lo hace practicamente lo mismo que photshop.

BPG: Herramientas de codificación y decodificación de ficheros BPG. No me hace mucha utilidad actualmente, pero considero que tampoco hace ningun mal tenerlo. Como visteis en la comparativa, es un formato de imagen que comprime mejor que JPG.


Internet y redes:

Axel: Acelerador de descargas que funciona en terminal del cual ya hablé en este otro post.

Miniweb: Si buscais un servidor web para publicar contenido en internnet probablemente opteis por Apache o similares. Pero si lo que quereis es simplemente un servidor web pequeño para vuestras probaturas, que no necesite ficheros de configuración, al que únicamente le pasais la carpeta raiz por consola de comandos (funciona en consola) Miniweb es una buena opcion. Por alguna razon solo esta disponible para Windows.

Fiddler: Ademas de capturar el trafico http como haria Wireshark, Fiddler lo muestra de una forma mas "limpia", ya que funciona mediante un proxy interno y simplemente muestra el contenido de las respuestas http, pudiendo mostrar el contenido en formato texto, imagen,.. Ademas de poder descargar los elementos web obtenidos en un archivo.
Otra de las funciones mas potentes de Fiddler, es la de poder programarlo para sobreescribir ciertas respuestas web con otras que tu le indiques. Por ejemplo: Lo puedes programar para que todas las imagenes provenientes de la URL: www.google.es sean una imagen que tienes almacenada en tu ordenador.
Ademas, puede mostrar y descifrar respuestas https y capturar trafico de otros dispositivos si les configuras un proxy hacia la IP de tu ordenador.

Wireshark: Este es un clasico, permite analizar el trafico de red, mostrar el contenido del trafico, mostrar estadisticas, etc,etc.

Putty: Para realizar conexiones SSH y Telnet.

WinSCP: Para manejar archivos remotos en servidores SFTP, SCP,...

Otros:

Notepad++: Al contrario que el Notepad clasico de windows, si abres un fichero binario para cambiar una linea de texto, no te destroza el archivo. Ademas, es muy intuitivo cuando abres un fichero con codigo, ya que te colorea los distintos elementos para poder diferenciarlos facilmente. Es el editor de texto que utilicé cuando hice el codigo de mis ROMs de GameBoy.

HexWorkshop: Todo jakar debe tener instalado un editor hexadecimal. Este es el que uso yo. Entre otras cosas permite aplicar operaciones aritmeticas a los bytes seleccionados de un archivo (ej: incrementar en x, invertir,...) permite visualizar los archivos como mapa de bits, comparar archivos (herramienta muy potente), extraer cadenas de texto, o simplemente hacer busquedas dentro del archivo.

jueves, 14 de abril de 2016

Como ocultar o quitar la publicidad del reproductor de música SCM player

Lista de reproducción actualizada b*tx!!
Y en esta ocasión después de tener mi reproductor tanto tiempo (desde que abrí mi blog) y con el reciente incremento de visitas, llegó la hora de darle una mejor imagen quitando la molesta publicidad que aparecia en el reproductor de música.

Por si habia alguna duda al respecto de esta, la publicidad que veiais no me beneficiaba a mi de ninguna manera, sino que era la manera de financiar el mantenimiento de los servidores del reproductor SCM.

Pues bien, a pesar de esto SCM es de codigo abierto, y por lo tanto la manera que proponen de tener el reproductor sin publicidad es descargando el codigo fuente, realizandole los cambios necesarios para quitarla, y alojandola en un servidor propio.

Pero no todo el mundo tiene su propio servidor a disposicion de los visitantes del blog, por eso yo he aprovechado una vulnerabilidad de los temas, si se le puede llamar asi, que consiste en aprovechando todas las posibilidades que me ofrece CSS (Lenguaje en el que estan codificados los temas) mover el campo de visión de la publicidad por debajo de la pantalla donde no se puede ver. ¿Que significa esto? significa que la publi se descarga, ya que CSS que es un lenguaje orientado a la interfaz y no puede hacer nada al respecto, pero en cambio, CSS si me deja ocultarla, y eso es lo que he hecho, simplemente añadiendo las lineas

#playlist .odd{bottom:-250px !important;} #playlist .items{bottom: 0 !important;}

al final del CSS. Lo primero hace que las entradas de la lista impares, lo que incluye la publi (tengo un numero de canciones pares) se desplace 250 pixeles por debajo de la pantalla (250 es la altura del anuncio) y lo segundo estira la lista de reproducción hasta la parte de abajo de la pantalla llenando el hueco vacio. Para asegurarme de que esto va a ser siempre así y no va a ser sobreescrito por ningun otro CSS les pongo !important al final.

Pues bien, simplemente he partido del tema cyber, le he añadido las dos lineas, y he subido mi tema CSS resultante a Google Drive. desde ahi le comprimo la url con bit.ly y... ¡Aqui esta el resultado! SCM player sin publicidad ;)

lunes, 4 de abril de 2016

El mejor formato de compresion del mundo (desarrollado por mi) es un fracaso :')

Hace ya tiempo publiqué un post en el que me adelantaba a deciros que estaba desarrollando un formato de compresión que combinaría rar, 7z y flac (este último fue descartado) para conseguir los mejores resultados de compresión hasta el momento. Bien... Aunque en Enero ya estaba terminado, por motivos académicos he tenido el blog un poco abandonado últimamente.

En el formato *.mc el compresor separa un fichero en varios fragmentos del mismo tamaño y les aplica a cada uno compresión rápida en cada uno de los formatos (rar y 7z) para determinar cual es el mas potente con ese fragmento de archivo. Una vez hecho esto, todos los fragmentos que se comprimen mejor en 7z se unen en un único archivo, lo mismo con los fragmentos para rar. Estos archivos se comprimen con máxima compresión y se unen al fichero mc... Va, lo veréis mejor con una imagen:





Y ya que estamos también os adjunto el formato de la cabecera que decidí utilizar para mc:


El formato fue un fracaso, por lo que no os adjunto ni el compresor ni decompresor (A menos que realmente tengáis interés en este proyecto y me lo pidáis por comentario) ya que aunque en la teoría todo cuadra, en la practica usar varios formatos a la vez y separar el archivo en fragmentos muchas veces complica las cosas a los compresores, ya que entre otras cosas se pierde eficiencia debido a la localidad espacial. No solo eso, sino que ademas en muchos archivos, la compresión 7z ofrece mejor compresión en todos los fragmentos, haciendo que mc sea equivalente a comprimir en 7z añadiendo una cabecera adicional que aumenta el espacio.

Hice la prueba con el rom de Super Mario 64 y el buscaminas de Windows XP y estos fueron los resultados:

SM64
Tamaño original: 8192 Kb
RAR: 5726 Kb
7z: 5567 Kb
Mc: 5534 Kb

Winmine.exe
Tamaño original: 120.320 bytes
RAR: 63.646 bytes
7z: 66.762 bytes
Mc: 61.423 bytes

Ah... Se que es algo que se suele dar por hecho, pero todos los archivos comprimidos en mc son descomprimidos sin problemas.

Os adjunto el fichero winmine.mc por si queréis echarle un vistazo a la estructura, aunque si lo haceis os comento que en vez de usar 7z he usado xz que viene a ser lo mismo pero para un único archivo y con menos cabecera. Recordad que me podéis comentar abajo lo que queráis. Yo me quedaré aquí llorando un poco :'')