Proyectos
ZofIA
Una plataforma educativa orientada a ayudar a los estudiantes en su preparación para el examen de admisión a la universidad más prestigiosa de México. Obtuvo más de 10,000 seguidores en Instagram en aproximadamente tres semanas después de su lanzamiento.
Contamos con un flujo automatizado que produce videos que contienen texto, imágenes y audio donde presentamos una pregunta con su solución y explicación. Este contenido se genera con la ayuda de Large Language Models (LLMs), modelos text-to-image y modelos text-to-speech. Luego integramos estos elementos usando Python para crear el video final, que luego se publica en nuestras distintas redes sociales.
El backend de la plataforma está escrito en Rust, el frontend en React y TypeScript, la base de datos es PostgreSQL y el servidor está alojado en Heroku.
Puedes probar la plataforma aquí: ZofIA
Chip 8
Una simple implementación de CHIP-8, escrita en Rust y compilada a WebAssembly; utiliza un simple canvas para renderizar los gráficas.
Demo:
En el juego wipeoff se controla la plataforma con las teclas q y e.
Trueno
Un Ray Tracer multithreaded que hace uso de SIMD.
Soporta diversos tipos de materiales (difuso, metálico, dieléctrico), antialiasing, una cámara configurable (resolución, apertura, enfoque) y composición de escena.
Implementación basada en el libro Ray Tracing in One Weekend
FIRE
Un editor de texto modal escrito completamente en C, sin usar dependencias externas.
Fue escrito en un intento de desempolvar mi conocimiento de C y también para intentar aprender prácticas modernas, como el uso de tipos estándar (stdint.h), o para evitar usar malloc en favor de calloc, etc. Mi principal guía en este proceso fue la publicación de Matt Stancliff en el blog How to C in 2016, es una buena lectura para ponerse al día con las "prácticas modernas" de C.
Soy un muy fan de neovim y esta fue mi principal inspiración al construir FIRE, como pueden ver en el demo de arriba.
Principales características
- Modos Normal e Insert, como en Vim.
- Abrir, mostrar, editar y guardar archivos de texto.
- Búsqueda incremental del contenido del archivo.
El código y las instrucciones para compilar y ejecutar el proyecto están disponibles en el repo.
Interprete
La implementación de un lenguaje de programación dinámico, Lux, y su respectivo interprete. Soporta variables, control de flujo, funciones, un REPL y se le dio particular importancia a la presentación y contenido de los mensajes de error.
Se basa en las lecciones presentada en el libro Crafting Interpreters de Robert Nystrom.
Puedes probar el REPL compilado a WebAssembly aquí:
Perros Covid
Sitio web para la recolección, procesamiento y caracterización de muestras por PCR de COVID-19 para su posterior uso en el adiestramiento de perros para identificar muestras positivas. Parte de un proyecto colaborativo entre la SEDENA (Secretaría de la Defensa Nacional), la SRE (Secretaría de Relaciones Exteriores) y la UNAM (Universidad Nacional Autónoma de México).
Gaceta UNAM: Reconocimiento a la FMVZ por proyecto sobre Covid-19
Objetivo
El objetivo principal de la página es ayudar a agilizar el proceso de entrenamiento de los perros, esto al facilitar el registro de las muestras utilizadas, las respuestas dadas durante las pruebas, la identidad del perro entrenando, el resultado obtenido en cada sesión y de igual manera mostrar estadísticas generales respecto al progreso de un perro en específico y en general de todos los caninos registrados.
Muestras
Una muestra es el resultado de la prueba PCR más algunos otros datos relevantes del individuo en el que se realizó la prueba, como su edad, sexo, comorbilidades, etc. Esta información adicional es relevante pues puede ayudar a detectar sesgos o patrones dentro de las muestras seleccionadas por los perros en los entrenamientos (ej. los falsos positivos suelen ser muestras de personas que toman x medicamento).
Las pruebas son almacenadas y consultadas directamente en el sitio web.
Tech Stack
El frontend consta principalmente del stack básico: HTML, CSS y para añadir interactividad se utiliza TypeScript y un par de bibliotecas de JavaScript: Chart.js, Moment.js, Selectize.js y un poco de JQuery. El backend fue construido completamente en Rust utilizando el framework Rocket. Los datos se almacenan en una instancia de PostgreSQL.
Lamentablemente no cuento con la autorización para hacer público el código fuente ni el enlace a la página. : (
Reporstat
Es un paquete para el lenguaje de programación Julia que tiene como objetivo agilizar la consulta de información poblacional de instituciones como el INEGI, el CONAPO y el CONEVAL, ésta segregada por municipios y estados para que, en conjunto con datos de cualquier índole, se facilite la realización de análisis y reportes estadísticos al usuario.
PokeClassifier
Un bot de telegram que trata de identificar pokémon en imágenes utilizando deep learning. Dada una aproximación también proporciona un enlace a la entrada del pokémon en el Pokédex Oficial.
Métodos Numéricos II
Página web donde se realizan simples implementaciones y su respectivas representaciones gráficas de diversos métodos numéricos para la resolución de ecuaciones, integración e interpolación numérica.
Se implementa el método de Newton, Regla trapezoidal, Punto fijo, Interpolación Polinómica de Lagrange, Diferencias divididas , Interpolación de Newton, entre otros.
Hospedada en Heroku
Fly.io con backend en Python
(Django). Código fuente
aquí.
Telegram ChatBot
Dos implementaciones de un bot que hace uso del API de Telegram (lamentablemente Whatsapp y Signal no tienen un API razonable).
La primera implementación del bot esta hecha en Python, corre en Heroku sobre Docker y cuenta con una base de datos relacional (PostgreSQL) que le proporciona toda la información necesaria.
Desgraciadamente el desempeño de esta primera implementación deja mucho que desear, dando tiempos de respuesta al cliente de ~.5 segundo, por lo que decido mejorar esos tiempos de repuesta al crear una implementación con un enfoque distinto.
En la segunda implementación se elige Rust como lenguaje principal pues es conocido por su alto desempeño y ademas puede ser compilado para la arquitectura de la máquina que en la que se piensa hostear el bot, ARM y Raspberry Pi. Para la base de datos se utiliza igualmente PostgreSQL pero esta vez corriendo de manera directa en el sistema operativo.
El resultado final de esta implementación es un bot que da respuestas en ~300 µs, gracias al crate tokio y un cuidadoso uso de recursos.
Gráfos en Teoría
Página web en la que se pueden crear grafos interactivamente mediante la biblioteca de JavaScript D3 y arroja información sobre estos, esencialmente su matriz de incidencia y/o adyacencia.
Hosteada en Heroku con backend en Python (Django). Los recursos utilizados se pueden encontrar aquí.
Compiladores de Brainfuck
Dos compiladores del lenguaje de programación Brainfuck, el cual es Turing-complete y se compone de solo ocho comandos.
+ | - | [ | ] | > | < | , | . |
---|
Por ejemplo aquí, una implementación del emblemático Hello World!.
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<++++++++ +++++++.>.+++.------.--------.>+.>.
El primero es una implementación que crea un ejecutable al generar instrucciones de lenguaje ensamblador, esto se logra al asignar cada instrucción de brainfuck a una serie de instrucciones en assembly , posteriormente las ensambla usando NASM para finalmente linkearlas con ld.
El segundo usa el crate Inkwell, el cual expone el API de LLVM que da una interfaz mucho más robusta para crear ejecutables de mayor calidad que hacen uso de las diversas opciones que LLVM ofrece, como agresivas optimizaciones. LLVM crea un archivo ELF que se enlaza de manera dinámica usando Clang o GCC.
Ambos compiladores están hechos con Rust y disponibles en mi github bajo MIT.
Métodos Numéricos I
Programa nativo multiplatforma para resolver ecuaciones lineales y no lineales. Implementado en C++ utilizando el framework QT para la creación de la interfaz gráfica.
Se implementa el método de Newton, Gauss, Secante, Doolittle, Bisección, Falsa posición, Gauss Jordan, Gauss Seidel, Jacobi, entre otros más.
Lunar Lander
To do...