惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Heimdal Security Blog
A
Arctic Wolf
K
Kaspersky official blog
V
Vulnerabilities – Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Simon Willison's Weblog
Simon Willison's Weblog
L
LINUX DO - 热门话题
MongoDB | Blog
MongoDB | Blog
T
Threat Research - Cisco Blogs
D
Docker
爱范儿
爱范儿
T
Tenable Blog
C
Check Point Blog
B
Blog
C
Cisco Blogs
Vercel News
Vercel News
The Cloudflare Blog
T
Threatpost
NISL@THU
NISL@THU
T
Tor Project blog
V2EX - 技术
V2EX - 技术
P
Palo Alto Networks Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tailwind CSS Blog
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
SecWiki News
SecWiki News
博客园 - 司徒正美
S
Security @ Cisco Blogs
GbyAI
GbyAI
S
Secure Thoughts
Microsoft Security Blog
Microsoft Security Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Cloudbric
Cloudbric
Webroot Blog
Webroot Blog
N
News and Events Feed by Topic
Y
Y Combinator Blog
博客园_首页
T
Troy Hunt's Blog
The Hacker News
The Hacker News
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
U
Unit 42
AWS News Blog
AWS News Blog
PCI Perspectives
PCI Perspectives
V
Visual Studio Blog
博客园 - 聂微东
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Jerry's Map: 4.000 paneles dictados por un mazo de ~100 cartas
lu1tr0n · 2026-06-24 · via DEV Community

En 1963, un hombre llamado Jerry Gretzinger empezó a dibujar el mapa de una ciudad que no existe. Seis décadas después, ese mapa supera los 4.000 paneles y sigue creciendo, pero hay un detalle que lo vuelve fascinante para cualquier programador: Jerry casi no decide qué dibujar. Lo decide un mazo de cartas.

Cada jornada saca una carta, lee una instrucción y la ejecuta. El resultado es un ejercicio de generación procedimental hecho a mano, sin una sola línea de código, que lleva funcionando más tiempo que casi cualquier software que uses hoy.

TL;DR

  • Jerry Gretzinger empezó su mapa de una ciudad imaginaria en 1963; lo guardó en 1983 y lo retomó años después al reencontrarlo su hijo.
  • El proyecto supera los 4.000 paneles de 8×10 pulgadas que, ensamblados, forman un círculo enorme con coordenadas N, S, E y O desde el centro.
  • Un mazo de unas 100 cartas hechas a mano dicta cada acción: pintar, sembrar paneles nuevos, mezclar color o modificar el propio mazo.
  • Es un autómata manual: reglas fijas más instrucciones aleatorias producen una ciudad emergente que nadie diseñó por completo.
  • Algunas cartas se autorreferencian: añaden, quitan o barajan cartas, igual que un programa que reescribe su propia configuración.
  • Es generación procedimental sin computadora: el mismo principio detrás de No Man's Sky, Minecraft o Dwarf Fortress.
  • Gretzinger se describe como observador, no autor: el azar del mazo decide y su mano solo ejecuta la instrucción.

Qué es Jerry's Map y por qué le importa a un programador

Jerry's Map nació como un garabato. Gretzinger trabajaba en un empleo tedioso y, en su tiempo libre, empezó a dibujar el plano de una ciudad imaginaria. Fue añadiendo hojas durante años hasta que, en 1983, dejó el proyecto de lado y lo guardó en el ático de su casa en Cold Spring, Nueva York. Allí juntó polvo hasta que su hijo Henry lo encontró un día revolviendo cosas, lo bajó y preguntó qué era. Verlo de nuevo bastó para que Jerry lo retomara.

Hoy ese mapa es un "mundo virtual" bidimensional compuesto por más de 4.000 paneles individuales de ocho por diez pulgadas. Al ensamblarlos forman un círculo aproximado, donde cada posición se define con coordenadas N, S, E y O que parten del centro. La clave del sistema: las posiciones de la matriz no cambian nunca, pero los paneles que las ocupan se revisan continuamente. La ejecución física combina acrílico, marcador, lápiz de color, tinta, collage e impresión inkjet sobre papel grueso.

Para un desarrollador, esto suena familiar: una cuadrícula de celdas con coordenadas estables y contenido mutable. Lo que cambia es cómo se decide ese contenido. Y ahí entra el mazo, que convierte el proyecto en un caso de estudio de generación procedimental analógica.

Cada panel ocupa una coordenada fija; el contenido se reescribe con cada carta.

El mazo de cartas: un generador de instrucciones

El mazo empezó siendo trivial. Cuando el mapa era pequeño, Jerry trabajaba hoja por hoja sin problema, pero al crecer a cientos de paneles se volvió tedioso recorrer la pila. Su solución fue el generador de números aleatorios más simple que se le ocurrió: "Sacaba una carta y bajaba esa cantidad de paneles en la pila". Con el tiempo, en lugar de números sueltos, empezó a escribir instrucciones en las cartas. El mazo contemporáneo deriva de una baraja de naipes y hoy ronda las 100 cartas, porque se añaden, revisan y retiran constantemente.

El ciclo es estrictamente secuencial: una vuelta empieza solo cuando las tareas de la carta anterior están completas. Eso puede tomar desde unos minutos hasta varios días.

graph TD
  A["Robar una carta del mazo"] --> B["Leer número y categoría"]
  B --> C["Cubrir N pulgadas cuadradas / ejecutar tarea"]
  C --> D{"¿Tareas de la carta completas?"}
  D -->|si| A
  D -->|no| C

Cada carta lleva un número grande, negro o rojo, en una esquina superior. Una "tarea" es completar tantas unidades de trabajo como indique ese número, y una unidad equivale a un número de cuadritos de una pulgada a cubrir. Las instrucciones para el artista se agrupan en cinco categorías generales:

  • Trabajar paneles — subir a la siguiente dimensión (vacío, rojo, negro, zigurat), salpicar pintura en cuatro paneles contiguos, crear un panel semilla, mezclar un color nuevo o serigrafiar nueve paneles contiguos.
  • Collage — actualizar y copiar el maestro en la cima de la pila, o copiar el panel actual en papel adhesivo para reutilizar fragmentos.
  • Crear un panel en blanco — con cartón impreso reusado (cajas de cereal), una foto del archivo del artista o una impresión lumen.
  • Trabajar el mazo — sumar o restar al número de ciertas cartas, eliminar o añadir una carta, copiar y retirar las últimas nueve, o barajar.
  • Otras — escribir una entrada de blog, una de diario, un post en Reddit o calcular el valor de venta del conjunto según la última subasta en eBay.

Hay incluso cartas para un "ayudante" del artista, dedicadas a escanear, ordenar, copiar y gestionar el inventario de los archivos.

Reglas, restricciones y aleatoriedad controlada

Lo que convierte a Jerry's Map en algo más que un pasatiempo es la tensión entre lo fijo y lo mutable. La cuadrícula de coordenadas es inmutable; el contenido de cada panel es totalmente revisable. Encima de esa estructura corre un bucle determinista —el conjunto de reglas— alimentado por una fuente de azar —la carta robada—. Es exactamente el patrón de un sistema generativo bien diseñado: reglas estrictas más entropía acotada producen variedad sin caos.

💭 Clave: Las cartas que modifican el mazo hacen del sistema un programa autorreferencial. Una instrucción puede reescribir las instrucciones futuras, como un script que edita su propio archivo de configuración en tiempo de ejecución.

El detalle más "de ingeniería" es cómo se gestiona la evolución de las reglas. Las cartas retiradas se retiran para siempre como objeto físico, pero sus instrucciones se conservan en una lista para una posible reutilización en cartas futuras. El espacio de reglas no se borra: muta y recicla, parecido a cómo un genoma conserva material que puede reactivarse. El mazo, en palabras del propio Gretzinger, está vivo porque cambia constantemente.

El mazo es a la vez el generador de azar y el conjunto de reglas.

Paralelos con la generación procedimental en software

Si traducimos el sistema de Jerry a código, el paralelo con la generación procedimental moderna es inmediato. El mazo es un PRNG (generador pseudoaleatorio) combinado con una tabla de instrucciones; cada carta es a la vez una semilla parcial y una operación sobre el estado del mundo. Es el mismo esquema que usan los videojuegos para crear universos enormes a partir de poca información: una semilla, un conjunto de reglas y mucha iteración.

Podemos modelar el motor de cartas en unas pocas líneas de Python:

import random
from dataclasses import dataclass

@dataclass
class Carta:
    numero: int       # unidades de trabajo a cubrir
    categoria: str    # "pintar", "sembrar", "color", "mazo"

def construir_mazo(semilla=1963):
    rng = random.Random(semilla)
    mazo  = [Carta(rng.randint(1, 9), "pintar")  for _ in range(80)]
    mazo += [Carta(0, "sembrar") for _ in range(8)]
    mazo += [Carta(0, "color")   for _ in range(6)]
    mazo += [Carta(0, "mazo")    for _ in range(6)]  # cartas que editan el mazo
    rng.shuffle(mazo)
    return rng, mazo

def aplicar(carta, mazo, rng):
    if carta.categoria == "mazo":
        # la regla se reescribe a si misma: anade una carta nueva
        mazo.insert(0, Carta(rng.randint(1, 9), "pintar"))
    return f"{carta.categoria}: {carta.numero} unidades"

def ejecutar(ciclos=5, semilla=1963):
    rng, mazo = construir_mazo(semilla)
    for _ in range(ciclos):
        if not mazo:
            rng, mazo = construir_mazo(semilla)
        print(aplicar(mazo.pop(), mazo, rng))

if __name__ == "__main__":
    ejecutar()

Con la misma semilla, la secuencia de cartas es reproducible: dos personas que ejecuten el script obtienen la misma ciudad. Eso es precisamente lo que hace valioso al determinismo en estos sistemas. Para correr el ejemplo:

# Windows (PowerShell o CMD)
python jerry.py

# macOS
python3 jerry.py

# Linux
python3 jerry.py

💡 Tip: Fijar la semilla del PRNG (como random.Random(semilla)) es la diferencia entre "aleatorio y reproducible" y "aleatorio e irrepetible". En generación procedimental casi siempre querés lo primero: poder regenerar exactamente el mismo mundo a partir de un número.

La familia de técnicas es amplia: ruido de Perlin para terrenos, sistemas-L para vegetación, autómatas celulares para cuevas, y Wave Function Collapse para mosaicos coherentes. No Man's Sky genera 18 trillones (quintillion en inglés) de planetas con este enfoque; Minecraft y Dwarf Fortress construyen mundos completos a partir de una semilla. Jerry's Map es el mismo concepto, pero con acrílico y cartón en lugar de shaders.

El artista como observador: autoría y sistemas emergentes

Gretzinger lo resume con una frase que cualquiera que haya visto comportamientos emergentes reconocerá: "Mi mano pone la pintura sobre el papel, pero doy un paso atrás y miro las hojas como si yo no fuera el perpetrador, sino apenas el observador". Es la misma sensación que produce mirar el Juego de la Vida de Conway: reglas simples, cero jugadores, y patrones complejos que parecen tener intención propia.

Esa idea —el creador como espectador de su propio sistema— es el corazón del arte generativo. El autor diseña las reglas y la fuente de azar, pero el resultado concreto lo produce el proceso. La autoría se desplaza del trazo individual al diseño del sistema. En software lo vivimos cada vez que un algoritmo nos sorprende con una solución que no programamos explícitamente.

Datos y cifras

  • 1963: año en que comenzó el mapa, como garabato en un trabajo aburrido.
  • 1983: año en que Gretzinger lo dejó de lado y lo guardó en el ático.
  • +4.000: paneles individuales que componen el mapa actual.
  • 8 × 10 pulgadas: tamaño de cada panel; ensamblados forman un círculo.
  • ~100: cartas en el mazo contemporáneo (número variable por diseño).
  • 1 pulgada cuadrada: unidad de trabajo que define el tamaño de cada tarea.

Qué nos enseña en la era del contenido generado por IA

Jerry's Map llega en un momento curioso. Mientras la red se llena de imágenes generadas por IA en segundos, aquí tenemos un sistema generativo que lleva más de 60 años produciendo una sola obra, a ritmo de una carta por sesión. La diferencia no es la aleatoriedad —ambos la usan— sino la combinación de restricción fuerte, iteración lenta y un humano en el bucle que ejecuta cada paso a mano.

Para quien diseña sistemas, la lección es de diseño, no de nostalgia: la calidad de un sistema generativo depende menos de cuánto azar metas y más de qué tan buenas sean tus reglas y tus restricciones. Un mazo de 100 cartas bien pensadas, sobre una cuadrícula de coordenadas fijas, basta para sostener un mundo coherente durante décadas. La aleatoriedad sin reglas es ruido; las reglas sin aleatoriedad son repetición. El punto interesante está en el medio.

Hacia adelante, el proyecto sigue activo y ha inspirado a una comunidad de "map makers" que replican el método. El blog original en Blogger ya no se actualiza, pero documenta años de decisiones del sistema, y existe un subreddit dedicado a mapear al estilo de Jerry. Es, probablemente, el experimento de generación procedimental más longevo y de menor presupuesto que vas a encontrar.

📖 Resumen en Telegram: Ver resumen

Preguntas frecuentes

¿Qué es exactamente Jerry's Map?

Es un proyecto artístico iniciado en 1963 por Jerry Gretzinger: el mapa de una ciudad imaginaria compuesto por más de 4.000 paneles de 8×10 pulgadas. Su contenido se revisa continuamente siguiendo instrucciones extraídas de un mazo de cartas hecho a mano.

¿Por qué se considera generación procedimental?

Porque el contenido no se diseña pieza por pieza, sino que emerge de aplicar un conjunto de reglas fijas a instrucciones aleatorias (las cartas). Es el mismo principio que usan los videojuegos para generar mundos, solo que ejecutado a mano sobre papel.

¿Cómo funciona el mazo de cartas?

Cada carta tiene un número (unidades de trabajo) y una categoría de tarea: pintar paneles, crear paneles nuevos, mezclar colores o incluso modificar el propio mazo añadiendo, quitando o barajando cartas. El artista roba una carta, ejecuta la tarea y solo entonces pasa a la siguiente.

¿Se parece al Juego de la Vida de Conway?

Comparte el espíritu: reglas simples sobre una cuadrícula producen patrones complejos que nadie diseñó explícitamente. La diferencia es que Jerry's Map introduce azar (las cartas) y un humano que ejecuta cada paso, en lugar de evolucionar de forma automática y determinista.

¿Puedo simular un sistema así en código?

Sí. Basta un PRNG con semilla fija, una lista de "cartas" con número y categoría, y un bucle que aplica cada instrucción al estado del mundo. El ejemplo en Python de este artículo muestra una versión mínima reproducible.

Referencias

📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.