Tiempo: 3 horas · Meta: completar 7 u 8 mini-retos y, si te alcanza, una app integrada (código 4900) que reutilice tus propios módulos. Lenguajes: Python, JavaScript (Node ≥18) o Java (≥11).
- Haz fork y clónalo.
- Usa un <ALIAS> sin espacios ni acentos (tu usuario de GitHub o
nombre-apellidoen minúsculas). - Cada mini-reto va en un archivo con nombre exacto:
<CODIGO_RETO>_<ALIAS>_v<N>.<ext>(ej.:4004_carlos-perez_v1.pyo4004_carlos-perez_v1.js). - Si haces la app, crea
4900_<ALIAS>_app/conREADME.md(cómo ejecutar), y si quieressrc/yrequirements.txt/package.json/pom.xml. - Abre un Pull Request a
maintitulado: <ALIAS> — Entrega Nivel Integraciones.
- Mini-retos: 4001–4008 (elige 7 u 8).
- App integrada: 4900 (Service Stitcher).
Nombre de archivo obligatorio: <CODIGO_RETO>_<ALIAS>_v<N>.<ext>
Usa solo librerías estándar del lenguaje. Al final de cada archivo incluye, en comentarios, 3 pruebas (entrada → salida esperada). La salida se compara literalmente. Donde se pida módulo/primitive específico, debes usarlo.
| Código | Nombre | Requisitos de integración | Entrada / Salida | Archivo | Docs útiles |
|---|---|---|---|---|---|
| 4001 | CRUD usuarios (almacenamiento local) | Python: sqlite3. Node: fs JSON con escritura atómica (tmp → rename). Java: JSON plano con Files + Paths (atómico). Campos: id,nombre,email,rol. Comandos: ADD/GET/DEL/LIST. Email duplicado → ERROR:DUP. Formato LIST ordenado por id. | Líneas de comandos por stdin. Salida: registros como id,nombre <email> rol o errores exactos. | 4001_<ALIAS>_v1.(py|js|java) | Py: sqlite3 · Node: fs · Java: java.nio.file |
| 4002 | Cliente HTTP (monedas) con backoff | Haz GET a un mock local (tú mismo puedes lanzar python -m http.server o usar archivos). Python: urllib.request, Node: fetch nativo, Java: HttpClient. Si 429/503: exponential backoff + jitter (semilla --seed para reproducir). Imprime conversión amount from→to = total. | Entrada: amount from to y ruta del JSON mock (archivo o http://localhost). Salida exacta en una línea. | 4002_<ALIAS>_v1.(py|js|java) | Py: urllib.request · Java: java.net.http |
| 4003 | Webhook verifier (HMAC-SHA256) | Verifica petición simulada: lee body (JSON) y header X-Sign (hex). Calcula HMAC con una SECRET (por env SECRET o parámetro) usando hmac/crypto/Mac. Si coincide: imprime OK, si no: INVALID. Rechaza timestamp fuera de ±5 min si el body trae ts. | Entrada: archivo con JSON y header simulado. Salida: OK o INVALID. | 4003_<ALIAS>_v1.(py|js|java) | Py: hmac/hashlib · Node: crypto · Java: javax.crypto.Mac |
| 4004 | JWT-like HS256 (parse + verify) | Sin librerías externas: parsea header.payload.signature en Base64URL, verifica HS256 con HMAC-SHA256 y SECRET. Valida exp ≥ now y aud igual al esperado (parámetro). Imprime sub=... y role=... si es válido; si no, INVALID. | Entrada: token y SECRET (y aud esperado). Salida: sub=... role=... o INVALID. | 4004_<ALIAS>_v1.(py|js|java) | Py: base64/json/hmac · Node: Buffer/crypto · Java: Base64/Mac |
| 4005 | ETL CSV→JSON con esquema | Lee CSV (stdin o archivo), valida campos requeridos y tipos (implementa mini-schema tú mismo: required, tipo, rango). Si una fila no cumple, imprímela en ERR con motivo. Salida principal: JSON array válido en stdout (solo filas válidas). | Entrada: CSV con encabezados y un esquema simple (p.ej., archivo .schema.json). Salida: JSON en una línea y, en stderr o prefijo ERR:, los errores. | 4005_<ALIAS>_v1.(py|js|java) | Py: csv/json · Node: fs/stream · Java: java.io |
| 4006 | Rate limiter (token bucket) | Implementa token bucket (capacidad C, tasa R tps). Procesa una secuencia de timestamps y decide ALLOW/DROP. Debe ser determinista. Reporta uso final (tokens restantes). | Entrada: C R y luego timestamps (seg). Salida: por línea ALLOW/DROP; al final tokens=.... | 4006_<ALIAS>_v1.(py|js|java) | — |
| 4007 | Orquestador de tareas (secuencial + paralelo) | Lee una lista de “tareas” (archivo con pasos con duración simulada en ms). Ejecuta secuencial y en “paralelo controlado” (máx N concurrentes). Mide t_total para ambos modos. Python: threading/concurrent.futures (sin asyncio), Node: Promise con pool simple, Java: ExecutorService. Determinista con semilla para jitter opcional. | Entrada: JSON de tareas y N. Salida: seq=...ms y par(N)=...ms. | 4007_<ALIAS>_v1.(py|js|java) | Py: threading/concurrent · Java: java.util.concurrent |
| 4008 | Cache HTTP de archivos (ETag/Last-Modified) | Dado un archivo estático servido localmente (o ruta), simula peticiones condicionales: guarda ETag (hash SHA-256 del contenido) y Last-Modified (mtime). Si el contenido no cambia, responde 304; si cambia, 200 y actualiza metadatos. No usar frameworks; solo stdlib. | Entrada: ruta de archivo y secuencia de “peticiones”. Salida: una línea por petición con 200/304 y headers relevantes. | 4008_<ALIAS>_v1.(py|js|java) | Py: hashlib/os · Node: fs/crypto · Java: Files/MessageDigest |
- E/S exacta (comparación literal).
- 3 pruebas (entrada → salida) en comentarios al final del archivo.
- Solo librería estándar (sin paquetes externos).
- Nomenclatura exacta del archivo. Nombre incorrecto: −5%.
- Donde se pida: semilla reproducible (
--seed) y manejo de errores con mensajes exactos (ERROR:...).
| Código | Debe reutilizar | Qué agrega | Entregables | Puntaje máx. |
|---|---|---|---|---|
| 4900 | 4001, 4002, 4003, 4004, 4005 (y opcional 4006/4007/4008) | CLI que: (1) gestiona usuarios; (2) consume “APIs” desde mocks con backoff; (3) verifica webhooks HMAC; (4) valida tokens HS256; (5) realiza ETL CSV→JSON; (6) opcionalmente rate-limita y cachea recursos estáticos. Todo con módulos reutilizados de tus mini-retos. | Carpeta 4900_<ALIAS>_app/ con README.md (comandos), src/, y carpeta mocks/ (JSON de ejemplo). Incluye un demo reproducible con --seed y un script de prueba (run_demo.*). | 260 |
- Reutiliza tus módulos: impórtalos tal cual o muévelos a
src/sin reescribir. - Variables sensibles (SECRET, AUD) por
.envo variables de entorno; no las “quemes”. - Incluye logs mínimos (timestamp, nivel, acción) sin romper el formato de salida requerido por los retos.
- Mini-reto (máx. 120 pts): funciona (50%) · casos borde / 3 pruebas (20%) · robustez (errores, idempotencia, determinismo) (20%) · claridad (10%).
- App 4900 (máx. 260 pts): integración real (50%) · diseño/cohesión (20%) · manejo de errores y configuración (20%) · README/demo reproducible (10%).
- GUI/TUI para 4900 (Tkinter/Swing/Qt/curses) que opere usuarios, ETL y verificación de tokens: +40 pts.
- OpenAPI 3.0 (yaml/json) describiendo los “endpoints” de tus mocks + colección Postman o
httpie/curlscripts: +25 pts. - Dockerfile simple que ejecute el demo y monte
mocks/: +25 pts. - CI (script de pruebas local, sin servicios externos) que corra tus casos y valide salidas: +20 pts.
- Cache/Rate-limit integrados en 4900 (reuso de 4006/4008) con switches de línea de comandos: +15 pts.
- Registro estructurado (JSON lines) opcional en 4900 sin romper la salida base: +15 pts.
- Stdlib obligatoria: se evalúa uso de módulos nativos indicados (urllib/HttpClient/hmac/hashlib/sqlite3/fs...).
- Determinismo: semillas, orden fijo y formatos literales (p. ej.,
ERROR:..., rutas, headers). - Seguridad: verificaciones HMAC/JWT precisas (Base64URL, reloj, audiencias).
- Edición en vivo (≤2 min) en la defensa: se pedirá cambiar un header, un tiempo de backoff, o la clave HMAC para confirmar autoría.
- 7 u 8 mini-retos con nombres correctos:
400x_<ALIAS>_vN.(py|js|java). - 3 pruebas en comentarios por archivo.
- Si hiciste la app:
4900_<ALIAS>_app/+README.md+mocks/+ demo reproducible. - PR:
<ALIAS> — Entrega Nivel Integraciones.
Python: urllib.request · sqlite3 · hmac · hashlib · base64 · csv
Node (≥18): fetch · crypto · fs
Java (≥11): HttpClient · Mac · Base64 · Files