Antes de empezar con la jerga legal copiada y pegada de otra web, te resumo con palabras de humano de qué va todo esto: esta web utiliza cookies para almacenar información. Las uso para analizar cómo acceden a mi web, qué posts suelen leer y cuánto tiempo dedican a leer cada post, y así entender qué contenido resulta más interesante. Ninguna de esta información se vende a terceros, y todo el contenido de mi web está almacenado en la misma. No uso fuentes de Google, los botones para compartir en redes sociales que llevan código de tracking, ni nada similar que sirva para compartir con estas empresas por qué webs te mueves.
Ahora sí, empiezo con la jerga legal 😴.
Al navegar por esta web, usted acepta la recogida de información y la combinación con información previamente recogida, para seleccionar y enviarle contenido, y para medir el envío y la eficacia de dicho contenido. Esto incluye usar información previamente recogida sobre sus intereses para seleccionar contenido, tratar datos sobre qué contenido se ha mostrado, con qué frecuencia y durante cuánto tiempo se ha mostrado, cuándo y dónde se ha mostrado y si realizó alguna acción relacionada con el contenido, incluido, por ejemplo, hacer clic en el contenido. Esta información no se comparte con terceros.
Para los fines previamente citados, utilizamos cookies, pequeños archivos con información relativa a tu navegación en esta Plataforma, principalmente para posibilitar una mejor experiencia del usuario. Concretamente, sólo usamos dos cookies propias, para identificar tu perfil en múltiples dispositivos así como recordar tus preferencias relativas a los términos de uso. Al navegar y continuar en nuestra plataforma, estarás consintiendo el uso de las cookies antes enunciadas. Si deseas revocar tu consentimiento informado respecto a nuestra política de cookies, deberás eliminarlas en tu dispositivo a través de la configuración de tus navegadores de internet.
Dicha información consiste en el tratamiento de datos para vincular múltiples dispositivos mediante la recogida de información sobre las propiedades de la pantalla de su dispositivo y aplicación, así como las especificaciones técnicas del mismo, que incluyen el número de núcleos del procesador, el renderizador, la eficiencia de su CPU, los plugins compatibles con esta web, y el tipo de dispositivo táctil. Si añades un comentario, también se almacenará tu nombre, mail, cuerpo de comentario, fecha de publicación, así como tus preferencias de envío de correos electrónicos con respecto al mismo.
Si vives en un país miembro del Espacio Económico Europeo, esta Política de Privacidad y la forma de procesar tus datos estarán reguladas por el Reglamento General de Protección de Datos, o Reglamento [UE] 2016/679 ("RGPD"). Si vives en un país que no forma parte del Espacio Económico Europeo, el procesamiento de tus datos personales estará regulado por las leyes de privacidad del Estado de California.
Como controlador de datos, nos comprometemos a respetar la naturaleza confidencial de tus datos personales y garantizamos el completo ejercicio de estos derechos. En todo momento, puedes ejercer los siguientes derechos:
Derecho al acceso. Tienes derecho a confirmar si estamos procesando tus datos personales y, si lo estamos, tienes derecho a obtener una copia de los datos y de la información relacionada con el procesamiento.
Derecho de modificación. Tienes derecho a corregir errores, a modificar datos incompletos o erróneos y a garantizar la autenticidad de la información procesada.
Derecho a eliminar. Tienes derecho a solicitar la eliminación de tus datos personales sin un retraso injustificado, en el caso de que hayan sido procesados de manera errónea o si el fin para el que han sido procesados o recopilados ha dejado de existir.
Derecho a limitar el procesamiento. Tienes derecho a solicitar la suspensión del procesamiento de tu información si es ilegal o si la exactitud de los datos es cuestionada.
Derecho de oposición. Tienes derecho a oponerte al procesamiento de tus datos cuando han sido utilizados con fines de marketing directo o cuando el procesamiento deba finalizar debido a un problema personal, excepto cuando haya legítimo interés o sea necesario para el ejercicio o la defensa de acciones.
Derecho a no ser sometido a decisiones personalizadas. Tienes derecho a no ser sometido a una decisión basada únicamente en el procesamiento automático de tus datos, incluida la caracterización del perfil, con efectos legales vinculantes o que te afecten, excepto cuando sea necesario para la ejecución de un contrato, de acuerdo con la ley, o si lo has autorizado de forma expresa.
No nos hacemos responsables en ningún caso por cualquier apartado de estas Condiciones, bajo ningún contrato, negligencia, responsabilidad objetiva o cualquier otra teoría legal o equitativa, por: (i) daños especiales, incidentales o resultantes; (ii) el costo de adquisición o sustitución de productos o servicios; (iii) la interrupción del uso o la pérdida o maleo de datos. Lo anterior no se hará valer en la medida en que sea prohibido por las leyes en rigor.
Para poder ejercer tus derechos, envía un mail a juancarlos arroba sevilla punto es, indicando tu identidad con el nombre completo, un documento identificativo para comprobar tu identidad, y el derecho o los derechos que estás ejerciendo.
Actualizaremos esta Política de Privacidad ocasionalmente y de acuerdo con las modificaciones legales, regulatorias u operativas. Te notificaremos estos cambios (incluida la fecha de vigencia) según las exigencias legales. Estas condiciones han sido publicadas el 11 de mayo de 2020.
Todos los proyectos de esta web están bajo licencia BY-NC-SA 3.0 a menos que se especifique lo contrario. Para más información, visita http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode.
A principios de año diseñé Quanto, un juego que sigue la fórmula Wordle —una partida global cada día con estadísticas— y consiste en averiguar el precio de seis productos de supermercados españoles.
El juego ha tenido más impacto del que me esperaba y ya ha alcanzado las 50,000 partidas, una cantidad que me ha hecho plantearme si mi humilde servidor doméstico iba a dar abasto. De momento funciona sin problemas (la carga no llega al 0.01% en el pico de por la noche) y puedo seguir dejándolo disponible sin publicidad de ningún tipo.
Los productos son escogidos aleatoriamente todos los domingos de las webs de Carrefour, Lidl, Alcampo y Mercadona. Además de la foto, todos van acompañados de su nombre e información adicional como el peso o el volumen. Por cada producto tenemos dos intentos para averiguar el precio, con una pista para intentar acercarse más en el segundo:
Mensaje
Desviación
¡A la primera!
0%
Casi, un poco más
Menos del 15% por abajo
Casi, un poco menos
Menos del 15% por arriba
Demasiado alto
Al menos un 15% por abajo
Demasiado bajo
Al menos un 15% por arriba
Al terminar la partida, se muestran ciertas estadísticas como el porcentaje de desviación medio y el típico mensaje de "estás por encima del 60% de los jugadores". Para calcular este mensaje es necesario almacenar las puntuaciones de todas las partidas y usarlas para calcular los percentiles; algo así como ordenarlas puntuaciones de menos a más y cortarlas en 100 trocitos de longitud parecida.
Observar estos percentiles y hacer estadísticas por producto es muy curioso, y la única conclusión que puedo sacar es que la mayoría no tenemos ni idea de los precios de lo que compramos. En productos poco habituales las desviaciones suelen ser muy grandes.
Por ejemplo, la mitad de los usuarios pagarían 7€ por un tinte de 2.50€. Seguramente si en el supermercado hay más variedad de tintes y marcas podamos hacernos una idea del verdadero precio del producto, pero muchas cadenas cuentan con un único producto para muchas necesidades concretas.
Si me animo algún día usaré todas las estadísticas de juego para poner por aquí un análisis más detallado de nuestra percepción de los precios, pero de momento quiero usar este post para pediros sugerencias. Si habéis leído hasta aquí, ¿qué más os gustaría añadir a Quanto?
Llevo un tiempo usando a diario Github Copilot: una IA de autocompletado de código que parece tener vida propia.
Un caso real buscando una API de conversión de moneda.
GitHub Copilot está disponible como una extensión para Visual Studio Code, Neovim y JetBrains. Va mandando el código y el contexto del entorno (lenguaje de programación usado, todo el código del proyecto y los nombres de los archivos) a los servidores de OpenAI, donde es completado y enviado de vuelta como una sugerencia. Al pulsar Tab, la sugerencia se añade al código, y al pulsar Esc se descarta.
Está basado en una IA llamada Codex, un descendiente de GPT-3 ajustado para su aplicación sobre lenguajes de programación y entrenado sobre todos los repositorios de dominio público de Github. Esto incluye código, comentarios y documentación en todos los lenguajes de programación imaginables.
Usarlo por primera vez es emocionante. Poner el nombre de una función y que genere no sólo su código sino también un enlace válido a una API de conversión de moneda parece sacado de una novela de ciencia ficción. Pero pasado el hype inicial es fácil ver que la herramienta no es perfecta. Necesita ser guiada para llegar al resultado esperado y hay que entender qué está escribiendo para no perder el control.
Por ejemplo, en el segundo 0:30 del vídeo anterior intenta usar un servicio de pago, así que defino una URL del Banco Central Europeo para darle una pista de qué herramientas usar. Y aun así, el código generado no es perfecto y hay que corregir a mano la expresión regular para parsear los datos.
Las pirámides de la muerte son uno de sus errores más típicos.
Aun así, decidí dejar el plugin activado durante los últimos 5 meses, y entre trabajar y programar por hobby lo he probado con muchos lenguajes distintos: Python, JS, CSS, C++, PHP, SQL, Arduino, VBS, OpenScad, GLSL… y ha sido un cambio radical en mi forma habitual de programar. Uno de esos saltos que se producen pocas veces.
Cuando era pequeño, mi padre compraba la Computer Hoy todos los meses y yo me la leía de arriba a abajo. En una edición, había una guía que rezaba algo así como "aprenda a optimizar sus tareas con Visual Basic" y por algún motivo me dio por seguirla. Cuando vi la magia que había en pensar una idea, describírsela a un ordenador y verla hecha realidad, sentí el primero de esos saltos.
Desde entonces, empecé a programar en VBS sin mucho más que aquella guía y unas fotocopias que alguien me consiguió. Mi forma de resolver mis necesidades era mirar esos 20 folios fotocopiados una y otra vez hasta que daba con una respuesta. Cuando los folios ya estaban ajados y amarillentos, llegó internet a casa y se produjo el siguiente salto.
Programar se volvió muy distinto. Ahora mi conocimiento no se limitaba a unos pocos folios, sino a la referencia completa de Visual Basic o cualquier otro lenguaje que quisiera aprender. Y entre referencias online, foros e hilos de correo seguí programando hasta empezar la Universidad, que fue cuando aprendí lo que era un IDE con debugger.
Ese salto también fue muy grande. Ahora podía escribir en un editor de texto que le ponía colores a mi código, me autocompletaba algunos métodos, me permitía navegar por la referencia del lenguaje con solo pulsar Ctrl+Space y ver línea a línea cómo cambiaba el estado de mi aplicación. Y por si fuera poco ahora el foro era Stack Overflow.
En la actualidad sigo programando así, pero cuento con otro as en la manga: la habilidad de no mirar una API si no recuerdo algo, de dejar al IDE terminar mi código siguiendo el mismo estilo de mi codebase, y en general de dedicarme a la parte divertida de la programación en vez de pelearme con la API de Matplotlib, Puppeteer o PyTorch.
Programando reconocimiento de imagen con una webcam en una Raspberry con sólo pedírselo por favor en un comentario.
Cuando salió Copilot todas las opiniones con una semana de uso eran que iba a reemplazar a los programadores y que era una herramienta mágica, por eso me quise esperar a haberlo probado un buen tiempo para entender cuál era su sitio en la caja de herramientas del programador. Y mi conclusión es que es muy, muy útil si se usa con algo de filosofía.
Es fácil dejarse llevar por las soluciones que propone Copilot (al fin y al cabo no hay Oscar al mejor código). Pero como no es perfecto, sin saber qué está haciendo es fácil hacer código poco funcional. O lo que es peor: funcional pero con vulnerabilidades difíciles de detectar. Algo parecido a hacer copy-paste indiscriminado de Stack Overflow.
Está claro que hay una tendencia hacia una programación cada vez más asistida. Y si el futuro está en herramientas como Copilot, tendremos que atajar retos como evitar la distracción de las recomendaciones o favorecer el pensamiento crítico ante sugerencias que impliquen malas prácticas y aproximaciones anticuadas; algo parecido a lo que ocurre con las IAs entrenadas en datasets reales y sus prejuicios adquiridos.
Por el momento podemos probarlo para entender mejor sus implicaciones. Si has leído hasta aquí y estás interesado, te gustará saber que la telemetría sólo se usa para ver qué soluciones son aceptadas, pero el código que se escribe no alimenta al modelo. Siendo un producto de Windows es probable que estén tirando la caña para pescarnos luego con un servicio de suscripción, así que podéis apuntaros a la beta antes de que sea demasiado tarde.
Todos los vídeos de este post han sido generados así, sin tener que mirar la referencia de FFMPEG por enésima vez.
Este fin de semana he estado en la Global Game Jam (GGJ) haciendo un juego en 48 horas junto a @pabletos y @j_coronel. El resultado ha quedado bastante guay así que lo dejo por aquí.
Una game jam es un evento en el que los participantes tienen que desarrollar un juego en torno a un tema con un límite de tiempo. La GGJ es un evento anual a nivel mundial con sedes físicas por todo el mundo, como la que ofreció espacio_RES en esta ocasión. El límite eran 48 horas y el tema era Duality.
Ya habíamos participado en otras jams anteriormente como la Familiar Game Jam, Ludum Dare o GM48; pero este es uno de los juegos que más cerrados han quedado en tan poco tiempo. La mecánica consiste en superar niveles de un roguelike (un juego de exploración por turnos) añadiendo fichas a un tablero.
El comportamiento del tablero es bastante sencillo: va leyendo las instrucciones de arriba hacia abajo (como una máquina de Turing) y aplicándolas sobre el jugador. La mecánica es bastante emergente y con muy pocos elementos se pueden encontrar muchas estrategias distintas, así que seguiremos puliéndolo para subirlo a la App Store.
Pese a haber participado en muchas jams, esta ha sido la primera en la que no hemos ido a la modalidad remota. Y aunque eso de estar en una casa 48 horas en modo cueva haciendo un juego no está nada mal, conocer a tantos desarrolladores, diseñadores y artistas tan buenos no tiene comparación, así que definitivamente repetiremos.
Las siguientes conversaciones han sido completamente generadas por una inteligencia artificial a la que sólo le he suministrado las tres primeras frases en negrita:
-/-<>
La magia que hay detrás de este autocompletar hipervitaminado es GPT-3, un algoritmo entrenado para continuar textos de forma convincente. En algunos casos logra captar rasgos tan sutiles y humanos como el humor mientras mantiene conversaciones complejas alrededor de un tema.
GPT-3 pertenece a la familia de algoritmos conocidos como transformers, que han demostrado ser muy efectivos reconociendo patrones complejos en secuencias de elementos. Tratando el lenguaje como una secuencia de palabras se pueden entrenar para que, dado un texto de entrada (contexto), lo complete de la forma más creíble.
Gracias al Information Sciences Institute de Los Ángeles he recibido una invitación para probar esta herramienta, una de las más avanzadas en la actualidad, el Optimus Prime del lenguaje natural. Ya ha cosechado muchos éxitos resolviendo retos basados en texto como mantener conversaciones indistinguibles de las de un humano, ayudar a escribir novelas o incluso programar software a petición.
Un grado tan profundo de entendimiento del lenguaje natural puede mejorar enormemente nuestra forma de comunicarnos con interfaces conversacionales como Google Assistant o Alexa. Y como un gran poder conlleva una gran responsabilidad, la empresa que hay detrás de esta herramienta la está abriendo al público de forma gradual y con cautela. Actualmente, sólo es posible usarla por invitación o pagando una suscripción con una tarifa por número de palabras generadas.
Pero lo que está inventado ya no se puede desinventar y han surgido una infinidad de proyectos que intentan replicar los éxitos recientes de GPT-3 en abierto. De hecho, cualquier persona sin ningún conocimiento de machine learning ya se puede instalar la versión open source GPT-Neo y probarla con un solo click (y una buena tarjeta gráfica).
Estas alternativas son bastante recientes -tienen menos de 6 meses- por lo que el tsunami de bots indistinguibles de un humano aun está por llegar, aunque ya se han visto algunos casos de mal uso, principalmente destinados a manipular la opinión pública para hacer bulto en los seguidores de un partido político o alterar la valoración de criptomonedas.
Hay estudios recientes que dicen que un 15% de las cuentas de Twitter podrían ser bots, y nuestros mecanismos para detectarlos aun son bastante poco efectivos. Y al igual que las fake news, han venido para quedarse, así que habrá que ir pensando soluciones escalables para distinguir humanos y bots. Al menos hasta que tengamos un test de Voight-Kampff.
En este proyecto he analizado la evolución de color en los videojuegos. He ido descargando longplays —vídeos de alguien pasándose un juego entero— y convirtiendo el color predominante de cada fotograma en una línea vertical, creando una línea de tiempo.
Al analizar los videojuegos desde este punto de vista he encontrado muchos patrones que se repiten. Aquí hablo de los que me han parecido más curiosos pero podéis verlos todos en el link al proyecto:
Algunos juegos usan el espectro para dar sensación de progreso al jugador. En Journey empezamos en un desierto y conforme resolvemos ciertos puzzles vamos descubriendo otras partes del mundo y el color va cambiando.
Otros juegos también usan el color para dar sensación de progreso, aunque de forma más directa: dividen el juego en mundos y cada uno de ellos tiene una paleta distinta. En algunos juegos con dinámicas poco cambiantes como Bit Trip Runner este recurso da más sensación de variedad. Es curioso cómo suelen empezar con tonos verdes y luminosos y van cambiando hacia tonos rojos y oscuros.
También hay juegos que no limitan la evolución del color al propio juego, sino que va cambiando a lo largo de una saga completa. Es el caso de Diablo, Elder Scrolls o BioShock. En todos ellos el color se va volviendo más vivo de un juego al siguiente. El caso de Diablo III fue bastante sonado y todo el mundo se quejaba de lo colorido que era.
La mayoría de juegos también usan el color para dar identidad al juego y muchos se pueden identificar fácilmente con solo ver la paleta de color. Algunos juegos como GRIS y Celeste no hacen honor a sus nombres, pero tienen una paleta que cualquiera que haya jugado podrá identificar.
Además de los juegos de este post he subido otros bastante curiosos, como la saga completa de Zelda, GTA o Final Fantasy. Pero no quería dejar de poner aquí otros juegos cuya paleta es simplemente espectacular y no se me ocurría ninguna otra excusa.
Empecé este post como una continuación del que escribí sobre el nombre de los colores, e inicialmente sólo pretendía sacar una paleta de color, no una línea temporal. Pero cuando vi lo que hizo el artista Dillon Baker con películas pensé que sería más interesante emularlo con videojuegos.
Para obtener los longplays, he usado la librería de descarga de vídeos online youtube-dl que hace poco retiró Github tras una denuncia de la SGAE estadounidense. La denuncia ha catapultado la popularidad de esta librería produciendo un efecto Streisand en toda regla y ya ha sido restaurada.
Lo más complicado tal vez ha sido identificar el color predominante de cada fotograma, que sigue siendo un campo de investigación activo. Probé a usar la media de todos los colores en pantalla, pero pasaba lo mismo que al mezclar todas las plastilinas y sale una masa de color gris y marrón. Así que terminé haciendo un clustering de los colores de la imagen y quedándome con el color que representa el cluster más grande.
El Papers, Please es gris de todas formas.
He pensado en subir a RedBubble versiones en alta resolución de estas líneas temporales en forma de cuadros, pero crear un producto por cada juego es un trabajo de chinos, así que si estáis interesados en alguno en particular podéis dejar un comentario y lo subiré de forma individual.