¿Acabaremos programando todos en nanolang?

Hace casi un año escribí ¿Acabaremos programando todos en ensamblador?, que comenzaba así: Un lenguaje de programación es un lenguaje que media entre el que nos es familiar a los humanos y el que reconocen las computadoras. Los lenguajes de alto nivel nos resultan más cómodos; los de bajo nivel, más crípticos. Todos conocemos, pienso, el trade-off. Hay lenguajes muy próximos a los humanos, como scratch o logo. Otros, a la máquina, como C o ensamblador. Mucha gente opta por uno en la zona media del espectro, como Python. ...

28 de enero de 2026 · Carlos J. Gil Bellosta

El teorema de Napoleón via SymPy

Durante el pasado periodo estival, como es tradición, me extrajeron alevosamente de la M-30. Me introdujeron en una caja metálica, me amarraron a una silla y me torturaron durante seis horas, en el transcurso de las cuales, las únicas percepciones del mundo exterior que impactaron mis sentidos fueron calor, ruido, cerros, pinos y dolores en las asentaderas. Como no había otra cosa que hacer y tenía frescos los enunciados de los problemas de la última olimpiada internacional de matemáticas —que, como recordarán los lectores del blog, tuvo cierto impacto mediático por el excelente resultado logrado en ella por los LLMs más avanzados—, me puse con uno de ellos. Estoy muy pagado de mí mismo por el hecho de que, salvo por un par de cabos sueltos que solo pude rematar cuando conseguí lápiz, papel y silencio, dejé uno de ellos prácticamente resuelto. ...

4 de septiembre de 2025 · Carlos J. Gil Bellosta

Migración de Pocket a Wallabag

Creo que en alguna ocasión he hablado de mi infraestructura para industrializar mi proceso de lectura. A grandes rasgos, funcionaba así: Uso Pocket como repositorio central. Una de las ventajas que ofrece es que dispone de una API pública para operar sobre él. Sigo unos cuantos blogs e importo los RSS a Pocket en un proceso diario que corre vía cron en mi servidor doméstico. Además, en Pocket almaceno artículos interesantes que encontraba mientras navegaba. Un proceso horario reclasifica esos enlaces bajo distintas etiquetas específicas para: Entradas que leer más despacio (p.e., el fin de semana, frecuentemente con el apoyo de NotebookLM). Entradas que archivar en Obsidian. Entradas que me inspiran a escribir sobre asuntos en el blog. Etc. Una de las etiquetas, resumir se asocia a enlaces cuyos contenidos paso luego por un LLM para obtener un resumen del texto. La entrada en cuestión se reetiqueta como resumida y, una vez leído el resumen, considero las distintas opciones: borrarla, reetiquetarla de nuevo, etc. Todo el proceso ocurre con un alto grado de automatización: ...

8 de mayo de 2025 · Carlos J. Gil Bellosta

Ahora el blog tiene una lista de entradas relacionadas construida usando LLMs

He implementado las entradas relacionadas en el blog. Dos entradas están relacionadas cuando el producto escalar de sus embeddings es alto. Así que en primer lugar he asociado a cada entrada un embedding. Las entradas son ficheros de markdown con un preámbulo en yaml. Los embeddings no están creados directamente sobre el texto bruto de la entrada sino sobre la entrada y algunos de los elementos, no todos, del preámbulo. ...

27 de marzo de 2025 · Carlos J. Gil Bellosta

¿Acabaremos programando todos en ensamblador?

Un lenguaje de programación es un lenguaje que media entre el que nos es familiar a los humanos y el que reconocen las computadoras. Los lenguajes de alto nivel nos resultan más cómodos; los de bajo nivel, más crípticos. Todos conocemos, pienso, el trade-off. Ahora todo el mundo programa en Python. Pero los hay que lo hacen de una manera rara: Hay un nuevo tipo de programación que llamo [Andrej Karpathy] “programación de vibraciones”, en la que te entregas por completo a las vibraciones, adoptas exponenciales y te olvidas de que el código existe. Es posible porque los LLM (por ejemplo, Cursor Composer con Sonnet) se están volviendo demasiado buenos. Además, solo hablo con Composer usando SuperWhisper, por lo que apenas toco el teclado. Pido las cosas más tontas como “reducir el relleno en la barra lateral a la mitad” porque soy demasiado vago para buscarlo. “Acepto todo” siempre, ya no leo los diffs. Cuando recibo mensajes de error, simplemente los copio y pego sin comentarios; generalmente, eso lo soluciona. El código crece más allá de mi comprensión habitual, tendría que leerlo realmente durante un tiempo. A veces, los LLM no pueden corregir un error, así que simplemente busco alternativas o pido cambios aleatorios hasta que desaparece. No está tan mal para proyectos de fin de semana intrascendentes, pero sigue siendo bastante divertido. Estoy desarrollando un proyecto o una aplicación web, pero en realidad no es programación: solo veo cosas, digo cosas, ejecuto cosas y copio y pego cosas, y en general funciona. ...

27 de febrero de 2025 · Carlos J. Gil Bellosta

El bee-bot vía "artefactos" de Claude

El “bee-bot” es un juego infantil educativo no particularmente barato. Así que he construido una versión web de la cosa en poco rato. En particular, le he dicho a Claude: I want to create a webpage to play a version of the bee-bot game for children. In the main canvas there is a grid. In two random squares of the grid, there are a bee and a flower. The interface are four buttons with numbers 1-4, four arrows and a go button. The child needs to type the sequence of numbers and arrows and when the go button is pressed, the bee will move. Say, if the sequence is 2, up, 4, right, 2, the bee will move two squares, then turn up, advance 4 squares, turn right, and move two squares. ...

24 de octubre de 2024 · Carlos J. Gil Bellosta

Un truco probabilístico para balanceadores de carga

Tienes N servidores y un balanceador de carga. Las peticiones de trabajo llegan al balanceador y este las enruta hacia un servidor que se encarga de procesarlas. El objetivo del balanceador es tratar de conseguir un reparto más o menos uniforme de las tareas para que ningún servidor esté sobrecargado mientras otros permanecen ociosos. En términos probabilísticos, tratar de obtener una distribución uniforme (de la carga de trabajo). Un mecanismo rudimentario de balanceo que parece que se usa por ahí es asignar las tareas al azar. Es simple y es en el fondo como muestreamos la distribución uniforme. Pero no todas las distribuciones uniformes son iguales. Por muchos motivos, son interesantes versiones de la distribución uniforme más uniformes; para convencerse de ello uno puede leer lo que Wikipedia cuenta sobre las sucesiones de Sobol o aquí sobre los ruidos azules. Con los balanceadores de carga pasa lo mismo. Así, al parecer, debe de ser una gran innovación hacer lo siguiente: ...

27 de febrero de 2024 · Carlos J. Gil Bellosta

Mi última aplicación de los LLMs en producción

Esta entrada bien podría llamarse también Mi primera aplicación de los LLMs en producción, siendo que ninguna versión falta a la verdad. También es cierto que no es la primera que construyo —pero sin que haya trascendido—; y que hay que cualificar la expresión en producción siendo que corre en mi servidor doméstico y para mis propios fines personales. Contexto Estoy industrializando mi proceso de lectura. Central en él es Pocket, una herramienta que permite archivar enlaces y acceder a ellos vía API. ...

6 de febrero de 2024 · Carlos J. Gil Bellosta

Números aleatorios, estado interno y su relación con el paralelismo

I. En primer lugar, no voy a hablar de números aleatorios sino seudoaleatorios. Resumiéndolo todo mucho, un generador de números seudoaleatorios (PRNG en lo que sigue) es una función que a partir de una secuencia fácilmente adivinable (p.e., 0, 1, 2,…) genera otra de números con apariencia aleatoria. Los números de la secuencia adivinable constituirían los distintos estados del PRNG. En R, Python y otros lenguajes populares, el generador de números aleatorios hace dos cosas: generar un número aleatorio y actualizar el estado. ...

11 de julio de 2023 · Carlos J. Gil Bellosta

Mnemo, la aplicación

Mnemo es una pequeña aplicación que he construido para ayudarme a recordar esas cosas que me consta que se me van a olvidar: palabras, conceptos simples, nombres de personas, etc. Externamente se ve como un canal (privado) de Telegram en el que un par de veces al día me aparecen notificaciones con un resumen de la cosa. Internamente, es la combinación de tres cosas: Una base de datos en Notion. Un bot de Telegram. Un workflow de n8n que corre en mi servidor local y que orquesta todo el proceso. La base de datos la actualizo manualmente. Cada vez que tropiezo con algo que merece la pena ser recordado, añado un registro con información básica: un rótulo, una breve descripción, un enlace para indagar más. ...

29 de junio de 2023 · Carlos J. Gil Bellosta