Blog enfocado a la informatica y a la tecnología. Escrito de una forma amena y sencilla de forma que todos los que tengais cierto interes por la tecnología, podais entender.
sábado, 29 de abril de 2023
Instagram: ¿Quien te deja de seguir? ¿Quien no te sigue de vuelta? Vuelve Insta-Script
domingo, 26 de febrero de 2023
Grabando video en un diskette. Evolución de los formatos de video (AV1 y H266)
¿Quien no se acuerda de los diskettes?
jueves, 2 de febrero de 2023
Creando un computador mecánico programable de un reloj digital (sin electrónica)
¡Feliz 2023 frikazos!
Lo primero de todo, quería disculparme por adelantado por este post, ya que es una 💩 pero algo había que escribir en el blog para que no vaya cogiendo polvo.
Como sabéis, los primeros computadores de la historia no usaban electricidad, eran puramente mecanicos. Ej: La maquina "Bombe" para descifrar Enigma creada por Alan Turing, de la cual no hay mucho más que explicar ya que hay una peli y to'
miércoles, 13 de abril de 2022
Invocando la API de Instagram: Como reaccionar con emojis customizados
Tal vez algunos recordareis cuando invocaba manualmente la API de Badoo hace unos cuantos años para realizar acciones que no estaban permitidas desde el frontend, como poner intervalos de edades no permitidos, descripciones extra-largas...
Pues en esta ocasión vamos a intentar hacer algo parecido con Instagram. Como sabréis, las reacciones a las historias que permite el frontend de Instagram son solo 8. Pero... ¿Y si os digo que podéis usar cualquier emoji, como mis famosas estrellitas? Para esto vamos a analizar la llamada a la API que realiza la versión web de Instagram cuando reaccionas a una historia:sábado, 26 de marzo de 2022
Buffer overflow en Los SIMS 2 (Nintendo DS)
El juego de Los SIMS 2 para Nintendo DS tiene un bug en uno de sus minijuegos que hace que el tamaño del bolsillo de objetos se haga negativo, o exceda el máximo de 6 objetos. Hasta el día de hoy despues de 15 años, ese bug era únicamente conocido por corromper partidas guardadas, haciendo crashear el juego, y la recomendación era no jugarlo.
Pero en mi caso, tras descubrir de la existencia de ese bug, pensé... Es un buffer-overflow, tal vez pueda usarlo a mi favor si lo investigo. ¿De verdad nadie lo había intentado antes? No estamos hablando de un juego homebrew del tío Paco jugado por 20 personas, estamos hablando de una leyenda como son los SIMS.
Pues resulta que explotando el bug correctamente, podemos escribir en las direcciones de memoria del juego que queramos (dentro de unos limites), o introducir los objetos con el identificador que queramos dentro del bolsillo, incluyendo objetos nunca antes vistos. Para no aburriros, lo he resumido en 2 vídeos, para que veáis que me lo he currao'
jueves, 3 de febrero de 2022
Practicando con Excel: Estadisticas COVID y juegos cutres
Pues hacía bastantes años que no usaba Excel para nada. De hecho creo que no lo usaba desde antes de la universidad, así que ya iba siendo hora de repasar un poco, ya que a fin de cuentas es una herramienta muy útil para administrar información, cálculos, y tal.
Lógicamente empecé repasando los estilos de celdas, luego pasé a las funciones (Que es la parte más interesante de el programa), luego estuve viendo como se podían obtener datos externos, las tablas dinámicas, y finalmente los macros en Visual Basic.
En resumen, que en una semana he pasado de ser un inculto del Excel a un semi-experto XD
Y bueno, y os preguntareis, ¿a que viene este post? Pues quería compartiros 5 de los proyectos que hice en Excel esta semana para practicar ya que creo que os podrían interesar. Los ordeno de mas simples a más complejos para que no perdáis la emosion al leer hasta el último momento:
1. Estadisticas del COVID en tiempo real (Descarga)
Tal cual, este archivo Excel (sin macros) tiene un origen externo de datos a un CSV de datos oficiales del COVID que se actualiza periódicamente en la URL https://cnecovid.isciii.es/covid19/resources/casos_tecnica_provincia.csv que Excel descarga al abrir el documento.
Como veis genera tabla y gráficos donde muestra el incremento de casos de COVID diarios, y el total acumulado en el periodo y provincia(s) que nosotros queramos filtrar
domingo, 30 de enero de 2022
Aprender a hackear con Juan: 2 canciones en una (Audio oculto)
¡Feliz año nuevo 2021 y 2022 folouers!
A quien no le ha pasado (ironía) que de repente escucha una canción tan clásica como el Nothing Else Matters de Metallica en el altavoz mono de su movil, o en un ya obsoleto CD de audio (grabado por un mal amigo) y va a conectar los auriculares para escucharla mejor y... pum! toma pokazo del bueno!
Esto te podría ocurrir no solo en un moderno smartphone o reproductor de MP3 (tan fáciles de hackear) sino también en un reproductor de CDs de hace 30 años.
¿Que clase de brujería es esta? Os los explico ;)
Las canciones normalmente tienen dos canales estéreo: izquierdo y derecho, que suelen tener señales de onda casi idénticas. A la hora de reproducir estas canciones en dispositivos que solo tienen un altavoz (mono) lo que hacen es combinarlas obteniendo una sola. Esta operación es muy simple: simplemente calcula el promedio de la muestra de los dos canales en un momento dado. Pero ¿que pasa si creamos un audio "hackeado" en el que el valor de un canal es el inverso del otro? Al invertir un canal de audio, este sonará igual, pero al intentar reproducir el audio resultante en un único altavoz, el promedio de ambos canales siempre será 0 (cero), es decir... ¡No oiremos nada!
¿Y si a ese audio "silenciado" le añadimos de fondo otra canción sonando tan solo al 3% del volumen de la otra? Lo vereis mejor en Audacity:
Gracias por vuestros no-comentarios, mis seguidores inexistentes. Os quiero ❤️
jueves, 24 de diciembre de 2020
Mis proyectos abandonados ven la luz: JMusic y Flappy Adventure X
¡Feliz navidad followers! No me he olvidado de vosotros (bueno, un poquito sí) os dejo un post para acabar este increíble e inolvidable 2020 que estoy seguro de que vosotros también pensáis que ha sido el mejor año que hemos tenido nunca
Imagino que leísteis mi anterior articulo sobre mis proyectos abandonados JMusic y Flappy Adventure 3Pues bien, ¿que ha pasao'?
JMusic:
Finalmente y gracias al tiempo libre de la cuarentena fue terminado antes de cumplir 1 año en desarrollo. No quedó muy distinta a la aplicación que visteis en el screenshot del primer articulo, y tal y como tenía planeado, se quedó para mi uso privado (de hecho la uso muy frecuentemente).
Flappy Adventure X:
Link al GitHub Descargar ISO PSX
No, no me he equivocado con el título. El proyecto de Flappy Adventure 3 tomó un cambio de rumbo para la que es la última aventura de Flappy (que ya era hora de terminar con la saga).
Todo empezó cuando me di cuenta, tras jugar de nuevo al primer Flappy Adventure web de 2015, de que la mecánica de plataformas 2D de Flappy tenía mucho potencial si se desarrollaba correctamente.
Flappy Adventure 2 es un gran juego, y lo seguirá siendo; pero un sucesor mas avanzado también en 3D conllevaría moverme a Unity, o hacer un mayor esfuerzo en Three.js.Dicho esto, quise cumplir mi objetivo con FA3 de usar más objetos dinámicos pero en una versión 2D que me llevase menos tiempo desarrollar, y que me permitiese con una mayor calidad final. En esta ocasión ademas, quise volver a los orígenes de Flappy Adventure: las videoconsolas retro.
Pensé en la GameBoy Advance, con la cual ya había trabajado, en la Sega Genesis (descartada porque segúramente me tocase programar en ensamblador del 68000). Pero... ¿y por que no ir un paso más adelante y trabajar en un scroller 3D en una videoconsola de 5ª generación? (Sega Saturn, PSX, Nintendo 64). Descubrí (Y probé) un motor muy sencillo y facil de usar en C para la Saturn, que tenía fama de ser difícil de programar, pero me daba pereza en cualquier caso, y no hice na'... Hasta que me regalaron una PS1 chipeada... (El anterior post sobre ensamblador en PSX no fue casualidad)
La cosa había cambiado, iba a poder probar mi código en hardware real, y en una videoconsola que fue muy popular. Tras analizar los SDKs me quedé con el oficial: PSYQ. Pero la cosa solo acababa de empezar. Me iba a tocar aprender el hardware de la PS1: como trabajar con su GPU, su SPU, el lector de CD, las memory card, el GTE para los graficos 3D,...
Capitulo 1: Mis experimentos en PSX
Empecé con ejemplos chorras, como portar mi motor Voxel de GameBoy Advance a PlayStation, pero en esta ocasión con infinitos angulos de rotación. ¿¿Como?? (La PSX no va sobrada de potencia, y un motor software acaba con la poca que tiene)
Resulta que usando la GPU para dibujar la textura del mapa con rotación y escalado dentro de la VRAM, luego se puede enviar de nuevo a la CPU ¿Pero y que pasa con el mapa de profundidad? Un momento... No veis algo raro en la VRAM? Los pixeles de la textura que hemos mandado a la GPU, que supuestamente son colores de RGB555 de 15 bit, en realidad llevan 7 bits de una paleta de 128 colores, y los valores de 8 bit del mapa de profundidad.
¡La GPU aplica escala y rotación al mapa de profundidad! ¡Pero no es una textura, sino una matriz de alturas que luego enviamos de vuelta a la CPU!
Sí, he implementado un ejempo real de GPU computing en una videoconsola de hace 25 años. Aunque poco tiene que ver esto con CUDA.
Y bueno, tambien hice otros experimentos como detectar colisión en un poligono (muchas matemáticas). He aquí la m*** demo que hice, no me digais que no es hermosa:
Pero bueno, si quería hacer un entorno 3D de verdad necesitaría un motor grafico... Y ahi es donde realmente volví a crear un Flappy Engine desde 0, uno que me permitiera crear mis modelos en mi querido Google SketchUp. ¿Os he dicho ya que la PlayStation no tiene hardware para ordenar poligonos por profundidad y hay que apañarselas manualmente con el orden de los poligonos?



lunes, 23 de noviembre de 2020
Tutorial hacking PSX: como usar el joypad analogico en los primeros juegos de la playstation
Si alguna vez habéis decidido usar de nuevo vuestra PS-ONE y habeis puesto uno de los primeros juegos que salieron, os habréis dado cuenta de que si usáis el mando analógico, este no funciona. Al principio los juegos no tenían soporte porque este mando ni siquiera existía.
Entonces, ¿que pasa si queréis jugar estos juegos en hardware original y el pad digital os parece duro, o incomodo? En este tutorial de m...iercoles os enseñaré como hackear estos juegos, para que si teneis la PS con chip/swapdisk podais usar el stick analogico emulando al pad digital para mayor comodidad:
Pongamos como ejemplo uno de los juegos más vendidos, el de Tomb Rider. Al activar el modo analógico en el mando, la pantalla se oscurece, y el juego se pausa.
"Dame hueco, que habiendo hueco ya sabre..." - Jose Mota
lunes, 11 de mayo de 2020
PhotoMean:
Hace varios años ya hice un experimento en el cual me propuse mejorar la calidad de las fotografías realizando varias veces la misma foto, a lo que le puse el nombre de "superresolution". Este experimento no tuvo los resultados esperados, que eran incrementar la resolución aparente, pero si reducía bastante el ruido y mejoraba la calidad de las fotos.
Es por esto que he creado una nueva aplicación web que os permite hacer esto de forma automatizada: combinar varias fotos para obtener una de mayor calidad
Aquí teneis las fotos de ejemplo:
lunes, 30 de marzo de 2020
SQL-Experiments: experimentando queries alternativas en SQL
Si queremos hacer con ellos operaciones más complejas, lo habitual es, una vez obtenidos en SQL procesarlos en Java, PHP,...
Pero... ¿hasta que punto podemos ejecutar algoritmos dentro de la propia query SQL?
Recientemente he creado un nuevo respositorio en mi Github donde subir algunos experimentos.
Para inaugurar el repositorio, he subido una query recursiva que permite ejecutar el algoritmo dinámico de Longest common subsequence problem que tambien podeis encontrar en HackerRank bajo el nombre de Commond Child. La query final para SQLite me quedó así de bonica:
WITH
INPUTS(I1,I2) AS (
SELECT 'HARRY','SALLY'
UNION ALL SELECT 'AA','BB'
UNION ALL SELECT 'SHINCHAN','NOHARAAA'
UNION ALL SELECT 'ABCDEF','FBDAMN'
),
RESULTS(I1,I2,X,Y,A) AS (
SELECT I1,I2,0,1,'0000'
FROM INPUTS UNION ALL
SELECT I1,I2,
CASE WHEN X=LENGTH(I1) THEN 0 ELSE X+1 END,
CASE WHEN X=LENGTH(I1) THEN Y+1 ELSE Y END,
CASE WHEN X=LENGTH(I1) THEN '0000' ELSE
SUBSTR('0000'||(
CASE WHEN SUBSTR(I1,X+1,1) = SUBSTR(I2,Y,1)
THEN 1 + CAST(SUBSTR(A,1+4*(LENGTH(I1)+1),4) AS INTEGER)
ELSE MAX(CAST(SUBSTR(A,1+4*LENGTH(I1),4) AS INTEGER),CAST(SUBSTR(A,1,4) AS INTEGER)) END
),-4,4) END || A
FROM RESULTS
WHERE NOT (X=LENGTH(I1) AND Y=LENGTH(I2))
),
FRESULTS(I1,I2,R) AS (
SELECT I1,I2,CAST(SUBSTR(A,1,4) AS INTEGER) FROM RESULTS WHERE X=LENGTH(I1) AND Y=LENGTH(I2)
)
SELECT * FROM FRESULTS;
WITH P(N,ROW,IT,REM) AS ( SELECT '1',1,1,'' UNION ALL SELECT CASE WHEN REM='' THEN '1' ELSE N||' '|| --FIRST VALUE ALWAYS 1 CASE WHEN instr(REM, ' ')=0 THEN REM --IF REM ONLY HAS A NUMBER(1) CONCAT N THIS VALUE ELSE substr(REM, 1, instr(REM, ' ')-1) + --ELSE CONCAT SUM OF FIRST 2 NUMBERS OF REM CASE WHEN instr(substr(REM, instr(REM, ' ')+1),' ')=0 THEN substr(REM, instr(REM, ' ')+1) ELSE substr( substr(REM, instr(REM, ' ')+1),1,instr( substr(REM, instr(REM, ' ')+1),' ')-1) END END END, CASE WHEN REM='' THEN ROW+1 ELSE ROW END, CASE WHEN REM='' THEN 1 ELSE IT+1 END, CASE WHEN REM='' THEN N WHEN instr(REM, ' ')=0 THEN '' ELSE substr(REM, instr(REM, ' ')+1) END --POP FIRST NUMBER FROM REM / SET IT TO PREVIOUS N FROM P WHERE ROW<=15 ) SELECT N FROM P WHERE ROW=IT;
Y el resultado de ejecutarla es así de bonico:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
1 11 55 165 330 462 462 330 165 55 11 1
1 12 66 220 495 792 924 792 495 220 66 12 1
1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
Os recomiendo ver los enlaces de los problemas y del repositorio donde se explica como están implementados. Ahora sí, esto es importante followers: