Mostrando entradas con la etiqueta Java. Mostrar todas las entradas
Mostrando entradas con la etiqueta Java. Mostrar todas las entradas

domingo, mayo 18, 2025

AlphaEvolve: Un Agente AI para optimizar algoritmos

Desde hace años tengo la sana costumbre de disfrutar con mis amigos en un viaje de una semana donde solemos irnos de aventura por mares, países y lugares fuera de las tierras de España. Es un viaje donde las rias y la diversión son la tónica general, pero, como somos como somos, nuestras comidas, cenas y conversaciones suelen ser de programación de algoritmos con Q# para entornos de simulación de Quantum Computing y la Supremacía Cuántica, de cómo hacer transacciones de BitCoin sin usar un Exchanger y los problemas de los tamaños de bloques - que se explica bien en este libro - y el coste de la compra por eso, de las arquitecturas Serverless en plataformas de Cloud Computing, de mil y una aventura de Hacking y, cómo no, de Inteligencia Artificial.
Una de las mañanas, en uno de esos viajes, el más madrugador de todos nosotros, es decir: yo, me desayunaba con el paper de AlphaDev, donde los investigadores habían sido capaces de generar un algoritmo de ordenación con menos instrucciones. Estábamos en mitad del mar, y desde el pequeño velero donde estaba desayunando con mi ordenador estaba emocionado esperando a que se levantaran mis amigos para comentarlo, y al mismo tiempo, preparar el artículo que a la postre os publiqué: "AlphaDev: La IA que optimiza la implementación de los algoritmos mejor que los humanos"
Pero han pasado dos años, y el uso de modelos de DeepLearning con entrenamiento reforzado que se usó en el paper de AlphaDev ha seguido evolucionando, y nos ha llevado al anuncio que ha hecho el equipo de Google DeepMind para publicar AlphaEvolve, un Agente AI que utiliza los LLMs para hacer optimización de algoritmos.
La idea es básicamente la misma que tenía AlphaDev, pero aprovechándose AlphaEvolve de los avances en los LLMs, lo que permite utilizar modelos de Deep Reasoning como Gemini 2.0 Pro, combinado con Gemini 2.0 Flash, y luego tener una arquitectura del Agente AI que permita evaluar las soluciones, tal y como podéis ver en el siguiente esquema.
Como podéis ver en la imagen, además de dar almacenar el código con todos sus componentes a evolucionar, y el Prompt de configuración del agente para generar la optimización, se ensamblan varios motores de LLMs para luego pasar por un conjunto de evaluadores que comprueban la validez y el resultado de las soluciones propuestas por los diferentes LLMs para responder con la mejor de ellas y evitar el problema del indeterminismo y las alucinaciones. Las características de AlphaEvolve son:

Como ejemplo de funcionamiento tenéis este ejemplo, donde se le pide optimizar el código de un algoritmo. En la siguiente imagen está la definición del código que se quiere optimizar, que se marca con EVOLVE-BLOCK.
Después, el Prompt de acción para generar el resultado del código optimizado en las métricas que se solicitan, que no siempre la optimización es el número de instrucciones, el tamaño en memoria o la velocidad de resolución.
Y el resultado mostrado por el Agente AI de AlphaEvolve es el que tenéis en pantalla, donde se índica qué partes del código son las que se recomiendan cambiar, y cuál es la optimización que se consigue a través de realizar esos cambios.
La optimización de los algoritmos y el código, es algo que en los LLMs se lleva haciendo tiempo. Yo os publiqué el artículo de "ChatGPT: Cómo hacer (y mejorar) mi Trabajo de Fin de Carrera de la Universidad en un par de minutos" donde usaba el truco de hacer "challenge" constante al código generado por ChatGPT para ir mejorando el código en rendimiento, en calidad, en seguridad. Con AlphaEvolve se busca hacer un trabajo mucho más específico en optimizaciones de código a bajo nivel, y los resultados que presentan son muy interesantes.


En la imagen anterior tenéis los resultados de la optimización de un algoritmo para, dados tres números (m,n,p), multiplicar matrices m x n y n x p. En todos los supuestos la solución propuesta por AlphaEvolve es igual o mejor que el algoritmo original que se entrego. Y en la imagen siguiente tienes el código de entrada, el Prompt y la propuesta para el algoritmo de multiplicación de matrices.
Google ha publicado varios ejemplos en distintas disciplinas donde han utilizado AlphaEvolve para optimizar sus soluciones en diferentes áreas de la compañía, como el algoritmo de planificación de Borg para los datacenters, el diseño de los circuitos en sus TPUs (Tensor Processing Unit)  o el entrenamiento de Gemini donde AlphaEvolve propuso optimizaciones del 32% del algoritmo de FlashAttention.


En el artículo recogen algún otro ejemplo completo para que puedas analizar cómo AlphaEvolve analiza y propone las mejoras de optimización según el objetivo que se le ha pedido, y los resultados que han obtenido en diferentes tipos de soluciones.
Al final, la Inteligencia Artificial está transformando todos los sectores, la ciberseguridad como vemos artículo tras artículo, el trabajo diario de casi cualquier profesión, y por supuesto el desarrollo de software y la algorítmica. Y esto es algo que, al igual que os decía que GitHub y los repositorios de proyectos OpenSource deberían hacer para ciberseguridad, podrían hacer también para optimización. Mucha evolución en el desarrollo de software para que sea más rápido, más eficiente, más optimizado y más seguro..

PD: Si te interesa la IA y la Ciberseguridad, tienes en este enlace todos los posts, papers y charlas que he escrito, citado o impartido sobre este tema: Inteligencia Artificial (Hacking & Security): Links, Posts, Talks & Papers

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


sábado, marzo 15, 2025

¿Qué es el "Vibe Coding"?

A principios de febrero me encontré con este tweet de Andrej Karpathy, en el que hablaba de un estilo de programación que se encontraba usando de forma recurrente a la hora de programar con ayuda de LLMs, lo llamó “Vibe Coding”. El “Vibe Coding” consiste en que a la hora de crear un programa uno mismo se ha de dejar llevar totalmente por las sensaciones, olvidarse totalmente de que el código jamás ha existido y dejar que el que pique código por nosotros sean los LLM.

Figura 1: ¿Qué es el "Vibe Coding"?

Andrej comenta varios proyectos que ha hecho él siguiendo este esquema: “LLM reader app” para poder hacer preguntas sobre párrafos concretos de texto y “Battleship game” que le llevaron aproximadamente una hora y todas las instrucciones dándolas por voz.


Y estoy seguro que como yo, muchos nos hemos encontrado en la misma encrucijada que Andrej, la de estar escribiendo programas en Lenguaje Natural y siendo el LLM una capa de abstracción más a la que le damos instrucciones y este nuestro “sabelotodo” personal el que hace el trabajo sucio por nosotros.

Casos de uso, últimas semanas

Y estas últimas semanas revisando X/twitter me he encontrado con que este término ha corrido como la pólvora. Mucha gente creando proyectos en áreas en las que su conocimiento es mínimo y gracias a los “sabelotodo” han sido capaces de crear cosas en minutos que antes empezando de cero podría llevar días hasta conocer las bases de cómo poder hacerlo. Todo esto potenciado por los modelos SOTA y las herramientas más utilizadas, los “AI code editors”.


Un caso que ha sido muy sonado y que me ha hecho gracia personalmente ha sido el de @levelsio, un influencer que haciendo “Vibe Coding” creó un sencillo simulador de vuelo pidiéndoselo a Claude 3.7 y en X cuenta el cómo va evolucionando. Lo hizo usando Cursor, y tras varios intentos consiguió algo en tan poco tiempo que sería inimaginable antes, comenzando con un prompt tan sencillo como:

“make a 3d flying game in browser with skyscrapers”

Estas semanas he estado entrando a su perfil a ver el progreso de este juego tan artificial como su creador el “sabelotodo”, y únicamente usando LLMs ha ido añadiendo más features: multijugador, diferentes vehículos, el poder disparar a otros jugadores y más características. 

Sin tener conocimiento de desarrollo de videojuegos ha sido capaz de generar un juego que ha conseguido un récord de 22.000 jugadores. Y así como este muchos casos más que podemos ver si buscamos en X el juego de vocablos.

Mi propio juego con Vibe Coding

Incluso yo mismo decidí probar a ver qué es lo que conseguía “one shot” con Claude 3.7 a través del chat app y primero probé con a pedirle el mitiquísimo juego de la serpiente en Python diciéndole únicamente “Generarme el mítico juego de la serpiente en Python” y fue capaz de generarlo en menos de 20 segundos.

Figura 5: Snake game en Python hecho por Claude

También probé a pedirle que me generara el juego en Lenguaje C utilizando la librería SDL2 para manejar los gráficos y esta vez no fue “one shot” la generación del código, pero solamente tuve que copiar y pegar dos errores que generaba el compilador un par de veces y fue capaz de generar el juego.

Figura 6: Claude code for Snake game in C

Pero todo no son buenas noticias, haciendo “Vibe Coding” nos encontramos con muchos problemas también. 

Problemas del Vibe Coding

Los problemas que acarrea el generar código únicamente utilizando IA es que puede degenerar en el “Vibe Debugging”, que cuando falle esperamos que introduciendo el mensaje de error mágicamente solucione todos nuestros problemas sin saber que está mal.

Y es que delegar toda nuestra lógica de un proyecto en modelo de IA nos conlleva a que no sepamos qué hacemos, el por qué lo hacemos y el cuándo lo hacemos. Esto puede degenerar muy rápidamente si no sabemos cómo funciona nada, y a medida que crece la base de código generada va a ser difícil el continuar debido al límite de contexto y a las alucinaciones.

Conclusiones

Mis conclusiones sobre esta tendencia es que nos demuestra una y otra vez la impresionante habilidad de generar código de los “sabelotodo”, como esto sería completamente impensable hace unos años. El cómo puede ayudarnos a democratizar el acceso a la tecnología para todas las personas y que sin ser un experto en ella puedas ser capaz de usarla ayudándote de estos asistentes inteligentes.

Puede que un futuro de la programación sea el que el lenguaje natural sea una capa más de abstracción para hablar a las máquinas, que al igual que para abstraernos del ensamblador inventamos los lenguajes de alto nivel (Lenguaje C, Java, Python, …). Que los LLMs se puedan convertir en ese compilador no determinista que transforme pensamientos e ideas en código, que los humanos nos podamos dedicar a cosas más humanas como la creatividad, las ideas y que esta sea una capa más de la cebolla que es la tecnología.

Figura 7: Libros de Python para Pentesters y Hacking con Python
de Daniel Echeverri publicados en 0xWord.

Esto no creo acabe implicando en el desconocimiento de escribir código, ya que siempre hará falta alguien conozca cómo funciona la capa inferior de abstracción. Tampoco creo que signifique el reemplazo de ninguna persona sino que los que sean capaces de usarlo acaben siendo más productivos.

Un saludo,

Autor: Alejandro Garabito, Investigador IA en Ideas Locas

sábado, febrero 19, 2022

Cómo se puede explotar Log4jShell en servidores Minecraft Java (unpatched)

Hace casi mes y medio ya desde que Alibaba publicase la conocida vulnerabilidad de Log4jShell, un 0day con el cual la cual fácilmente cualquiera puede tomar el control de una máquina que utilice un servidor HTTP hecho en Java. Esto causó un gran revuelo en el mundo tecnológico y no es para menos dado que sus posibilidades en un primer momento eran infinitas, desde tomar el control de un servidor del gobierno hasta hackear satélites o dispositivos de la NASA.

Figura 1: Cómo se puede explotar Log4jShell en servidores Minecraft Java 

Desde que se publicó esta falla en la librería de log4j han salido numerosos parches y soluciones para la misma, además de que esta sólo puede ser explotada si el servidor en cuestión está abierto a Internet y corre un programa de Java que tenga esta biblioteca como dependencia.

¿Qué tiene que ver Minecraft en esto?

Minecraft tiene actualmente tres versiones totalmente diferentes, la versión multiplataforma en Java, la de código nativo de Windows y la Pocket Edition. La versión más importante, en este contexto, es la de Java, además de que es la que tiene una mayor comunidad. Y además, debido a la eclosión del interés por el Metaverso, hay que reconocerle a este mundo virtual ser uno de los pioneros este futuro que está por venir, así que, nos sirve de ejemplo de cómo puede funcionar la seguridad de estas plataformas, y cómo puede verse afectado un mundo virtual del Metaverso por un bug de tipo 0day.

Como he dicho, en las últimas semanas han surgido un montón de parches para esta vulnerabilidad, además de que todo sistema “importante” con desarrolladores a su cargo han solucionado ya esta vulnerabilidad, incluso Minecraft ha sacado una actualización que lo solucionaba. Pero aún así, este servidor, y esta vulnerabilidad, lo hacen muy jugoso como una nueva técnica hacking de aplicaciones web, similar a lo que fue Heartbleed (más importante aún).
Pero si conocéis el mundillo de Minecraft sabréis que este tiene una cantidad enorme de mods hechos por la comunidad para mejorar la experiencia de juego, y si actualizamos perderemos compatibilidad con muchos de ellos. También se puede jugar online y para ello hace falta que exista un servidor de juego al que se conectarán los diferentes jugadores o bien que alguno de los jugadores haga de host y los demás se conecten a su ordenador.

Pues entonces, si unimos la gran fragmentación que existe en el ecosistema de Minecraft, tanto en servidores como en clientes, con la gran cantidad de jugadores que tiene y que para jugar con amigos es necesario conectarse a un servidor remoto obtendremos diferentes modelos de ataques que pueden llegar a ser catastróficos.

Posibles ataques

Ahora vamos a ver los posibles ataques que se pueden dar y las circunstancias que tienen darse para que se puedan dar, todo acompañado de una pequeño video para demostrar el verdadero daño que puede causar esta vulnerabilidad. Pero antes que nada para poder entender los ataques que vamos a realizar debemos entender la topología de la red original de Minecraft.

Figura 3: Topología de conexión normal a Minecraft

Cuando nos conectamos a un servidor para jugar con nuestros amigos u otras personas lo que ocurre más o menos es lo que se ve en la imagen anterior. Los diferentes clientes se conectan a través de internet a un servidor que envía y recibe información. Este servidor puede estar alojado en la nube, pero lo normal cuando juegas con amigos es que uno de ellos hospede este en su ordenador. Sabiendo esto ahora vamos con algunos de los posibles ataques que se pueden dar.

Una partida casual

Supongamos que unos amigos deciden jugar juntos y para ello uno se ofrece a alojar un servidor en su ordenador para que así puedan estar juntos. Lo que él no sabe es que uno de ellos decide tomar el control de su máquina explotando la vulnerabilidad de log4shell. Más o menos el esquema de ataque que decide llevar es el siguiente que vamos a explicar. La topología de la red se aproximaba a la imagen siguiente. El objetivo es tomar el control del ordenador que alberga ese servidor y posteriormente tomar el control de los demás ordenadores conectados. Para ello seguirá los siguientes pasos:

Figura 4: Topología de red de una partida casual

Primero hay que preparar el entorno, para ello el atacante monta en su ordenador tres servidores distintos, un servidor LDAP que redirigirá a otro servidor HTTP que se encargará de servir código Java malicioso y finalmente un servidor NetCat para poder acceder en remoto a los demás ordenadores. 

Figura 5: Cliente maligno monta tres servidores LDAP, HTTP y NetCat

Una vez el servidor esté corriendo y los demás jugadores estén conectados el atacante simplemente escribirá por el chat del juego un comando que se encargará de que el servidor del juego se conecte al servidor LDAP. 

Figura 6: El atacante manda comando para conectarlo al LDAP

Después de que se haya realizado la conexión con el servidor LDAP este redirigirá la conexión al servidor HTTP que enviará código malicioso de Java, gracias a la vulnerabilidad de Log4j una vez el servidor de Minecraft haya interceptado el código lo ejecutara y éste hará conectarse al ordenador que lo aloja, al servidor NetCat del atacante, dando así pleno acceso al ordenador que aloja el servidor de Minecraft.

Figura 7: Explotación de log4j

Posteriormente el atacante podría realizar el mismo ataque a los clientes conectados, puesto que ahora, como controla el servidor al que están conectados dispone de sus direcciones IP públicas.
 
Figura 8: Demo de explotación de log4shell en Minecraft Java version (unpatched)

Servidor atacante

Cambiemos ahora parte de nuestra trama, antes vimos que con un ordenador el atacante tomó el control del servidor y posteriormente el de los clientes, pero esto no es muy realista, ya que normalmente el atacante montaría un servidor en la nube para realizar el ataque. Imaginémonos ahora que nuestro atacante es más avanzado y en vez de atacar a sus amigos se propone un objetivo mucho más ambicioso, tomar el control de un gran servidor de Minecraft en el que juegan cientos de jugadores. 

Figura 9: El atacante controla un servidor

El objetivo no solo es ese servidor sino también “weaponizarlo” para después poder conseguir ejecución remota de comandos en los clientes conectados al mismo y así montar por ejemplo una botnet. No sería mucho más difícil de como ya lo hizo. La técnica sería la misma mediante la explotación de log4j conseguiría ejecución remota de código en el servidor de Minecraft y una vez tenga el control de éste obtiene las direcciones IP de los jugadores conectados y de la misma manera toma su control. El ataque como tal podría seguir el siguiente esquema:

Figura 10: Servidores del atacante montados: LDAP, NetCat, Minecraft client

Como preparativos nuestro atacante montaría dos servidores en la nube, uno para montar el servidor LDAP y alojar el código a ejecutar y otro distinto con el que tomaría el control de los servidores abriendo por ejemplo NetCat en un puerto determinado. Después en su ordenador solo tendría que abrir Minecraft y conectarse al servidor del juego. 

Figura 11: Comando para conectar el servidor al LDAP

Posteriormente con el cliente de juego que está conectado escribirá por chat un comando que hará al servidor conectarse al servidor LDAP que está en la nube y este le mandara código para que el servidor del juego ejecute. Este código por ejemplo podría hacer que establezca conexión con el NetCat del atacante y así este obtendría ejecución remota de comandos en el servidor. 

Figura 12: Atacando a los clientes

Como paso final solo tendría que tomar las direcciones IP de los demás jugadores conectados al servidor del juego y repetir el proceso una y otra vez. 

Cómo evitar el ataque

Estos dos ataques, tal y como están pensados, se podrían evitar simplemente conectado un plugin al servidor del juego que filtre los comandos que se envían al servidor. Y aunque seria una manera válida, no debemos de olvidarnos que la vulnerabilidad reside en el paquete de log4j con lo que existen otros vectores de ataque que podrían seguir funcionando.

La mejor manera de evitarlo en el lado del servidor es utilizar programas de servidor de la versión 1.18.1 para arriba, esto no siempre será lo deseado porque como ya dijimos se perdería compatibilidad con el progreso que ya tengamos y no se podría jugar con muchos mods de las versiones anteriores. Otra manera sería actualizando a mano las dependencias del servidor de Minecraft, para así tener la última versión de log4j en la que ya se ha parcheado la vulnerabilidad.

En el lado del cliente de manera oficial Minecraft ha actualizado su launcher para que en ninguna versión del juego sea posible explotar esta vulnerabilidad. Eso de cara al Launcher oficial, si por algún casual tenéis un Launcher pirata o modificado este parche seguramente no se haya aplicado con lo que correis un alto riesgo de ser atacados. En un post en la web oficial de Minecraft se explican otras posibles soluciones. Como solución general Java nos recomienda que actualicemos el jdk a la última versión, esto no detendrá todos los vectores de ataques posibles, pero sí mitigara algunos de ellos.

Conclusión final

Como ya hemos visto log4shell es una vulnerabilidad de seguridad muy importante que permite un montón de ataques diferentes, y la que hoy he mostrado es solo una de las muchas maneras en las que se puede explotar esta vulnerabilidad. Además este fallo de seguridad ha sido un “0day” lo que significa que ha estado activa hasta que se notificó hace dos meses, pudiendo haber dado lugar a muchos ataques como el que hoy he mostrado sin que ni siquiera nadie se diera cuenta. Habiendo pasado ya más de dos meses de que se crean numerosas soluciones para esta vulnerabilidad ya es un buen momento para sacar este artículo y enseñaros que todas precauciones son pocas y que siempre hay que estar alerta. Nos vemos en siguientes artículos,

Saludos,

Autor: Chema Garabito. Desarrollador Full-Stack. Ideas Locas Telefónica CDO.

sábado, junio 12, 2021

Cómo programar Bots con Inteligencia Artificial para ganarte en los juegos: Un ejemplo con Bomberman & Pommerman

Hace unos años era muy fan de los videojuegos, en concreto de la serie Call of Duty y los NBA 2K. Pero mis andaduras en el mundo “friki” empezaron mucho antes, con la PlayStation 1 y 2: Bomberman y el Crash and Bandicoot. En esa época, mi frase favorita era “Malditos Bots” cuando perdía (tenía muy mal perder), y en meterme en el mundo de la inteligencia artificial… aprendí realmente a cómo se hacen esos bots. 

Figura 1:Cómo programa Bots con Inteligencia Artificial para ganarte en los juegos: Un ejemplo con Bomberman & Pommerman

Pero primero, empecemos con un poco de introducción al tema. Cuando escuchemos la palabra bots, y en el caso particular de "Bots de aprendizaje para videojuegos", os debe venir a la mente una tecnología: Reinforcement Learning (RL). 

Intro a los bots y sistemas multiagente

El RL o aprendizaje por refuerzo es una rama de investigación de la IA muy interesante, donde distintos agentes interaccionan entre sí bajo un escenario realizando acciones. El Reinforcement Learning se diferencia de otros sistemas Multiagente por distintos motivos, entre los cuáles se destaca que estos obtienen un score/reward por cada secuencia generada de acciones, y se aprende a partir de ese valor. Este score es utilizado para que redes neuronales profundas (Deep Learning) o Planificadores Automáticos clásicos (utilizando heurísticas como A*) predigan qué acción se debe realizar en cada momento en función del conjunto de acciones que mejor reward dé. 

Figura 2: Libro de Machine Learning aplicado a Ciberseguridad de
Carmen Torrano, Fran Ramírez, Paloma Recuero, José Torres y Santiago Hernández

Aunque es muy interesante todo lo relativo a las redes de neuronas, hablaremos más sobre heurísticas, ya que es el principal componente que hizo grandes avances. Por decirlo de alguna forma, uno no puede correr sin saber cómo se camina. Para definir lo que es una heurística, utilizaremos la RAE: 

“En algunas ciencias, manera de buscar la solución de un problema mediante métodos no rigurosos, como por tanteo, reglas empíricas, etc.”

Por tanto, queremos resolver el problema sin realizarlo realmente. Estas heurísticas se pueden ver en el mundo real, un ejemplo:

- Un bate y una pelota cuestan 1,10€. 
El bate cuesta 1 euro más que la pelota. ¿Cuánto cuesta el bate?

1,10€ - 1, la pelota cuesta 0,10€ y el bate 1€, ¿no? Error. Quién haya pensado 1€, ha sido rápido que no preciso, y ha utilizado una heurística de aproximación. Realmente el bate cuesta 1,05€ y la pelota 0,05€.

Aunque estos ejemplos nos pueden hacer pensar que las heurísticas son malas, se utilizan mucho en problemas de competición entre agentes. El agente simulará “en su cabeza” qué acciones debe realizar y las seleccionará en función de una heurística. Después realizará estas acciones y verá si su previsión se adecua a la realidad del reward. Esto permite que la Inteligencia Artificial prediga qué acción realizar en función de posibles escenarios futuros.

En los algoritmos basados en normas había un techo de aprendizaje basado en la cantidad de datos que un sistema podía aprender. Deep Blue, que no utilizaba sistemas de RL sino planificadores clásicos, fue capaz de ganar al famoso ajedrecista Garry Kasparov en 1996, algo que antes parecía imposible. Pero un algoritmo más nuevo y complejo como AlphaGo llegó al nivel de expertos en el famoso y complicado juego asiático Go. Pero no se utiliza únicamente redes neuronales, como si de magia se tratara: AlphaGo Zero por ejemplo utiliza internamente heurísticas para simular pasos a corto plazo (MCTS, que comentaremos luego). Si queréis ver una implementación muy divertida de esta tecnología, el caso más sonado fue el de OpenAI, donde los personajes rompieron el juego “surfeando” las cajas.


Figura 3: OpenAI juego del Hike and Seek, donde los agentes compiten
y/o colaboran entre ellos para su objetivo particular (pillar o no ser pillados)

En otros sistemas Multiagente no competitivos, como esta simulación de un mundo con COVID que realicé, los agentes interaccionan con el entorno a partir de un modelo BDI (Belief, Desire and Intention): cada agente tienes unas creencias sobre el entorno (por ejemplo, creo que no tengo Covid), tiene unos deseos (quiero ir a trabajar y al bar los jueves) y realiza unas acciones (se desplaza al sitio y se toma una cerveza en su bar favorito). En este tipo de simulaciones, los agentes no aprenden qué acciones deben realizar en cada momento, sino que nos sirven para simular situaciones reales donde distintos agentes interaccionan y se comunican entre sí.

Figura 4: Rutinas para cada uno de los tipos de agente (Young y Adult) en un mundo con Covid. En este tipo de simulaciones, los agentes no aprenden qué acciones deben realizar. 

Pommerman

Trasteando con tecnología, encontré la implementación en Java de Pommerman, un juego que seguro que a mi hermano Victor Ibáñez le sonará mucho, ya que nos pasamos horas jugando a otro muy similar. A mi parecer, la primera implementación parecida a un Battle Royal estilo Fortnite. En ese juego, diferentes jugadores se posicionan en las 4 esquinas de un tablero y deben atacar a los adversarios insertando bombas en el tablero. Aquí tenéis el paper asociado.


A partir de comandos podéis definir bots, cada uno con sus características. Cada uno de los bots podrá realizar 5 acciones (poner una bomba y los movimientos izquierda, derecha, arriba, abajo), además de poder quedarse quieto. Los agentes inteligentes tendrán una heurística concreta para este problema, que en el paper mencionan como una diferencia entre el nodo de búsqueda inicial (nodo root) y el estado final, donde se consideran distintos factores: el número de compañeros vivos, el número de enemigos vivos, el número de bloques de madera existentes, la fuerza de explosión y la habilidad de poder chutar bombas (algunos objetos recogidos aumentan estas dos últimas capacidades).

Por ejemplo, a menos enemigos vivos en nuestro estado evaluado, mejor es esa solución. Según la “inteligencia” de cada uno de los bots, podemos encontrar las distintas tipologías de agentes:
  • DoNothing (0): El agente no realiza acciones.
  • Random (1): El agente selecciona acciones de su pool de forma aleatoria.
  • OSLA (2): One Step Look Ahead, este tipo de agente calcula (a partir de la heurística comentada) el siguiente paso a realizar, y escoge el que dé mejor resultado.
  • Simple Player (3): Este agente calcula con Dijkstra (máximo 10 steps) el path más corto a los objetos del entorno. Entonces se escapa en caso de estar en la potencial área explosiva de una bomba, deja una bomba en caso de estar adyacente a un jugador rival, se acerca a un enemigo en caso de estar cercano a 2-3 pasos y puede dejar una bomba en caso de estar cerca de un trozo de madera.
  • RHEA 200 (4): o Rolling Horizon Evolutionary Algorithm, este algoritmo genera N individuos de L pasos/acciones a realizar, utiliza métodos de algoritmos genéticos (como mutación o elitismo) para generar nuevos individuos y a partir de la heurística mencionada escoge el primer paso del mejor individuo.
  • MCTS (5): o Monte-Carlo Tree Search, es otro Stocastic Forward Planning. Como algunos recordaréis, Monte-Carlo se puede utilizar, por ejemplo, para aproximar PI a partir de N simulaciones del experimento, para estimar la probabilidad de que suceda un evento... MCTS balancea entre exploración-explotación para desplegar el árbol de búsqueda a partir de los nodos más prometedores (no lo despliega entero). Se simulan distintos escenarios des del nodo aún no expandido, y se selecciona la primera mejor acción a realizar.
Además, tenemos la opción de controlar a uno de los personajes (6), para jugar contra los bots en esta simulación, y seleccionar qué campo de visión tienen los personajes y si es una competición por equipos.

Si vemos la implementación del player DoNothing, observaremos el esqueleto que deben tener todos los otros jugadores. Debemos extender la clase Player y crear nuestras normas o algoritmos para la selección de acciones en la función act. En el caso de SinglePlayer, la norma de escaparse en caso de estar en una posición no safe, debemos movernos a una posición safe en la siguiente jugada.

Figura 6: Implementación del DoNothing player (izquierda) y acción de escaparse en SinglePlayer (derecha)

Una vez hemos compilado y ejecutamos el programa con los parámetros adecuados, podremos jugar contra los tipos de jugadores mencionados anteriormente o los que hayamos creado. Por ejemplo, un juego contra los 3 jugadores más sencillos (DoNothing, RandomPlayer y SimplePlayer) se ejecutaría como:

 .\run.jar 0 1 1 -1 0 1 2 6

Los primeros parámetros corresponden a qué tipo de juego se simula (individual o por equipos), la semilla del juego, repetición por cada semilla (queremos simular un juego) y el tipo de visibilidad (en nuestro caso -1 ya que queremos ver todo el tablero). Los últimos cuatro parámetros (0 1 2 6) corresponden a los tipos de jugadores, por lo que la distribución de los jugadores será: arriba-izquierda DoNothing, abajo-izquierda RandomPlayer, abajo-derecha OSLA y arriba-derecha el jugador que yo moveré. Veamos un juego:

Figura 7: Videojuego “sencillo”

Sí, me ganó el jugador DoNothing porque nos morimos a la vez el jugador OSLA y yo… Ahora escribo con el teclado roto. El jugador random, en cambio, se suicida en las primeras iteraciones dado que no aprende qué jugadas realizar, sino que escoge una del pool de posibles jugadas.

Si jugamos un juego contra los agentes más “inteligentes” (SimpleAgent, RHEA y MCTS) aumenta la dificultad. El comando es “.\run.jar 0 1 1 -1 3 4 5 6”, por lo que la distribución será arriba-izquierda SimpleAgent, abajo-izquierda RHEA, abajo-derecha MCTS y arriba-derecha mi jugador. Veamos un juego:

Figura 8: Vídeo juego modo “hard”

Entre mis amigos esto le llamamos la 13,14. Lo que sí que hemos podido aprender de hoy, a parte de la notable pérdida de mis habilidades jugando videojuegos, es un repaso sobre la IA en competiciones, qué es una heurística y cómo se programan bots para Bomberman con ellas. ¡No dudéis en descargaros el código, implementar algún bot y/o jugar!

Saludos,

Autor: Bruno Ibáñez, Investigador de Ciberseguridad e IA en Ideas Locas

miércoles, febrero 24, 2021

GeeksHubs, 0xWord & MyPublicInbox: Hack your Career!

Durante este tiempo hemos estado colaborando con GeeksHubs Academy, una Coding School focalizada en la transformación profesional en el área tecnológica de las más relevantes en este país, para llegar a un acuerdo de colaboración conjunta donde podamos aportar desde 0xWord y MyPublicInbox nuestro apoyo a mejorar, solo un poco, las acciones formativas y de aprendizaje que GeeksHubs crea para transformar la carrera profesional de los profesionales en el mundo tecnológico.

Figura 1: GeeksHubs, 0xWord & MyPublicInbox: Hack your Carrer!

El objetivo de los BootCamps, de los Hackathons y de los programas de Full Stak Developer, en los cursos de especialización tecnológica y en los BootCamp de Tech Management for Leadership es preparar a los desarrolladores, a los administradores de sistemas, expertos en BlockChain, bases de datos, desde acciones de nivel inicial para aprender a programar desde cero hasta llegar a ser CIOs o CTOs (Chief Technology Officer), acabando formándose con grandes CTOs de este país que ayudan a que los buenos ingenieros den el salto para estar listos para programar los Squad de desarrollo, gestionar los programas de talento, los modelos de desarrollo Agile, y la carrera profesional de sus equipos técnicos.
Con esta visión de llevar al trabajadores tecnológicos de recorrer toda la carrera desde cero hasta ser un CIO o CTO, nos hemos sumado a colaborar con ellos desde 0xWord y MyPublicInbox. Primero aportando a las formaciones tecnológicas libros de nuestra editorial, escritos por grandes profesionales de la tecnología que ayude a mejorar los recursos educativos de cada una de las acciones educativas de transformación profesional que lleva a cabo GeeksHubs Academy, la primera Coding School de este país.
Además, cada formación de GeeksHubs Academy llevará asociado Tempos de la plataforma MyPublicInbox para que los alumnos puedan comunicarse con los grandes profesionales que hay en la plataforma, en el área de Cloud Computing donde hay profesionales de los más punteros de este país, especialistas en Tecnología con CTOs, CIOs o Tech-Leads, perfiles públicos en Tecnológia-Software con grandes desarrolladores, perfiles públicos en Big Data, especialistas en Criptomonedas, BitCoin y BlockChain o en el área de Inteligencia Artificial.
Por último, yo me sumaré a algunas de las charlas que tienen que ver con la transformación de una carrera tecnológica, en la que me he animado a contar cosas de mi propia carrera, de cómo se han hecho muchos de los proyectos tecnológicos que hemos lanzado en los últimos años, y cómo ha sido la experiencia de un chaval de Móstoles que no sabía qué tipos de redes había cuando le preguntaron en la primera entrevista de trabajo, hasta llegar a ser CDCO en Telefónica - que  ha sido apasionante -. 

Para que os hagáis una idea del tipo de actividades educativas de transformación profesional que se hacen en GeeksHubs Academy, podéis ver el BootCamp de Tech Management & Leadership que comienza el próximo 5 de Marzo, donde se ven, durante 15 semanas, temas que tienen que ver con la organización completa de todas las necesidades de un departamento CIO, CTO o de Tech-Lead.
Y los mentores que lideran esta acción, son un plantel de profesionales que han pasado por situaciones similares, ya que es su día a día en su trabajo, ya que todos son CTOs, CIOs, o Tech Leads en sus diferentes disciplinas, empresas y startups.


Al final, lo que es importante para una carrera profesional saludable - como ya os dije en los Consejos Malignos para tu etapa formativa y profesional - es que no te olvides de que en este mundo tecnológico empresarial en el que nos encontramos, hay cosas que se aprenden haciendo, y cosas que se aprenden aprendiendo, y que no hay cosa más saludable para hackear tu carrera profesional, que tener la mente abierta para reconocer todo lo que no sabemos y tenemos que aprender - haciendo o aprendiendo - . 


Yo os he hablado muchas veces de estas cosas, y en la charla de Hack Your Future! intentaba contar algunas de las simples reglas que he seguido en mi vida profesional, así que desde ahora intentaré aportar lo que pueda a los ingenieros que estén haciendo estas actividades educativas de transformación profesional en GeeksHubs Academy.

Saludos Malignos!

jueves, julio 23, 2020

Aplicaciones web escalables con el Patrón Arquitectónico "MicroFrontEnds"

La mayoría de las personas que estéis leyendo este artículo, habréis oído hablar o incluso trabajado con microservicios que llegaron para dividir la estructura de monolito en la parte BackEnd. Una división en partes más pequeñas que simplifican el despliegue, aumentan la escalabilidad de la aplicación y permiten la adopción de nuevas tecnologías dentro de un proyecto.

Figura 1: Aplicaciones web escalables con el Patrón Arquitectónico

Sabemos que es complejo realizar un desarrollo FrontEnd adecuado, y más aún cuando se trata de escalar un proyecto extenso y complejo donde trabajan varios equipos con una estructura frontal monolítica. Es en este punto donde ha llegado el patrón de tendencia este año, MicroFrontEnds, para dar solución a este tipo de problema. Este patrón arquitectónico bebe directamente de la filosofía de estructuración y tratamiento de los microservicios aunque está orientado al desarrollo FrontEnd. 

Figura 2: Evolución del patrón de arquitectura

MicroFrontEnds aparece en el radar de tecnología de ThoughtWorks en noviembre de 2016 como una técnica que surge de la necesidad de eliminar el monolito de la parte frontal de una aplicación web. En noviembre de 2017 se denomina esta técnica en estado de prueba. Por último, entre abril de 2019 y mayo de 2020 esta técnica termina por asentarse como un Patrón Arquitectónico.  

Figura 3: Libro de Hacking Web Technologies 2ª Edición en 0xWord de
Chema Alonso, Enrique Rando, Amador Aparicio, Pablo González y Ricardo Martín

Este patrón surge de la descomposición de un monolito frontal en partes más pequeñas y simples que pueden ser desarrolladas, probadas e implementadas de manera independiente. De tal forma, se observa una aplicación web como una composición de funcionalidades que se comunican entre sí. Dichas funcionalidades están desarrolladas por equipos independientes que conocen punto a punto la lógica de estas con las que están trabajando.

Figura 4: Organigrama de trabajo con MicroFrontEnds

Por lo tanto, los equipos tienen una base de código más pequeña que tratar y como resultado se obtiene una aplicación más sostenible y fácil de probar. Además de una mayor tolerancia a fallos y brechas de seguridad, ya que este patrón se desarrolla bajo la filosofía DevOps, aunque siempre se puede mejorar con prácticas de desarrollo de código seguro y seguir la corriente de las SecDevOps.

Figura 5: Libro de Docker:SecDevOps de 0xWord
escrito por Fran Ramírez, Rafael Troncoso y Elias Grande

Para entender mejor todo, estas sería las situaciones que resuelve este patrón:

- En determinados proyectos se requiere de la implementación de una aplicación web y puede que en el código de tu proyecto no encuentres el sitio adecuado para dicha implementación.

- Puede que quieras utilizar nuevas features de JavaScript en tu proyecto, pero estas no encajen con las herramientas utilizadas hasta el momento.

- Escalar tu desarrollo haciendo que varios equipos de trabajo puedan desarrollar en el mismo proyecto de forma simultánea.

Dada la independencia de estos MicroFrontEnds se obtienen resultados como mejores tiempos de carga, código con mayor accesibilidad, acotación de errores y, a mi parecer, la característica más interesante, despliegues independientes de las distintas funcionalidades. Lo que resulta una experiencia de usuario mejorada de cara a las actualizaciones en la aplicación web, ya que solo se actualizaría la funcionalidad en cuestión y no toda la aplicación. Este proceso, resultará transparente de cara al usuario final.

Técnicas de implementación.

Se utilizan varias formas de implementar este patrón a la hora de desarrollar una aplicación web, aunque existe un enfoque general entre todas las vías de implementación en el que un contenedor renderiza todos los elementos comunes de la página y orquesta aspectos como la autenticación y la navegación con los microfrontend. Estas son algunas de las implementaciones utilizadas con mayor frecuencia:

Iframes:

Dentro del contenedor principal cada microfrontend se alojará dentro de un iframe que puede residir en otro servidor. Aunque, puede resultar complejo realizar un diseño adaptativo al utilizar este tipo de elementos.

Figura 6: Implementación de MicroFrontEnds con iframes

Múltiples SPA alojadas en distintas URL:

La idea es alojar distintas SPA en las páginas de nuestra aplicación, esto hará que podamos introducir de forma sencilla esta arquitectura en proyectos ya iniciados, aunque la implementación de este patrón requerirá módulos externos para compartir las distintas funcionalidades de la aplicación.
 
Figura 7: Implementación de MicroFrontEnds con múltiples SPA en distintas URL

Single-SPA “Meta framework”:

Consiste en implementar varios frameworks trabajando en la misma página. Esto requiere de un constructor global para transpilar y orquestar las distintas funcionalidades.

Figura 8: Implementación de MicroFrontEnds con Single-SPA "Meta framework"

Aunque es una tecnología bastante reciente, el patrón de arquitectura basado en MicroFrontEnds es una solución que aporta muchas ventajas al ciclo SecDevOps y beneficios en aspectos como la escalabilidad, sostenibilidad, seguridad y despliegue de una aplicación de gran tamaño. 


Figura 9: Implementación del patrón de diseño MicroFrontEnds

Seguramente en un futuro próximo escuchemos hablar más acerca de este tipo de arquitecturas.  Aquí os dejamos un vídeo de cómo utilizar este patrón.

Referencias:


Autor: Luis E. Álvarez (@luisedev) es desarrollador y miembro del equipo Ideas Locas CDCO de Telefónica. 

Entrada destacada

Hacking IA: Jailbreak, Prompt Injection, Hallucinations & Unalignment. Nuestro nuevo libro en 0xWord

Pocas veces me ha hecho tanta ilusión que saliera un nuevo libro en 0xWord como con este libro de " Hacking IA: Jailbreak, Prompt Inje...

Entradas populares