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 :'')

miércoles, 16 de diciembre de 2015

Decodificador de imagenes JPG para Gameboy Advance

Descarga aquí.
Bueno, pues como sabreis la GBA no fue muy conocida por la calidad y cantidad de imagenes usadas en juegos. Esto es porque una unica imagen que ocupe toda la pantalla (240x160) sin comprimir ocupa  37 KB en modo 256 colores (baja calidad) o 74 KB a 32.768 colores (alta calidad, apenas usado). Por esto se me ocurrió crear el primer decodificador de ficheros JPG que permiten mostrar estos ficheros de imagen de alta calidad que no ocuparían mas de 15 KB en este formato a resolución nativa en una GameBoy.


Este ROM habría sido un gran adelanto para la consola. Lastima que en 2001 solo era un crio :')

Tenia pensado crear un programa que pudiera adjuntar vuestras propias imagenes al ROM, pero dudo que mas de 1 o 2 personas lo utilizasen, asi que lo abandoné.
En el zip teneis un ROM de 104 KB con 9 imagenes "random" en alta calidad que muestra la presentacion de imagenes junto a los *.jpg utilizados. Si mirais dentro del ROM con un editor hexadecimal comprobareis que estos *.jpg estan contenidos dentro del ROM. A continuación detalles tecnicos:


Resulta que hace unos días encontré el codigo para un decodificador de imagenes orientado a dispositivos embebidos (Como puede ser un marco de fotos digital) el cual era muy simple, y estaba orientado a procesadores con pocas capacidades como el Z80.
Se trata de TJpgDec y lo primero que se me ocurrio al verlo es que podia adaptarlo para hacerlo funcionar en la GameBoy (Plataforma con la cual ya estaba familiarizado) pero antes de intentarlo siquiera me di cuenta de que en la GBC la escasa paleta de colores, resolución, memoria, y potencia del procesador, iban a hacer del trabajo algo inutil.
Viendo esto, informandome sobre las caracteristicas tecnicas de su sucesora, la Game Boy Advance y sobre los distintos modos graficos que tiene, vi que en GBA todo cuadraba, y podria implementar sin problemas el primer decodificador de archivos JPG para GameBoy de la historia, usando para esto el compilador DevKit Advance r5 beta 3 compilando siempre con el maximo de optimizaciones (-O3).

Puestos al trabajo tuve que retocar el codigo de TJpgDec para que en primer lugar, no trabajase con archivos, sino con array de bytes con el contenido de los archivos JPG que se incluirian dentro del ROM, reemplazanto para esto todas las intrucciones como fopen() o fseek() por un codigo que haria su correspondiente funcionamiento en los arrays de bytes.
Cuando ya habia acabado y el codigo me habia compilado con exito vi que salian colores sin sentido y la imagen apenas se reconocia.

De los distintos modos graficos que tiene la GBA yo utilizo el modo 3.

Como el modo 3 trabajaba con pixeles de 16 bit usé el modo RGB565 del decodificador, pero me di cuenta de que la GBA no usaba RGB565, sino un BGR555 en el que deja sin usar el bit mas significativo de estos 16 bit (Apenas encontré documentación sobre los modos graficos). Por esto, otra vez me toco modificar el codigo de TJpgDec para que convirtiera a el espacio de color de la GBA tal y como se ve en la imagen.

El programa final compilado al maximo de optimizaciones (-O3) le lleva al procesador de la GBA unos 2-3 segundos para decodificar un archivo, es por esto que mi ROM de prueba se trata de una simple presentación de imagenes en la que el procesador trabaja siempre al 100% para cargar lo antes posible la siguiente imagen

jueves, 10 de diciembre de 2015

Bug grave en Lovoo: El like infinito

En esta ocasion y viendo que mi post vulnerabilidades de Badoo tuvo un existo mucho mayor del esperado, decidí crearme un perfil de la red social Lovoo solo para comprobar su seguridad como ya hice con Badoo, no obstante, tras varios test, la unica vulnerabilidad grave que encontré fue la siguiente:

Bug del like infinito (Fallo grave):

Al parecer recientemente cambiaron la interfaz de Lovoo añadiendo la funcion de dar likes a las fotos. Estas fotos guardan la referencia de las personas que dieron like y un contador de likes aparte que hace mucho mas simple las consultas a los perfiles de usuario a los servidores. No obstante, por un descuido de los desarrolladores, cuando pulsas el boton like en una foto el contador incrementa, pero si decides quitar el like, este no decrementa. Como resultado, si haces click repetidamente en el boton del like, puedes dar a esa foto los likes que quieras, incluso si la foto es tuya propia. Este proceso se puede automatizar con programas como Fiddler web debugger. Usando Fiddler, se podría automatizar el proceso durante horas si se quisiera (obteniendo miles y miles de likes), no esta del todo comprobado pero yo lo hice funcionar durante 10 minutos obteniendo mas de 1000 likes y no hay captchas ni nada que te detenga.

Captchas poderosos muy mal utilizados:
La version web de Lovoo utiliza un metodo de captcha muy poderoso de "reCaptcha" en el que el usuario debe seleccionar 2 o 3 fotos con muy mala calidad y a veces manipuladas que contengan lo que se le pide (Se permite seleccionar una imagen incorrecta como maximo). Este captcha solo se usa en las nuevas solicitudes de chat, los cuales tienen limite diario, lo cual convierte a este capcha en algo inutil.

A continuación os comento rápidamente otras vulnerabilidades menos importantes relacionadas con las fechas y horas, las cuales deberían estar ocultas al usuario:

Revelación fecha de creación de los usuarios:
Igual que ocurria con Badoo, en Lovoo el ID de usuario consiste en 24 cifras hexadecimales, de las cuales solo las primeras son la ID de usuario, siendo las ultimas una verificación para que la gente no vaya curioseando quien se creó la cuenta de Lovoo 5 segundos despues como si se podia hacer en Badoo. Estas IDs de usuario se crean secuencialmente permitiendo estimar cuanto tiempo lleva creada una cuenta.

Fechas y horas precisas:
Pero... La cosa no acaba aquí: Cuando la aplicación accede a un usuario, sus fotos tienen una fecha de subida y el usuario una fecha de ultima conexion entre otras fechas. Estas se muestra en la web con mensajes que dan muy poco detalle como "Hace un par de semanas" o "Hace una hora", pero si vemos la respuesta que ha mandado el servidor, dentro de la respuesta encontraremos parametros como "CreatedAt" en el caso de las fotos o "LastOnlineTime" en el caso de la fecha de ultima conexión, que contienen un numero.
Este numero es equivalente al entero de 32 bits que transformado en time_t es la fecha y hora GMT con precisión de un segundo.


martes, 8 de diciembre de 2015

Superresolution: Conseguir fotos de 20 MP con una camara de 5 MP ¿Merece la pena?

En este post, tras hablaros de los nuevos formatos de compresion de imagenes os voy a hablar de una forma para conseguir fotos de una resolución mayor a la que os permita vuestra camara mediante interpolacion cubica y mediante superresolution. Para ello yo usaré el programa GIMP.
Os muestro un detalle de la siguiente imagen sacada con la camara de un Iphone 4 (5 MP) aumentadas tras aplicarle los dos metodos.

Estos metodos, no obstante, no permiten obtener la misma calidad que si usamos una camara de mayor resolución, pero si dan una mejor impresion. En mi opinion estos metodos (y sobre todo el primero) no deberian usarse con frecuencia ya que suponen un desperdicio de memoria, ya que se obtienen fotos con mas megapixeles pero con una calidad inferior a una imagen obtenida a esos mismos megapixeles. No obstante, si por ejemplo se quiere obtener un fondo de pantalla con mayor calidad si que podria resultar util el metodo superresolution.


-Interpolación cubica: 
Como ya sabreis algunos, mediante la interpolación cubica es posible aumentar la resolución de una imagen prediciendo cuales serian los pixeles intermedios. Estos pixeles son "inventados" pero al añadirlos pueden dar una sensacion de mayor calidad de imagen.

En Gimp, cuando cambias el tamaño de una imagen, se hace por interpolación cubica por defecto.

-Superresolution:
Consiste en realizar varias fotos iguales (en los ejemplos uso 4 fotos), aumentarlas mediante interpolación cubica y superponerlas unas con otras, obteniendo mayor calidad que si solo aplicamos interpolacion cubica a una imagen.

Para aplicar superresolution en Gimp, se deben abrir las imagenes como capas, aumentarlas con interpolacion cubica, añadirles transparencia, y alinearlas manualmente.

-Conclusiones:
Vosotros mismos podeis ver y juzgar si existe diferencia entre la foto original y la foto con superresolution. Desde mi punto de vista el hecho de superponer varias fotos (superresolution) la mayor mejora que da a la imagen es reducir los pixeles "defectuosos" que obtenemos cuando una foto es demasiado oscura y la hacemos con una camara de un movil, pero tampoco puede hacer magia, y tal vez en vez de aumentar de 5 MP a 20 MP seria mas viable aumentar a resoluciones mas aceptables como 10 MP.

domingo, 29 de noviembre de 2015

¿Cual es el mejor formato de imagen? Buscando el futuro sucesor del JPG

Primero hablé de los nuevos y mejores formatos de audio, luego de los formatos de compresion de datos, y ahora para finalizar mis post sobre comparativas de nuevos formatos, voy a hablaros sobre como esta el tema en la compresión de imágenes:






Aquí podéis ver como queda una imagen PNG de 800x600 comprimida al mismo tamaño (24 KB) en varios formatos para que comprobéis vosotros mismos las diferencias.




Si os interesan las comparativas de estos codecs os recomiendo acceder al siguiente enlace:

http://xooyoozoo.github.io/yolo-octo-bugfixes


donde podéis comprobar vosotros mismos las diferencias de compresión de todos estos formatos de forma interactiva con gran variedad de imágenes.


Cuando apareció JPEG fue una revolución en cuanto a fotografía digital, ya que su calidad de compresión era muy buena. Mas tarde apareció una mejora de este llamado JPEG2000 que trabajaba de forma distinta a como lo hacia JPG. Esta mejora al ser muy poca, y no ser compatible con los anteriores decodificadores de JPEG, no adquirió mucha popularidad.

Mas tarde, de manos de Google llegó WebP, un formato de imagen orientado a la web y con una eficiencia notablemente mayor.
Este formato lo bueno que tenia es que era soportado de forma nativa por Google Chrome, no obstante es un formato que a los demás navegadores les esta costando aceptar al pertenecer a Google. Es por esto, que hoy dia hay muchas paginas web que detectan si el navegador que se esta usando es Chrome, Opera, o cualquier otro navegador compatible para cargar sus imágenes en formato WebP.
Cuando se detecta que el navegador no es compatible con WebP, las paginas cargan su equivalente en JPG con mayor tamaño de imagen (mas tiempo de carga) o menor calidad.

Por ultimo y gracias a Fabrice Bellard's (http://bellard.org/) también conocido por otros grandes proyectos como FFMPEG o QEMU, Apareció el año pasado un codec de imagen mejor aun basado en la codificación de los frames en el codec de video H265.
Este codec conocido como BPG (Better Portable Graphics) ya consigue una notable diferencia frente a JPEG, pero de momento ni los navegadores ni los visores/editores de imagenes quieren reconocerlo.
Por suerte, existe un pequeño fichero Javascript (también desarrollado por Fabrice) que permite visualizar estos archivos en cualquier navegador, y mostrar imágenes de este formato en cualquier sitio web.

Desde la aparición de JPG han aparecido multitud de formatos intentando superarlo y ganar popularidad. Ademas de los formatos que aqui os he enseñado existen otros mas como JPEG-XR o PGF pero ninguno de estos han ganado popularidad.
Con JPG pasa lo mismo que con MP3, son formatos que están desde siempre y aunque no son los mejores,  no nos importa usarlos en una época donde la memoria cada vez es mas barata.

Recordad que podéis comentar si tenéis alguna duda o queréis decir algo. No es necesario registrarse para comentar.

viernes, 4 de septiembre de 2015

Vuelve la aventura de Flappy... Esta vez en HTML5

Descarga el juego aquí.

El juego tiene soporte tactil y de teclado. En el teclado debeis usar las teclas de direccion izquierda, derecha, y arriba. En soportes tactiles podeis moveros pulsando a la izquierda o a la derecha inferior de la pantalla, ademas, si pulsais en la zona superior de la pantalla, tambien saltareis.

Bueno, pues como ya creo que comenté, mi juego de Gameboy "La aventura de Flappy" (Mas info aqui) tuvo menos descargas de las esperadas. Probablemente por la incomodidad de tener que usar emulador y lo basto que podia parecer a simple vista el formato GameBoy.
Pues ahora esta renovado, y para ello he utilizado un formato que aunque ahora no este muy de moda, parece que lo estará en el futuro, el formato HTML5 (Javascript).
Obviamente, Javascript utiliza compilacion en tiempo de ejecución, lo que significa que disponeis del codigo fuente, y no solo eso, sino que ademas esta comentado.
Aunque al inicio pone que es la versión 1.1, no penseis que aparecerán mas versiones. No tengo en mente seguir trabajando en el juego, sino que al ser codigo libre, os invito si os gustó el juego a hacerle modificaciones, editarle los niveles o incluso hacer una segunda parte del juego. (Siempre que me hagais referencia a mi, en el caso de que publicaseis una version modificada)

Mejoras de la versión 1.1 respecto a anteriores:

-El juego es compatible con muchos mas navegadores y dispositivos con los que no funcionaba la beta v.0.1, incluido IE.

-Los niveles han sido modificados en dos ocasiones, tanto en flores como en estructura para la v.1.0 y otra vez para la v.1.1, para darle mas emocion al juego.

-Con la versión 1.1, el juego ahora se adapta al tamaño de la ventana del navegador o la pantalla del movil.

-Con la version 1.1 El juego se detiene cuando el movil no esta en modo apaisado o el navegador no tiene el tamaño correcto, mostrando un mensaje.

-La pantalla de inicio de la versión 1.1 esta totalmente renovada, y ahora muestra unas instrucciones basicas del juego

Para la version 1.1, los menus iban a tener su propia música (On your own - Vibro DwarfsLMIX, Milk inc.) pero al final no se añadió para evitar que la aplicación ocupase mas memoria.

Versión 1.2 disponible junto con Flappy Adventure 2.
-Ahora flappy se inclina en los saltos
-Ahora la musica entra en bucle al terminar
-HUD del jefe final mejorado
-Mensaje del jefe final mejorado
-Jefe final ahora tiene sonidos
-...

viernes, 21 de agosto de 2015

Experimento casero: imprimir en B/N y recomponer en RGB

Hola de vuelta a todos. Este verano se ha notado mi ausencia por aqui, pero... ¿A quien le importa?
Bueno, pues queria traeros otro de mis experimentos caseros sin ninguna utilidad real para que os fascineis por la informatica (o al menos se os quite el aburrimiento durante 5 min).
Bueno, pues esta idea es producto de lo que pasa cuando se te acaba el cartucho de tinta a color en la impresora. Lo que hacemos en este "experimento" es imprimir una imagen en B/N 3 veces, correspondientes a los 3 canales rojo, verde y azul de las imagenes a color. Mas tarde escaneamos estas tres imagenes impresas en B/N, y recomponemos la 3 imagenes obteniendo la imagen a color.
Para ello se puede usar el Gimp, el cual si lo sabeis usar es intuitivo, pero si quereis realizar el experimento y teneis alguna duda podeis comentar aqui.
Basicamente lo que hacemos en Gimp es, con la imagen original vamos a la seccion de los canales rojo azul y verde y los arrastramos a la seccion capas. Las colocamos separadas, e imprimimos en B/N.
Despues de escanear, recortamos del escaneo tres capas del mismo tamaño con las tres imagenes en B/N. Para el siguente paso debemos estar en modo escala de Grises. Ahora si nos vamos a Colores>Componentes>Componer, podremos obtener la imagen resultante de componer los tres canales B/N.

En las imagenes podeis ver el experimento realizado con una foto del ayuntamiento de Hellín: Arriba del todo la imagen original, despues una foto de como quedaría el folio impreso en B/N y al final del post el resultado final al escanear y componer en RGB.



martes, 16 de junio de 2015

Actualizacion Insta-script

Bueno, pues recientemente empecé a seguir nueva gente en Instagram, y viendo que muchos no me seguian de vuelta, decidí organizar un evento en el que dejaría de seguir a todos los que no me siguieran de vuelta en un mismo día, a la vez que celebrariamos una fiesta al mas puro estílo hardcore. Se tarta de #UnFollowProjectFest2015.


Bueno, pues tonterías aparte, con mi reciente incremento de seguidos y seguidores en mi cuenta, me di cuenta al ejecutarlo, de que el instascript que hice tiene una gran limitación: Solo carga los primeros 200 seguidos/seguidores, ya que la pagina de texto plano de Instagram que carga los seguidos seguidores esta limitado a 200, dando un link a una pagina con los siguientes repetidamente hasta que ya no hay mas y no hay mas links. Bueno pues he actualizado el post y ahora si teneis mas de 200 seguidores/seguidos el script funcionará correctamente. Cualquier comentario o duda aquí.

sábado, 13 de junio de 2015

Transmitir datos por la toma de auriculares: archivos de cualquier tipo

Bueno, pues en el anterior articulo os enseñé como transmitir imagenes sin compresion a traves de la toma de auriculares con los defectos que esta transmisión analogica suponia (Desincronización, alteracion de los valores,...) por lo que no pasé de las imagenes en blanco y negro sin compresion. No obstante, aprovechando que tenia un par de dias de descanso entre los examenes finales, analicé las limitaciones que esta transmisión analogica de audio me suponía, y decidí buscar una forma de transmitir datos digitales de forma fiable y a una velocidad aceptable.
Pues lo conseguí, despues de analizar el comportamiento de las señales de audio analogicas de la entrada de audio, conseguí crear un codificador y un decodificador de archivos que permiten transmitir cualquier tipo de archivo de forma fiable (y con sincronizacion) a una velocidad de hasta 48kbps (con una señal de audio a 48Khz con mis equipos).
Esta forma de transmitir los datos es haciendo variar la señal de audio de 1 a -1 en intervalos muy pequeños transmitiendo los datos de forma binaria. Esto es distinto a por ejemplo como se codificaban los datos en cassetes de ZX Expectrum o similares, los cuales al codificar en medios mas sensibles como son los cassetes, utilizaban tonos (a una velocidad de datos mucho menor). Os adjunto los programas con... Atencion... El codigo fuente (Es la primera vez en la historia de mi blog que adjunto un codigo fuente, sin contar scripts linux).
Podeis decargar todo aquí. Dentro del zip hay un fichero con instrucciones detalladas sobre el uso.

Por ultimo recomiendo transmitir los archivos siempre comprimidos (en zip por ejemplo) ya que los valores altos o bajos continuados hacen que la señal acabe cayendo (Como se puede apreciar en la imagen), lo cual puede arruinar la transmision.

Cualquier duda o comentario aqui me teneis ;)

sábado, 6 de junio de 2015

Transmitiendo datos (imagenes) por la toma de auriculares

Bueno, pues lamentablemente aqui teneis otro articulo chorra de los que se que no os interesan XD
Si leisteis el articulo en el que imprimí canciones en formato PCM en un folio, este se trata del experimento a la inversa. Lo que hago es transmitir una imagen a traves de la toma de auriculares, la cual como sabeis trabaja con audio analogico, por lo que usaremos imagenes sin comprimir (*.BMP)

-Procedimiento:
¿Como lo haremos? Lo primero es pasar la imagen a transmitir en formato jpg o png (o el que sea) a formato BMP, ya sea abriendolo con Paint, Gimp, o vuestro programa favorito, para pasarlo a BMP.
Ahora conectamos dos equipos toma de auriculares con toma de entrada (Usando un cable de auriculares 3,5mm macho-macho). Yo en mi caso utilizo de equipo emisor una Raspberry-Pi (mas tarde un radio-cassete-cd) y de receptor mi portatil. Ahora en el equipo receptor debemos grabar la transmision, en Audacity por ejemplo, y en el emisor reproducir la imagen BMP como audio RAW sin comprimir (Unsigned 8bit PCM dará los mejores resultados). Ahora, creamos un archivo BMP usando la cabecera de archivo del archivo emitido, y mediante un editor hexadecimal como Hex Workshop, insertamos el contenido grabado con la toma de entrada (el cual deberiamos haber grabado en un archivo PCM U8) en el contenedor BMP.

-Resultados:
El primer problema que vemos con este experimento es la desincronización, aunque la tasa de bits es igual en los dos equipos, hay una ligera diferencia, la cual al no haber ningun modo de sincronización no se puede evitar. Esto hace que sea imposible transmitir una imagen en RGB, ya que se distorsionan los colores como podeis ver en la imagen de ejemplo mas adelante.

El segundo problema es el contraste. Al no conservar en la grabacion y la emisión el mismo volumen de audio, los resultados son que hay distintos niveles de color/BN.

Aunque he realizado el experimento con varias imagenes os dejo las 2 mas relevantes:

La primera es de una imagen de ejemplo de Windows, a la cual bajé bastante la resolución y transmití a 16.000 Hz desde la Raspberry-Pi. Como veis, incluso a bajos rates de audio, es imposible evitar la desincronizacion y los colores salen alterados. Si queremos obtener resultados buenos debemos utilizar imagenes B/N.

La segunda, es una imagen obtenida esta vez desde un radio-cassete-cd domestico. Grabando en un CD-RW un disco de audio con la imagen RAW, y mas tarde conectando la toma de auriculares del radio-cassete-cd a la entrada de audio del ordenador, conseguimos transmitir la imagen desde el cd (el cual lee el radio-cassete) a nuestro ordenador. De esta forma, ademas de estar limitados a usar 44.100 Hz (tasa de bits de los CD de audio), la calidad de la imagen, incluso en B/N, es inferior, ademas de que la sincronización tambien es peor, por lo que tuve que reajustar la imagen en Gimp, ya que salia torcida. En cualquier caso los resultados los podeis ver vosotros mismos, tampoco sale muy mal. En fin, cualquier comentario o duda aquí ;)


Imagen original:






Imagen obtenida desde la toma de auriculares del radio-cd

viernes, 22 de mayo de 2015

(OBSOLETO) Como saber quien no te sigue de vuelta en Instagram

Bueno, pues en esta ocasión, he hecho este script por peticion de una amiga, ya que como sabréis en la mayoria de los casos mis articulos los hago buscando llamar vuestra atención, no porque me pidáis por ejemplo como hacer las descargas de internet mas rapido, sino porque yo me adelanto a vosotros (porque os interesa todo lo que publico ¿a que si?).

En este caso se trata de un shell script para linux que igual que el script para hackear vendecookies esta basando en wget y comandos linux de edicion de texto.

Este script lo que hace en primer lugar es obtener el ID de usuario (un numero) asociado al nombre de usuario. Para ello y para ahorrarnos un poco de trabajo, el script accede a una pagina web de un tercero "jelled.com" que a partir de un nombre de usuario nos obtiene el ID de usuario.

Para obtener la lista de seguidores y seguidos, el script manda una peticion web a instagram como si estuviesemos usando la version movil (recordemos que en modo escritorio Intagram no deja ver los seguidores).
Estas listas son almacenadas en el ordenador (ya de paso) y mas tarde son procesadas para obtener en primer lugar los usuarios que sigues y no te siguen, y los usuarios que te siguen y no sigues.

Por ultimo aclarar que no es necesario introducir la contraseña, y este script se puede utilizar con cualquier usuario que querais, no solo el vuestro.
Este script no funcionará si teneis el usuario privado
En esta ocasion dado que es un simple shell script, en vez de subirlo a Google drive os lo dejo aqui a continuación. Si no teneis Linux y quereis saber vuestros resultados me podeis escribir un comentario en el post y lo puedo ejecutar por vosotros.

echo Introduce usuario instagram:
read us
usid=`wget 'http://jelled.com/ajax/instagram?do=username&username='$us -q -O -| awk -F '"id":"' '{print $2}' | awk -F '"' '{print $1}'`

wget http://instagram.com/api/v1/friendships/$usid/followers/ -q -O - | awk -F 'username":"' '{ i=2; do {print $i; i ++} while ( $i > 0) }' | awk -F '"' '{print $1}' > seguidores.txt
maxid=`wget http://instagram.com/api/v1/friendships/$usid/followers/ -q -O - | awk -F 'next_max_id":' '{print $2}' | awk -F '"' '{print $2}'`
while [ ! -z $maxid ]
do
wget 'http://instagram.com/api/v1/friendships/'$usid'/followers/?ig_sig_key_version=5&max_id='$maxid -q -O - | awk -F 'username":"' '{ i=2; do {print $i; i ++} while ( $i > 0) }' | awk -F '"' '{print $1}' >> seguidores.txt
maxid=`wget 'http://instagram.com/api/v1/friendships/'$usid'/followers/?ig_sig_key_version=5&max_id='$maxid -q -O - | awk -F 'next_max_id":' '{print $2}' | awk -F '"' '{print $2}'`
done

wget http://instagram.com/api/v1/friendships/$usid/following/ -q -O - | awk -F 'username":"' '{ i=2; do {print $i; i ++} while ( $i > 0) }' | awk -F '"' '{print $1}' > seguidos.txt
maxid=`wget http://instagram.com/api/v1/friendships/$usid/following/ -q -O - | awk -F 'next_max_id":' '{print $2}' | awk -F '"' '{print $2}'`
while [ ! -z $maxid ]
do
wget 'http://instagram.com/api/v1/friendships/'$usid'/following/?ig_sig_key_version=5&max_id='$maxid -q -O - | awk -F 'username":"' '{ i=2; do {print $i; i ++} while ( $i > 0) }' | awk -F '"' '{print $1}' >> seguidos.txt
maxid=`wget 'http://instagram.com/api/v1/friendships/'$usid'/following/?ig_sig_key_version=5&max_id='$maxid -q -O - | awk -F 'next_max_id":' '{print $2}' | awk -F '"' '{print $2}'`
done

seguidos=`cat seguidos.txt | wc -l`
seguidores=`cat seguidores.txt | wc -l`
echo
echo USUARIOS QUE SIGUES Y NO TE SIGUEN
echo -----------------------------------
echo
for (( i=1 ; i <= $seguidos ; i++ ))
do
us=`sed -n "$i"p seguidos.txt`
if [ -z `grep "$us" seguidores.txt` ]
then
echo $us
fi
done
echo
echo USUARIOS QUE TE SIGUEN Y NO SIGUES
echo -----------------------------------
echo
for (( i=1 ; i <= $seguidores ; i++ ))
do
us=`sed -n "$i"p seguidores.txt`
if [ -z `grep "$us" seguidos.txt` ]
then
echo $us
fi
done