<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Abiel Jesrrel (Relly) Delgado Lee on Medium]]></title>
        <description><![CDATA[Stories by Abiel Jesrrel (Relly) Delgado Lee on Medium]]></description>
        <link>https://medium.com/@rellydev?source=rss-9154c93e4a34------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*9aecZfdofsv8QoBgMTbfpw@2x.jpeg</url>
            <title>Stories by Abiel Jesrrel (Relly) Delgado Lee on Medium</title>
            <link>https://medium.com/@rellydev?source=rss-9154c93e4a34------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 23 Jul 2026 01:07:24 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@rellydev/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[¡Contenedores en Google Cloud sin dolor!]]></title>
            <link>https://rellydev.medium.com/contenedores-en-google-cloud-sin-dolor-35b73e05c6b2?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/35b73e05c6b2</guid>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[runcloud]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Wed, 01 Apr 2026 15:02:22 GMT</pubDate>
            <atom:updated>2026-04-01T15:02:22.825Z</atom:updated>
            <content:encoded><![CDATA[<h3>¡Contenedores en Google Cloud sin dolor! 🚀 Guía Maestra: Desplegar Python en Cloud Run y Artifact Registry (Nivel Senior)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rp41CDPcqLETJzuu1dSEww.png" /><figcaption>Generated by Nano Banana Pro — Google</figcaption></figure><h3>Introducción: El “vibe” de Google Cloud</h3><p>¡Qué xopa, mis <strong>loquillos y loquillas del code</strong>! Bienvenidos a una nueva entrega de alto nivel técnico. Si ya dominamos cómo llevar contenedores a la nube de Microsoft, hoy vamos a cruzar el charco y aterrizar en el terreno de Mountain View.</p><p>Vamos a hablar de <strong>Google Cloud Platform (GCP)</strong>. GCP tiene una reputación bien ganada de ser la “nube para desarrolladores” por su enfoque <em>opinionated</em> y la potencia de su infraestructura subyacente (¡ellos inventaron Kubernetes, después de todo!).</p><p>Pero hoy no usaremos Kubernetes (GKE). Vamos por la joya de la corona de la simplicidad y el <em>serverless</em>: <strong>Cloud Run</strong>. Imaginen la facilidad de Azure Container Instances, pero con auto-escalado a cero y una integración nativa espectacular.</p><p>Hoy, les traigo el flujo definitivo de <strong>Python -&gt; Docker -&gt; Artifact Registry -&gt; Cloud Run</strong>. ¡A darle! 🔥</p><h3>1. El Puente: Un Dockerfile Reforzado para GCP</h3><p>El primer paso sigue siendo la contenerización, pero ajustaremos nuestro Dockerfile para cumplir con las mejores prácticas de Google Cloud (ligero, seguro y eficiente).</p><p><strong>File:</strong> Dockerfile</p><pre># Usamos una imagen oficial, ligera y segura<br>FROM python:3.11-slim-buster<br><br># Seteamos variables de entorno para Python<br>ENV PYTHONDONTWRITEBYTECODE 1<br>ENV PYTHONUNBUFFERED 1<br>ENV APP_HOME /app<br><br># Seteamos el directorio de trabajo<br>WORKDIR $APP_HOME<br><br># Copiamos solo requirements primero para cachear la capa de instalación<br>COPY requirements.txt .<br><br># Instalamos dependencias de producción.<br># Usamos pip install con opciones de limpieza para mantener la imagen pequeña.<br>RUN pip install --no-cache-dir -r requirements.txt \<br>    &amp;&amp; pip install --no-cache-dir gunicorn<br><br># Copiamos el resto del código de la aplicación<br>COPY . .<br><br># Cloud Run escucha por defecto en el puerto 8080.<br># Es mejor usar una variable de entorno $PORT asignada por GCP.<br>EXPOSE 8080<br><br># Usamos Gunicorn para producción, configurando workers.<br># Cloud Run gestiona los procesos, pero Gunicorn es robusto para Python.<br>CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app</pre><p><strong>Por qué esto es Nivel Senior:</strong></p><ul><li><strong>Base </strong><strong>slim vs </strong><strong>Alpine:</strong> En GCP, slim-buster es a menudo más estable que Alpine para ciertas librerías de Python compiladas y mantiene un tamaño bajo.</li><li><strong>Gestión de </strong><strong>PORT:</strong> Cloud Run inyecta dinámicamente la variable de entorno $PORT (generalmente 8080). Configuramos Gunicorn para escuchar ahí.</li><li><strong>CMD Robustecida:</strong> Usamos exec para que el proceso de Gunicorn reciba directamente las señales de parada del contenedor (como SIGTERM), esencial para un escalado a cero limpio.</li></ul><h3>2. La Bóveda: Google Artifact Registry</h3><p>GCP ha deprecado su antiguo Container Registry (GCR) a favor de <strong>Artifact Registry</strong>. Esta es la bóveda donde guardaremos nuestra imagen de forma segura antes de que Cloud Run la ejecute.</p><p><strong>Requisitos Previos (en tu consola local):</strong></p><pre># Login en GCP<br>gcloud auth login<br><br># Configura tu ID de Proyecto<br>gcloud config set project [TU_PROJECT_ID]<br><br># Habilita las APIs necesarias (¡Este paso es clave!)<br>gcloud services enable artifactregistry.googleapis.com \<br>                        run.googleapis.com</pre><p><strong>Paso A: Crear el Repositorio en Artifact Registry</strong></p><pre># Crea un repositorio de Docker en tu región preferida<br>gcloud artifacts repositories create my-python-repo \<br>    --repository-format=docker \<br>    --location=us-central1 \<br>    --description=&quot;Repositorio de Docker para RellyDev Apps&quot;</pre><p><strong>Paso B: Build, Tag, y Push (El flujo de RellyDev)</strong></p><pre># Autentica Docker con el repositorio de GCP (¡No necesitas claves manuales!)<br>gcloud auth configure-docker us-central1-docker.pkg.dev<br><br># Haz el build localmente (asegúrate de que tu app se llama &#39;my-python-app&#39;)<br>docker build -t my-python-app .<br><br># Taggeas la imagen para Artifact Registry. El formato es estricto:<br># [UBICACIÓN]-docker.pkg.dev/[ID-PROYECTO]/[NOMBRE-REPOSITORIO]/[NOMBRE-IMAGEN]:[TAG]<br>docker tag my-python-app \<br>  us-central1-docker.pkg.dev/[TU_PROJECT_ID]/my-python-repo/python-service:v1<br><br># ¡Súbela a la nube!<br>docker push us-central1-docker.pkg.dev/[TU_PROJECT_ID]/my-python-repo/python-service:v1</pre><h3>3. El Despliegue: Cloud Run (Serverless Supremo)</h3><p>Ahora vamos a desplegar en Cloud Run. A diferencia de ACI, Cloud Run gestiona automáticamente el tráfico: si nadie usa tu app, la apaga (costo cero); si recibe mil peticiones, escala rápidamente.</p><pre>gcloud run deploy python-service \<br>    --image us-central1-docker.pkg.dev/[TU_PROJECT_ID]/my-python-repo/python-service:v1 \<br>    --platform managed \<br>    --region us-central1 \<br>    --port 8080 \<br>    --set-env-vars=&quot;LOG_LEVEL=info&quot; \<br>    --memory 512Mi \<br>    --cpu 1 \<br>    --min-instances 0 \<br>    --max-instances 10 \<br>    --allow-unauthenticated</pre><p><strong>Análisis de los Parámetros Técnico-Pro:</strong></p><ul><li>--image: La ruta completa de nuestra imagen en Artifact Registry.</li><li>--set-env-vars: Inyección directa de variables de entorno para tu app de Python.</li><li>--memory/--cpu: Configuración precisa de recursos para control de costos.</li><li>--min-instances 0: <strong>¡Aquí está la magia del ahorro!</strong> El contenedor se apaga si no hay tráfico. Ideal para APIs secundarias, desarrollo, o Vox Enterprise en horas valle.</li><li>--max-instances 10: Limitamos el escalado para evitar sorpresas en la factura.</li><li>--allow-unauthenticated: Hacemos la URL de la API pública.</li></ul><h3>¿Por qué esto es Nivel Senior en GCP? 🏆</h3><p>Al igual que con Azure, este flujo demuestra maestría en la nube:</p><ol><li><strong>Seguridad Integrada:</strong> El uso de gcloud auth configure-docker aprovecha las credenciales de la consola de GCP, evitando el manejo inseguro de claves de cuentas de servicio.</li><li><strong>Eficiencia de Costos:</strong> Configurar min-instances 0 es la máxima expresión de <em>FinOps</em> para contenedores.</li><li><strong>Tecnología Moderna:</strong> Usar <strong>Artifact Registry</strong> en lugar del antiguo GCR demuestra que estás al día con los cambios de GCP.</li><li><strong>Buenas Prácticas de Contenedor:</strong> Un Dockerfile limpio, sin archivos pyc, con Gunicorn y gestionando correctamente $PORT, es lo que separa a un desarrollador de un Arquitecto Cloud.</li></ol><p><strong>¡Espero que les haya volado la cabeza, loquillos!</strong> Si quieren que profundicemos en cómo conectar Cloud Run con Cloud SQL o Firebase usando Python, déjenlo en los comentarios.</p><p>¡A seguir codeando con pasión! 💻🔥</p><p>#GoogleCloudPlatform #GCP #CloudRun #Docker #Python #ArtifactRegistry #DevOps #RellyDev #Serverless</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35b73e05c6b2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[¡No más ‘en mi local funciona’!]]></title>
            <link>https://rellydev.medium.com/no-m%C3%A1s-en-mi-local-funciona-8f6228722ed4?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/8f6228722ed4</guid>
            <category><![CDATA[azure-devops]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Wed, 01 Apr 2026 14:54:07 GMT</pubDate>
            <atom:updated>2026-04-01T14:54:07.415Z</atom:updated>
            <content:encoded><![CDATA[<h3>¡No más ‘en mi local funciona’! 🚀 Domina Azure Container Instances y Python con el toque de RellyDev</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R2YwBlYbNwGy3iBIPxj48w.png" /><figcaption>Generated by Nano Banana Pro by Google</figcaption></figure><p>¡Qué onda, mis <strong>loquillos y loquillas del code</strong>! Bienvenidos a un nuevo post donde vamos a elevar el nivel de nuestras apps.</p><p>Si alguna vez han sentido que su entorno local es una maravilla pero el despliegue es una pesadilla, hoy vamos a romper ese ciclo. Vamos a hablar de <strong>Azure Container Instances (ACI)</strong> y cómo llevar un proyecto de <strong>Python</strong> a la nube de Microsoft de forma profesional, rápida y escalable. 🚀</p><p>Este no es solo un tutorial; es una guía de arquitectura diseñada para quienes buscan la excelencia técnica (¡y quién sabe, tal vez un guiño para el programa <strong>Microsoft MVP</strong>!).</p><h3>El Arte de la Contenerización en Azure</h3><p>Contenerizar no es solo “meter código en una caja”. Es asegurar que nuestra lógica de Python corra igual en tu laptop que en un cluster en el Este de EE. UU. Azure Container Instances es la solución <em>serverless</em> perfecta: sin gestionar VMs, sin orquestadores complejos, solo tu código fluyendo.</p><h3>1. El Corazón: Un Dockerfile Optimizado</h3><p>Para que Microsoft vea que dominamos el tema, no usaremos una imagen pesada. Vamos por <strong>Python Alpine</strong> para mantener la seguridad y ligereza.</p><pre># Usamos una imagen ligera de Python<br>FROM python:3.11-alpine<br><br># Seteamos variables de entorno para evitar archivos .pyc y buffer de log<br>ENV PYTHONDONTWRITEBYTECODE 1<br>ENV PYTHONUNBUFFERED 1<br><br>WORKDIR /app<br><br># Instalamos dependencias del sistema necesarias<br>RUN apk add --no-cache gcc musl-dev libffi-dev<br><br># Instalamos dependencias de Python<br>COPY requirements.txt .<br>RUN pip install --no-cache-dir -r requirements.txt<br><br># Copiamos el código de la app<br>COPY . .<br><br># Exponemos el puerto de nuestra API (ejemplo con FastAPI)<br>EXPOSE 8000<br><br>CMD [&quot;uvicorn&quot;, &quot;main:app&quot;, &quot;--host&quot;, &quot;0.0.0.0&quot;, &quot;--port&quot;, &quot;8000&quot;]</pre><h3>2. Despliegue Automatizado con Azure CLI</h3><p>Aquí es donde se separan los “loquillos” de los expertos. Vamos a usar la terminal para tener un control total.</p><h3>Paso A: Login y Grupo de Recursos</h3><pre>az login<br>az group create --name VoxelResourceGroup --location eastus</pre><h3>Paso B: Creación del Azure Container Registry (ACR)</h3><p>Antes de desplegar en ACI, necesitamos un lugar donde guardar nuestra imagen de forma privada y segura.</p><pre>az acr create --resource-group VoxelResourceGroup --name voxelregistry --sku Basic<br>az acr login --name voxelregistry</pre><h3>Paso C: Build y Push</h3><pre># Taggeamos la imagen para nuestro registro<br>docker tag my-python-app:latest voxelregistry.azurecr.io/python-service:v1<br><br># Subimos a la nube<br>docker push voxelregistry.azurecr.io/python-service:v1</pre><h3>3. Desplegando en Azure Container Instances</h3><p>Ahora, el momento de la verdad. Vamos a levantar nuestra instancia con una sola línea de comando, configurando límites de recursos adecuados (CPU y Memoria).</p><pre>az container create \<br>    --resource-group VoxelResourceGroup \<br>    --name python-app-instance \<br>    --image voxelregistry.azurecr.io/python-service:v1 \<br>    --cpu 1 \<br>    --memory 1.5 \<br>    --registry-login-server voxelregistry.azurecr.io \<br>    --registry-username &lt;TuUsuarioACR&gt; \<br>    --registry-password &lt;TuPasswordACR&gt; \<br>    --dns-name-label voxel-python-api \<br>    --ports 8000</pre><h3>¿Por qué esto es Nivel MVP? 🏆</h3><p>Para ser evaluado como <strong>Microsoft MVP</strong>, no basta con que el código funcione. Debemos demostrar buenas prácticas:</p><ol><li><strong>Seguridad:</strong> Uso de Azure Container Registry para evitar imágenes públicas vulnerables.</li><li><strong>Eficiencia:</strong> Selección de imágenes base Alpine para reducir la superficie de ataque.</li><li><strong>Escalabilidad:</strong> Implementación de variables de entorno y límites de recursos definidos.</li><li><strong>Automatización:</strong> Procesos reproducibles mediante Azure CLI.</li></ol><h3>Pro-Tip de RellyDev</h3><p>Si quieres llevar esto al siguiente nivel, integra este flujo en un pipeline de <strong>GitHub Actions</strong>. Cada push a tu rama main debería actualizar automáticamente tu instancia en Azure. ¡Eso es excelencia tecnológica!</p><p><strong>¡Espero que les haya volado la cabeza, loquillos!</strong> Si tienen dudas sobre cómo conectar esto con bases de datos en Azure o manejar secretos con Key Vault, déjenlo en los comentarios.</p><p>¡A seguir codeando con pasión! 💻🔥</p><p>#MicrosoftAzure #Python #Docker #CloudComputing #VoxelEnterprise #MicrosoftMVP #RellyDev #FullStack</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8f6228722ed4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nueva era dev: TÚ + IA]]></title>
            <link>https://rellydev.medium.com/nueva-era-dev-t%C3%BA-ia-cc7220fc16f3?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/cc7220fc16f3</guid>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[dev]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Fri, 23 Jan 2026 11:56:01 GMT</pubDate>
            <atom:updated>2026-01-23T11:56:01.661Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vsVsGEJkjhT8zFXKcvslUw.png" /><figcaption>powered by Nano Banana (Google)</figcaption></figure><p>¡Comunidad! 🚨 Es hora de tener una charla seria sobre el elefante en la sala de servidores: la Inteligencia Artificial y nuestro futuro como devs.</p><p>Seamos claros: <strong>la era del “lobo solitario” picando código boilerplate línea por línea ha terminado.</strong> Pero no para mal, ¡sino para dar paso a algo mucho más potente! 🔥</p><p>Estamos presenciando el nacimiento de una nueva especie de desarrollador: el <strong>Dev Aumentado</strong>.</p><h3>La nueva ecuación: Expertise Humano + Agentes IA 🤖🧠</h3><p>Muchos ven a la IA como el enemigo que viene a “robarnos el trabajo”. ¡Error fatal! Verlo así es como si un carpintero viera a la sierra eléctrica como su enemiga porque corta más rápido que el serrucho manual.</p><p>La magia ocurre cuando combinas tu <strong>conocimiento técnico profundo</strong>, tu entendimiento del negocio y tu creatividad arquitectónica, con la <strong>velocidad y el acceso infinito a patrones</strong> de los agentes de IA (piensa en GPT-4, Claude, Copilot, etc., pero trabajando en conjunto).</p><h3>El resultado: MVPs Completos e Imparables 🚀</h3><p>Antes, lanzar un MVP (Producto Mínimo Viable) completo requería un equipo: alguien para el frontend, otro para el backend, pelearse con la infraestructura, tests, etc. Semanas o meses de trabajo.</p><p>Hoy, un solo desarrollador armado con agentes de IA bien dirigidos puede:</p><ol><li><strong>Arquitecturar</strong> el sistema completo (Humano).</li><li><strong>Generar</strong> el boilerplate del backend y los modelos de base de datos en minutos (IA).</li><li><strong>Diseñar</strong> y codear componentes de UI complejos rápidamente (IA + Humano supervisando).</li><li><strong>Escribir</strong> tests unitarios y documentación mientras toma café (IA).</li><li><strong>Resolver</strong> bugs oscuros que antes te tenían 4 horas en Stack Overflow (IA).</li></ol><p>La barrera de entrada técnica para construir ideas complejas se ha derrumbado. La velocidad de iteración se ha vuelto <strong>imparable</strong>.</p><h3>Adopta al Aliado 🤝</h3><p>La IA no es tu reemplazo; es tu <strong>exoesqueleto</strong>. 🦾</p><p>El desarrollador que ignora la IA competirá con herramientas de la década pasada. El desarrollador que la adopta como su <strong>copiloto estratégico</strong> multiplica su output por 10x.</p><p>No se trata de dejar de saber programar. Al contrario: ahora necesitas saber <em>más</em> para poder dirigir eficazmente a estos agentes y validar lo que producen. Pasamos de ser albañiles del código a ser Arquitectos Jefes.</p><p>La pregunta no es si la IA te va a reemplazar. La pregunta es: <strong>¿Vas a usar este superpoder para construir cosas increíbles más rápido que nunca?</strong></p><p>👇 <strong>Debate abierto en comentarios:</strong> 👇 ¿Ya están usando agentes de IA en su flujo de trabajo diario? ¿Qué es lo más complejo que han logrado construir en tiempo récord gracias a esta alianza? ¡Los leo!</p><p>#AIForDevs #FutureOfWork #MVP #DevLife #ArtificialIntelligence #TechTrends #Programadores #DesarrolloWeb #Innovacion #LoquillosDelCode</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cc7220fc16f3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[¿Quieres sueldo de Senior?  Guía Definitiva para dominar SAP ABAP y romperla en las grandes ligas]]></title>
            <link>https://rellydev.medium.com/quieres-sueldo-de-senior-gu%C3%ADa-definitiva-para-dominar-sap-abap-y-romperla-en-las-grandes-ligas-70ef8be607eb?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/70ef8be607eb</guid>
            <category><![CDATA[abap]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[sap]]></category>
            <category><![CDATA[business-strategy]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Thu, 11 Dec 2025 13:49:52 GMT</pubDate>
            <atom:updated>2025-12-11T13:49:52.448Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U_uaUJyd_0aRjxcAZlVjmw.png" /></figure><p>¡Qué xopa, <strong>loquillos y loquillas del code</strong>! 🚀👋</p><p>Hoy vamos a desbloquear una habilidad que literalmente mueve al mundo empresarial: <strong>SAP ABAP</strong>. Si alguna vez se preguntaron qué hay detrás de las pantallas de las empresas más grandes del planeta (Coca-Cola, BMW, Nestlé), la respuesta corta es SAP, y el lenguaje mágico que lo hace funcionar es <strong>ABAP</strong>.</p><p>Me pidieron que desglosara la guía completa de Tutorialspoint y la trajera masticadita, con ejemplos reales y en nuestro idioma. Así que preparen su café (o su bebida energética de confianza), abran su mente y vamos a <strong>romperla</strong> en el mundo del <em>Enterprise Resource Planning</em>.</p><h3>🏆 La Biblia del ABAP: Guía Maestra para Dominar SAP</h3><h3>1. ¿Qué rayos es ABAP y por qué debería importarme?</h3><p>ABAP significa <strong>Advanced Business Application Programming</strong>. Es un lenguaje de cuarta generación (4GL) creado por SAP.</p><p><strong>¿Por qué aprenderlo?</strong></p><ul><li>🤑 <strong>Billete:</strong> Los consultores ABAP suelen tener sueldos muy competitivos.</li><li>🏢 <strong>Estabilidad:</strong> El código ABAP que escribas hoy probablemente siga corriendo en 10 años.</li><li>🧠 <strong>Lógica de Negocio:</strong> No solo programas, entiendes cómo funcionan las ventas, finanzas y logística.</li></ul><h3>2. El Entorno de Batalla: SAP GUI y T-Codes 🛠️</h3><p>A diferencia de Java o Python donde usas VS Code, aquí (tradicionalmente) trabajamos dentro del mismo SAP.</p><ul><li><strong>T-Codes (Transaction Codes):</strong> Son los comandos para ir a las herramientas.</li><li><strong>SE38:</strong> El editor de ABAP (donde ocurre la magia clásica).</li><li><strong>SE80:</strong> El “Object Navigator” (para proyectos más grandes).</li><li><strong>SE11:</strong> El Diccionario de Datos (donde creamos tablas y bases de datos).</li></ul><h3>3. “Hola Mundo” y Estructura Básica 📝</h3><p>Todo programa ABAP empieza con la palabra REPORT. Olvídense de public static void main. Aquí somos directos.</p><p><strong>Tu primer código:</strong></p><pre>REPORT z_hola_loquillos.<br><br>* Esto es un comentario (empieza con asterisco)<br>WRITE &#39;¡Hola, loquillos y loquillas del code!&#39;.<br>WRITE / &#39;Listos para dominar SAP.&#39;. &quot; La barra / es un salto de línea</pre><p><strong>Ojo al dato:</strong> En ABAP, cada sentencia DEBE terminar con un punto .. Si se les olvida, el compilador les va a gritar.</p><h3>4. Variables y Tipos de Datos (Los ladrillos) 🧱</h3><p>ABAP es fuertemente tipado. Necesitamos declarar las cosas antes de usarlas con la palabra clave DATA.</p><p><strong>Tipos comunes:</strong></p><ul><li>I: Entero (Integer)</li><li>C: Caracter (String corto)</li><li>P: Empaquetado (Usado para monedas/decimales, ¡muy importante en SAP!)</li><li>D: Fecha (YYYYMMDD)</li></ul><p><strong>Ejemplo Práctico:</strong></p><pre>DATA: gv_nombre    TYPE c LENGTH 20,<br>      gv_edad      TYPE i,<br>      gv_salario   TYPE p DECIMALS 2,<br>      gv_fecha_hoy TYPE d.<br><br>gv_nombre    = &#39;Master del Codigo&#39;.<br>gv_edad      = 25.<br>gv_salario   = &#39;5000.50&#39;.<br>gv_fecha_hoy = sy-datum. &quot; sy-datum es una variable del sistema con la fecha actual<br><br>WRITE: &#39;Nombre:&#39;, gv_nombre,<br>       / &#39;Edad:&#39;, gv_edad,<br>       / &#39;Salario:&#39;, gv_salario.</pre><h3>5. Control de Flujo: Tomando Decisiones 🚦</h3><p>Como en cualquier lenguaje, necesitamos IF y Loops.</p><h3>IF / ELSE</h3><pre>IF gv_edad &gt;= 18.<br>  WRITE &#39;Eres mayor de edad, puedes acceder al sistema.&#39;.<br>ELSE.<br>  WRITE &#39;Acceso denegado, pequeño saltamontes.&#39;.<br>ENDIF.</pre><h3>Bucles (Loops)</h3><p>Aquí usamos mucho el DO o el WHILE.</p><pre>DATA: gv_contador TYPE i VALUE 0.<br><br>DO 5 TIMES.<br>  gv_contador = gv_contador + 1.<br>  WRITE: / &#39;Iteración número:&#39;, gv_contador.<br>ENDDO.</pre><h3>6. El Corazón de SAP: Diccionario de Datos y SQL (SE11) 💾</h3><p>Aquí es donde ABAP se separa de los demás. SAP tiene una base de datos gigante integrada.</p><ul><li><strong>Tablas Transparentes:</strong> Son las tablas reales en la BD (ej. MARA para materiales, VBAK para ventas).</li><li><strong>Estructuras:</strong> Son moldes de datos sin contenido, solo definen la forma.</li></ul><h3>Open SQL (La joya de la corona)</h3><p>ABAP tiene su propio SQL integrado. Es súper poderoso.</p><p><strong>Ejemplo: Leer datos de empleados</strong> Supongamos que tenemos una tabla ZEMPLEADOS.</p><pre>DATA: gt_empleados TYPE TABLE OF zempleados, &quot; Tabla interna (Array)<br>      gs_empleado  TYPE zempleados.          &quot; Work Area (Una sola fila)<br><br>* Seleccionamos todos los empleados del depto IT<br>SELECT * FROM zempleados<br>  INTO TABLE gt_empleados<br>  WHERE departamento = &#39;IT&#39;.<br><br>* Recorremos la tabla interna<br>LOOP AT gt_empleados INTO gs_empleado.<br>  WRITE: / gs_empleado-id, gs_empleado-nombre.<br>ENDLOOP.</pre><p><strong>Tip de Pro:</strong> Siempre usen Into TABLE para traer muchos datos a la memoria RAM (Tablas Internas) y luego procésenlos. ¡Eviten hacer SELECT dentro de un LOOP o matarán el servidor! 💀</p><h3>7. Modularización: No repitas código (DRY) ♻️</h3><p>Para no tener un código espagueti de 5,000 líneas, usamos:</p><ol><li><strong>Subrutinas (FORM/PERFORM):</strong> Bloques de código locales.</li><li><strong>Function Modules (SE37):</strong> Funciones globales que puedes llamar desde cualquier programa.</li></ol><p><strong>Ejemplo de Subrutina:</strong></p><pre>PERFORM calcular_impuesto USING gv_salario.<br><br>FORM calcular_impuesto USING pv_monto TYPE p.<br>  DATA: lv_impuesto TYPE p DECIMALS 2.<br>  lv_impuesto = pv_monto * &#39;0.16&#39;.<br>  WRITE: / &#39;El impuesto a pagar es:&#39;, lv_impuesto.<br>ENDFORM.</pre><h3>8. ABAP Orientado a Objetos (OO) 🧬</h3><p>Sí, loquillos, ABAP también es OO. Esto es lo moderno y lo que deben aprender para SAP S/4HANA.</p><p>Se define en dos partes: <strong>Definición</strong> (el qué) e <strong>Implementación</strong> (el cómo).</p><pre>CLASS lcl_coche DEFINITION.<br>  PUBLIC SECTION.<br>    DATA: modelo TYPE string.<br>    METHODS: arrancar.<br>ENDCLASS.<br><br>CLASS lcl_coche IMPLEMENTATION.<br>  METHOD arrancar.<br>    WRITE: / &#39;El coche&#39;, modelo, &#39;está arrancando. Rum rum!&#39;.<br>  ENDMETHOD.<br>ENDCLASS.<br><br>* Usando la clase<br>START-OF-SELECTION.<br>  DATA: mi_ferrari TYPE REF TO lcl_coche.<br>  CREATE OBJECT mi_ferrari.<br>  mi_ferrari-&gt;modelo = &#39;F40&#39;.<br>  mi_ferrari-&gt;arrancar( ).</pre><h3>9. Reportes ALV: ¡Lo que el usuario ve! 📊</h3><p>El usuario final no quiere ver texto plano con WRITE. Quiere un Excel bonito dentro de SAP. Eso se llama <strong>ALV (ABAP List Viewer)</strong>.</p><p>Es la forma estándar de mostrar reportes. Permite filtrar, ordenar y sumar automáticamente.</p><p><strong>Código Snippet para un ALV básico:</strong></p><pre>* Asumiendo que ya llenamos la tabla interna gt_empleados<br>CALL FUNCTION &#39;REUSE_ALV_GRID_DISPLAY&#39;<br>  EXPORTING<br>    i_structure_name = &#39;ZEMPLEADOS&#39;<br>  TABLES<br>    t_outtab         = gt_empleados<br>  EXCEPTIONS<br>    program_error    = 1<br>    OTHERS           = 2.</pre><p><em>¡Bum!</em> Con eso tienes una grilla interactiva profesional.</p><h3>10. Conclusión y Ruta de Aprendizaje 🗺️</h3><p>Loquillos y loquillas, esto es solo la punta del iceberg. SAP ABAP es inmenso, pero dominar estos pilares los pone por delante del 90% de los principiantes.</p><p><strong>Resumen de pasos para ser un Crack:</strong></p><ol><li>Domina la sintaxis básica (IF, LOOP, WRITE).</li><li>Vuélvete un maestro de las <strong>Tablas Internas</strong> y <strong>Open SQL</strong> (es el 80% del trabajo).</li><li>Aprende a debuggear (/h en el campo de comandos).</li><li>Salta a <strong>ABAP Objects</strong> lo antes posible.</li></ol><p>¿Están listos para codear en las grandes ligas? ¡A darle paps! 💻🔥</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=70ef8be607eb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ Samurai Cibernético al Atardecer: ¡Domina el Arte del Prompt Profesional con Nano Banana!]]></title>
            <link>https://rellydev.medium.com/samurai-cibern%C3%A9tico-al-atardecer-domina-el-arte-del-prompt-profesional-con-nano-banana-46ff9b5f82c1?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/46ff9b5f82c1</guid>
            <category><![CDATA[nano-banana]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[google]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Mon, 08 Dec 2025 11:51:41 GMT</pubDate>
            <atom:updated>2025-12-08T11:51:41.259Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jM28-5jMQ-RfXomKcNtS8g.png" /><figcaption>Banner generado con Nano Banana de Google</figcaption></figure><p>¡Hola, <strong>loquillos y loquillas del code</strong>! Vuestro <em>sensei</em> digital favorito vuelve con un <em>hack</em> que revolucionará vuestra manera de usar Nano Banana y cualquier generador de imágenes con Gemini en la web.</p><p>No basta con pedir “un robot bonito”. Si quieres resultados que parezcan sacados de una película de Hollywood, necesitas un <em>prompt</em> <strong>profesional</strong> y bien estructurado. Hoy, vamos a desglosar una fórmula infalible usando un ejemplo épico: un <strong>Samurái de Obsidiana</strong>.</p><h3>💡 La Fórmula Secreta (¡Guárdala Bien!)</h3><p>Un <em>prompt</em> profesional se construye como una oración compleja o, mejor aún, como un <em>script</em> de cine. Debe tener componentes clave, bien separados por comas o corchetes, para que la IA entienda exactamente lo que quieres.</p><p>La estructura que yo uso y recomiendo es esta:</p><blockquote><strong><em>[SUJETO]</em></strong><em>, </em><strong><em>[ACCIÓN y AMBIENTE]</em></strong><em>, </em><strong><em>[ESTILO e INSPIRACIÓN]</em></strong><em>, </em><strong><em>[DETALLES TÉCNICOS]</em></strong></blockquote><h3>🛠️ Desglosando nuestro Prompt Épico</h3><p>Vamos a usar este <em>prompt</em> que creamos, y lo separaremos en sus componentes esenciales. ¡Presta atención!</p><h3>1. [SUJETO: El Protagonista]</h3><p>Define <strong>quién o qué</strong> es el foco. Sé lo más detallado posible.</p><ul><li><strong>Prompt de Ejemplo:</strong> Un robot samurái con armadura de obsidiana en una montaña nevada</li></ul><p><strong>Claves:</strong></p><ul><li><strong>Tipo de sujeto:</strong> Robot Samurái.</li><li><strong>Material/Detalle clave:</strong> Armadura de obsidiana (esto añade dramatismo y color oscuro).</li><li><strong>Escenario de ubicación:</strong> Montaña nevada.</li></ul><blockquote><strong><em>TIP Pro:</em></strong><em> Agregar la ubicación aquí ayuda a la IA a establecer el </em>feeling<em> inicial de la escena.</em></blockquote><h3>2. [ACCIÓN y AMBIENTE: El Momento]</h3><p>Describe <strong>qué está haciendo</strong> el sujeto y <strong>cómo está tomada la foto</strong> (la composición).</p><ul><li><strong>Prompt de Ejemplo:</strong> Mirando la puesta de sol, plano general (wide shot), niebla intensa</li></ul><p><strong>Claves:</strong></p><ul><li><strong>Acción/Emoción:</strong> Mirando la puesta de sol (define la iluminación y el foco).</li><li><strong>Composición (Cámara):</strong> Plano general o <em>wide shot</em> (le dice a la IA que se aleje y muestre el entorno).</li><li><strong>Detalle Atmosférico:</strong> Niebla intensa (añade misterio y profundidad).</li></ul><h3>3. [ESTILO e INSPIRACIÓN: El aspecto]</h3><p>Aquí le dices a la IA a <strong>qué debe parecerse</strong>. ¿Un cuadro? ¿Un cómic? ¿Arte conceptual?</p><ul><li><strong>Prompt de Ejemplo:</strong> Arte conceptual, ciberpunk futurista, tonos púrpura y naranja</li></ul><p><strong>Claves:</strong></p><ul><li><strong>Estilo Artístico:</strong> Arte conceptual (da un <em>look</em> pulido y detallado).</li><li><strong>Género:</strong> Ciberpunk futurista (establece la estética de ciencia ficción).</li><li><strong>Paleta de Color:</strong> Tonos púrpura y naranja (fundamental para una puesta de sol ciberpunk dramática).</li></ul><blockquote><strong><em>TIP Pro:</em></strong><em> Los colores (púrpura y naranja) son un clásico en la iluminación ciberpunk. ¡Úsalos!</em></blockquote><h3>4. [DETALLES TÉCNICOS: La Calidad Final]</h3><p>Dile a Nano Banana <strong>cómo debe renderizarlo</strong> para máxima calidad. ¡Esto es lo que separa lo bueno de lo increíble!</p><ul><li><strong>Prompt de Ejemplo:</strong> Detalle fotorrealista 8K, renderizado en Octane, relación de aspecto 16:9.</li></ul><p><strong>Claves:</strong></p><ul><li><strong>Resolución y Realismo:</strong> Detalle fotorrealista 8K (máxima nitidez).</li><li><strong>Motor de Render:</strong> Renderizado en Octane (o Unreal Engine, Blender, etc. Esto imita la iluminación de un software 3D profesional).</li><li><strong>Formato:</strong> Relación de aspecto 16:9 (el formato de cine o pantalla ancha, ¡siempre mejor para un <em>wide shot</em>!).</li></ul><h3>✅ El Prompt Final y Profesional</h3><p>Al unirlo todo con una sintaxis limpia, ¡obtenemos la obra maestra!</p><p>[MODELO: Un robot samurái con armadura de obsidiana en una montaña nevada], [ACCIÓN: Mirando la puesta de sol, plano general (wide shot), niebla intensa], [ESTILO: Arte conceptual, ciberpunk futurista, tonos púrpura y naranja], [FORMATO: Detalle fotorrealista 8K, renderizado en Octane, relación de aspecto 16:9]</p><h3>🔥 ¡Desafío para loquillos y loquillas!</h3><p>Ahora que conoces la fórmula, toma cualquier imagen que te guste y trata de “traducirla” a este formato de 4 partes. ¡Verás cómo tus creaciones suben de nivel!</p><p><strong>¿Te atreves a compartir el primer <em>prompt</em> que vas a crear usando esta fórmula? ¡Déjalo en los comentarios loquillo o loquilla coder!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=46ff9b5f82c1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[¿4 horas codeando o 4 horas en YouTube? Descúbrelo con esta herramienta ️‍♂️]]></title>
            <link>https://rellydev.medium.com/4-horas-codeando-o-4-horas-en-youtube-desc%C3%BAbrelo-con-esta-herramienta-%EF%B8%8F-%EF%B8%8F-e63041a2028c?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/e63041a2028c</guid>
            <category><![CDATA[activitywatch]]></category>
            <category><![CDATA[homework]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Thu, 04 Dec 2025 15:21:02 GMT</pubDate>
            <atom:updated>2025-12-04T15:21:02.769Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*074fE50LXnkKeykYGSaCZw.png" /></figure><p>¡Hola, mis <strong>loquillos y loquillas del code</strong>! 👨‍💻👩‍💻</p><p>¿Alguna vez se han sentado frente al monitor con un café, han parpadeado y de repente han pasado 6 horas, pero sienten que no avanzaron nada? ¿O peor aún, juran que estuvieron programando todo el día, pero su commit history dice lo contrario?</p><p>Hoy les traigo una <strong>joya open-source</strong> que va a cambiar radicalmente la forma en que gestionan su activo más valioso: su tiempo. Les presento a <strong>ActivityWatch</strong>. 🕵️‍♂️</p><h3>🚀 ¿Qué es ActivityWatch?</h3><p>Olvíden los timers manuales tipo Pomodoro donde tienes que acordarte de dar clic en “Start” y “Stop” (seamos honestos, a todos se nos olvida). <strong>ActivityWatch</strong> es un tracker de tiempo <strong>automático</strong>, multiplataforma y, lo más importante para nosotros los paranoicos de la seguridad: <strong>privado</strong>.</p><p>Básicamente, es un agente silencioso que vive en tu sistema y registra:</p><ul><li>Qué aplicaciones estás usando.</li><li>En qué ventana estás activo.</li><li>Cuánto tiempo pasas AFK (Away From Keyboard).</li><li>Específicamente para nosotros: <strong>En qué proyecto o archivo de código estás trabajando.</strong></li></ul><h3>💎 ¿Por qué ActivityWatch es mejor que el resto?</h3><p>Seguro conocen herramientas como RescueTime. Son buenas, pero… ¿realmente quieren enviar todos sus datos de navegación y uso de apps a la nube de un tercero? 🤨</p><p>Aquí es donde ActivityWatch brilla para la comunidad dev:</p><ol><li><strong>Privacidad Absoluta (Local First):</strong> Tus datos son tuyos. Se almacenan localmente en tu máquina. Nada sale de tu PC a menos que tú configures una sincronización.</li><li><strong>Open Source:</strong> El código es libre. Si algo no te gusta, puedes hacer un fork o escribir tu propio “watcher”.</li><li><strong>Sin Suscripciones:</strong> Es gratis. De verdad. Sin versiones “Pro” que esconden el Dark Mode.</li><li><strong>Extensible:</strong> Tiene una arquitectura modular. ¿Quieres trackear cuánto tiempo pasas escribiendo en Vim o escuchando música en Spotify? Hay plugins (o puedes programarlos tú mismo en Python).</li></ol><h3>🛠️ ¿Cómo nos ayuda a los Loquillos del Code?</h3><p>Más allá de saber cuánto tiempo perdimos en memes, esta herramienta es brutal para:</p><ul><li><strong>Combatir el Síndrome del Impostor:</strong> Ver gráficamente que le dedicaste 40 horas a aprender Rust te da una validación objetiva de tu esfuerzo.</li><li><strong>Facturación Freelance:</strong> Si cobras por hora, esto genera la evidencia exacta de cuánto tiempo estuviste con la ventana del proyecto abierta.</li><li><strong>Análisis de Patrones:</strong> ¿Eres más productivo en la mañana o en la madrugada? Los gráficos de calor te dirán la verdad (aunque te duela).</li></ul><blockquote><strong><em>Pro-Tip:</em></strong><em> Configura las categorías para separar “Trabajo Profundo” (IDE, Terminal) de “Distracciones” (Redes Sociales, Juegos). ¡Ver ese gráfico de torta al final del día es revelador!</em></blockquote><p>Para este script, vamos a usar <strong>Python</strong> puro (con la librería estándar) para leer el JSON que exporta ActivityWatch, buscar el “bucket” (cubeta de datos) que registra las ventanas activas y sumar el tiempo que has pasado en cada aplicación.</p><h3>🐍 El Script: “El Verificador de la Verdad”</h3><p>Guarda este código como analizador_aw.py.</p><p>Asegúrate de exportar tu data desde ActivityWatch (ve a ActivityWatch -&gt; Export -&gt; Export as JSON) y guarda el archivo (ej. aw-export.json) en la misma carpeta que este script.</p><pre>import json<br>from datetime import timedelta<br><br>def analizar_tiempo(archivo_json):<br>    print(f&quot;📂 Cargando archivo: {archivo_json}...&quot;)<br>    <br>    try:<br>        with open(archivo_json, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:<br>            data = json.load(f)<br>    except FileNotFoundError:<br>        print(&quot;❌ Error: No encuentro el archivo JSON. Verifica el nombre.&quot;)<br>        return<br><br>    # ActivityWatch guarda los datos en &quot;buckets&quot;. <br>    # Buscamos el que tenga &#39;aw-watcher-window&#39; en su ID (es el que trackea las ventanas).<br>    buckets = data.get(&#39;buckets&#39;, {})<br>    window_bucket_key = next((k for k in buckets.keys() if &quot;aw-watcher-window&quot; in k), None)<br><br>    if not window_bucket_key:<br>        print(&quot;⚠️ No encontré datos de ventanas (aw-watcher-window) en este export.&quot;)<br>        return<br><br>    print(f&quot;✅ Analizando bucket: {window_bucket_key}\n&quot;)<br>    <br>    events = buckets[window_bucket_key][&#39;events&#39;]<br>    app_stats = {}<br><br>    # Procesamos cada evento<br>    for event in events:<br>        # Extraemos la data<br>        app_name = event[&#39;data&#39;].get(&#39;app&#39;, &#39;Desconocido&#39;)<br>        duration = event.get(&#39;duration&#39;, 0) # La duración viene en segundos<br>        <br>        # Sumamos al total de esa app<br>        if app_name in app_stats:<br>            app_stats[app_name] += duration<br>        else:<br>            app_stats[app_name] = duration<br><br>    # Ordenamos de mayor a menor uso<br>    sorted_apps = sorted(app_stats.items(), key=lambda item: item[1], reverse=True)<br><br>    # Imprimimos el TOP 10<br>    print(&quot;🏆 TOP 10 APLICACIONES MÁS USADAS 🏆&quot;)<br>    print(&quot;-&quot; * 40)<br>    <br>    for i, (app, seconds) in enumerate(sorted_apps[:10], 1):<br>        tiempo_formateado = str(timedelta(seconds=int(seconds)))<br>        print(f&quot;{i}. {app}: {tiempo_formateado}&quot;)<br><br>    print(&quot;-&quot; * 40)<br><br># --- EJECUCIÓN ---<br># Cambia &#39;aw-export.json&#39; por el nombre real de tu archivo descargado<br>nombre_archivo = &#39;aw-export.json&#39; <br>analizar_tiempo(nombre_archivo)</pre><h3>🤓 ¿Cómo funciona este código? (Para los curiosos)</h3><ol><li><strong>Carga el JSON:</strong> Lee la estructura compleja que exporta la herramienta.</li><li><strong>Busca el Bucket Correcto:</strong> ActivityWatch guarda muchas cosas (afk, mouse, clicks). Nosotros filtramos buscando aw-watcher-window, que es donde está la info de &quot;En qué programa estoy&quot;.</li><li><strong>Suma Duraciones:</strong> Recorre la lista de eventos. Cada evento tiene un campo duration (en segundos). Usamos un diccionario para ir acumulando esos segundos por cada nombre de aplicación (app).</li><li><strong>Formatea:</strong> Usa datetime.timedelta para convertir esos miles de segundos en algo legible tipo HH:MM:SS.</li></ol><h3>🧪 Reto para los Loquillos del Code:</h3><p>Este script te da el tiempo total histórico. ¿Te animas a modificarlo para que solo muestre el tiempo de <strong>la última semana</strong>? (Pista: Tendrás que parsear el campo timestamp del evento usando datetime.fromisoformat).</p><h3>🏁 Conclusión</h3><p>Si quieren tomarse en serio su productividad y entender realmente cómo funcionan sus cerebros frente al ordenador, <strong>ActivityWatch</strong> es una descarga obligada. Es ligero, respeta tu privacidad y te da datos duros para mejorar.</p><p>¡No dejen que el tiempo se les escape entre bugs y deployments!</p><p><strong>👉 Descárgalo aquí:</strong> <a href="https://activitywatch.net">activitywatch.net</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e63041a2028c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[El Manifiesto sobre la Originalidad ]]></title>
            <link>https://rellydev.medium.com/el-manifiesto-sobre-la-originalidad-c21b8718063e?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/c21b8718063e</guid>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[sentinela]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Sun, 30 Nov 2025 14:29:36 GMT</pubDate>
            <atom:updated>2025-11-30T14:29:36.021Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rkv1erC226cjgudQ-bMcnw.png" /></figure><p>Hace poco leí un artículo que sonaba perfecto. Demasiado perfecto. Carecía de alma. Resultó ser 100% IA. Ahí supe que teníamos un problema.</p><ol><li><strong>El Nuevo Desafío:</strong> Explica que el problema ya no es solo el plagio clásico (copiar a otro humano), sino la generación masiva de texto sintético que inunda internet, las aulas y las empresas.</li><li><strong>La Solución Tecnológica (Sentinela):</strong> Sentinela utiliza algoritmos para detectar patrones que el ojo humano suele pasar por alto, señalando qué porcentaje de un documento parece sintético o copiado.</li><li><strong>¿Para quién es esto?:</strong> El profesor corrigiendo ensayos, el editor recibiendo manuscritos, el jefe de marketing revisando copy.</li></ol><p><strong>Nota:</strong> “La IA es una herramienta increíble, pero la transparencia es fundamental. Necesitamos saber cuándo estamos interactuando con una máquina y cuándo con una mente humana. Te invito a probar la primera versión de Sentinela y recuperar el control de lo que lees.” 👉 <a href="https://sentinela-chi.vercel.app">https://sentinela-chi.vercel.app</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c21b8718063e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google DevFest Panamá 2025: IA, Cloud y el futuro del código (Resumen Épico) ]]></title>
            <link>https://rellydev.medium.com/google-devfest-panam%C3%A1-2025-ia-cloud-y-el-futuro-del-c%C3%B3digo-resumen-%C3%A9pico-3e65e0771006?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/3e65e0771006</guid>
            <category><![CDATA[google-developer-group]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[devfest2023]]></category>
            <category><![CDATA[firebase]]></category>
            <category><![CDATA[workflow-automation]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Mon, 24 Nov 2025 13:12:21 GMT</pubDate>
            <atom:updated>2025-11-24T13:12:21.204Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d5j50ke8cdBZS6gHNm0LqQ.jpeg" /><figcaption>Google — DevFest Panamá 2025</figcaption></figure><p>¡Hey, <strong>loquillos y loquillas del code</strong>! 🤓👋</p><p>Si me siguen en redes, ya saben que este pasado <strong>22 de noviembre</strong> estuve en modo esponja absorbiendo conocimiento en el <strong>Google DevFest Panamá 2025</strong>. 🇵🇦✨ Organizado por los cracks del <strong>Google Developers Group Panamá (GDG)</strong>, el evento fue una locura absoluta.</p><p>Si no pudiste ir (o si fuiste y todavía te da vueltas la cabeza con tanta info), tranqui, que aquí te traigo el resumen definitivo. Prepárate un café ☕, porque vamos a desglosar lo que realmente está moviendo la aguja en nuestra industria.</p><h3>🤯 El Vibe del Evento</h3><p>Primero, tengo que decirles: ¡qué nivel! No fue solo sentarse a escuchar charlas; fue una jornada maratónica de networking y de ver hacia dónde va el futuro. La energía de la comunidad tech en Panamá está en su mejor momento. Pero vamos a lo técnico, a la “carnita” que nos gusta.</p><h3>🔥 1. La Revolución de la IA y la Automatización (Ya no es el futuro, es HOY)</h3><p>Uno de los pilares del evento fue, sin duda, la Inteligencia Artificial aplicada. Ya no estamos hablando de teorías lejanas, sino de herramientas que usamos ya:</p><ul><li><strong>Angular + Firebase AI:</strong> Arrancamos fuertísimo con <strong>Ricardo Chavarria López</strong>, quien nos enseñó cómo integrar lógica de IA directamente en nuestras apps.</li><li><strong>Data Viz al siguiente nivel:</strong> <strong>Stefania Miranda</strong> nos voló la mente demostrando cómo visualizar y automatizar datos usando IA en Looker Studio y Google Cloud.</li></ul><p><strong>El takeaway:</strong> Si no estás automatizando tus flujos de trabajo con IA hoy, estás trabajando el doble innecesariamente. 🤖</p><h3>🚀 2. Productividad x10: Codea más rápido, despliega mejor</h3><p>Aquí fue donde a muchos se les iluminaron los ojos (me incluyo). La productividad fue un tema central:</p><ul><li><strong>Firebase Studio:</strong> <strong>Mayra Rodriguez</strong> nos mostró el camino para desarrollar “en 10x”. La velocidad con la que podemos iterar hoy en día con estas herramientas es brutal.</li><li><strong>Despliegue sin dolor:</strong> Para los que sufrimos con la infraestructura, <strong>Jesús Aguirre</strong> nos dio una clase maestra sobre cómo desplegar apps multi-cloud usando GKE Autopilot y KubeVela. En resumen: ¡Adiós a los dolores de cabeza en el deploy, people! ☁️</li></ul><h3>📱 3. El Trono del Mobile</h3><p>Para mis mobile devs, el mensaje fue claro: la integración es clave. <strong>Jorge Fabián Varela Bonett</strong> nos presentó lo que yo llamo “La Santa Trinidad” del desarrollo moderno: <strong>Flutter + Firebase + SQL</strong>. La capacidad de conectar datos de manera tan fluida con DataConnect es un game-changer para nuestras apps. 🙌</p><h3>🧠 4. Innovación, Estrategia y Sociedad</h3><p>Lo que más me gustó del DevFest es que no solo hablamos de código, sino de impacto:</p><ul><li><strong>Open Source:</strong> <strong>Maureen Barahona</strong> nos recordó que el código abierto es la receta secreta para un mundo más inteligente.</li><li><strong>Impacto Público:</strong> <strong>Jarol Marin</strong> nos mostró cómo la IA y la nube están transformando la gestión pública en Panamá. ¡Tecnología con propósito!</li><li><strong>Prototipado Ágil:</strong> El grande <strong>Euclides José Hernández</strong> nos enseñó a usar <strong>Gemini</strong> para prototipar historias de usuario. Esto es oro puro para los Product Owners y Devs que quieren agilidad real.</li><li><strong>Agentes de IA:</strong> Cerramos con broche de oro entendiendo la arquitectura de Agentes de IA con el Google’s ADK de la mano de <strong>Juan Guillermo Gómez, MSc</strong>.</li></ul><h3>💡 Conclusión: Código es más que líneas</h3><p>Si algo me quedó claro este 22 de noviembre, es que el código no es solo escribir sintaxis; es <strong>crear soluciones inteligentes</strong>.</p><p>Gracias infinitas a los sponsors (¡ese Coffee Break estuvo 10/10! ☕) y a toda la comunidad por la buena vibra. Nos fuimos a casa recargados, con stickers nuevos en la laptop y, sobre todo, con mucha inspiración.</p><p>👇 <strong>Ahora les toca a ustedes:</strong></p><p>Cuéntenme en los comentarios: De todos estos temas, ¿cuál les urge aprender más? ¿Son <strong>Team Flutter</strong> o <strong>Team IA</strong>?</p><p>¡Los leo, cracks! 👀💻</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3e65e0771006" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ Potencia tus Apps con Gemini CLI + Firebase: ¡El Dúo Dinámico de la IA!]]></title>
            <link>https://rellydev.medium.com/potencia-tus-apps-con-gemini-cli-firebase-el-d%C3%BAo-din%C3%A1mico-de-la-ia-29387c072ac9?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/29387c072ac9</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[firebase]]></category>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[gemini-cli]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Mon, 24 Nov 2025 12:45:33 GMT</pubDate>
            <atom:updated>2025-11-24T12:45:33.577Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fID06FiHRMoLa8RiSNBAxA.png" /><figcaption>Gemini CLI + Firebase — Imagen generada con el modelo NANO Banana de Google</figcaption></figure><p>¡¿Qué tal, mis <strong>loquillos y loquillas del code</strong>?! 👋💻</p><p>Hoy vengo a traerles “la crema y nata” del desarrollo moderno. Si han estado viviendo bajo una piedra (o depurando código legacy sin parar), quizás no se han enterado de la revolución que está armando Google.</p><p>Estoy hablando de combinar la potencia bruta de la <strong>Gemini CLI</strong> (y su SDK) con la infraestructura “todo terreno” de <strong>Firebase</strong>. ¿El resultado? Apps de Inteligencia Artificial que no solo son inteligentes, sino que escalan al infinito y más allá. 🌌</p><h3>¿Por qué tanto Hype? 🤔</h3><p>A ver, seamos sinceros. A nadie le gusta configurar servidores desde cero para luego preocuparse por si la CPU aguanta cuando tu app se hace viral. Aquí es donde entra nuestra fórmula mágica.</p><h4>1. Gemini CLI: Tu varita mágica 🪄</h4><p>Integrar modelos de lenguaje antes era un dolor de cabeza. Ahora, con las herramientas de línea de comandos y el SDK de Google AI, puedes prototipar prompts, probar respuestas y ajustar parámetros (temperatura, tokens) en segundos. ¡Literalmente en segundos!</p><p>Gemini no es solo un chat; es multimodal. Le pasas texto, imágenes, video… y te devuelve magia estructurada.</p><h4>2. Firebase: El músculo detrás del cerebro 💪</h4><p>Tener una IA lista es genial, pero ¿dónde guardas los datos? ¿Cómo manejas la autenticación? ¿Y si entran 10,000 usuarios de golpe?</p><ul><li><strong>Cloud Functions:</strong> Aquí es donde ocurre la magia. Creas una función que escuche tu base de datos, llame a Gemini y guarde la respuesta. ¡Serverless puro!</li><li><strong>Firestore:</strong> Tu base de datos NoSQL que sincroniza en tiempo real. El usuario pregunta, Gemini piensa, Firestore actualiza y ¡BAM!, la respuesta aparece en la pantalla del usuario.</li><li><strong>Genkit:</strong> Ojo con esto, loquillos. Firebase ahora tiene extensiones de GenAI que hacen que conectar Gemini sea cuestión de un firebase init.</li></ul><h3>Escalabilidad y Eficiencia: Nivel Dios ⚡📈</h3><p>Aquí es donde la cosa se pone seria para sus proyectos profesionales o startups:</p><ul><li><strong>Pago por uso:</strong> Con Firebase y las APIs de Gemini, no pagas por un servidor encendido 24/7 mirando al techo. Pagas por invocación y por tokens. Si nadie usa tu app a las 3 AM, no gastas ni un centavo.</li><li><strong>Auto-scaling:</strong> ¿Tu app se hizo viral en TikTok? Firebase levanta instancias automáticamente. Tú solo preocúpate por escribir buen código; Google se preocupa por la infraestructura.</li><li><strong>Latencia baja:</strong> Al usar la infraestructura de Google Cloud, la comunicación entre tus Cloud Functions y la API de Gemini es rapidísima.</li></ul><h3>Un flujo de trabajo típico para “Loquillos del Code” 🛠️</h3><p>Imaginen esto para su próximo proyecto de fin de semana:</p><ol><li>El usuario sube una foto de su nevera a tu app.</li><li><strong>Firebase Storage</strong> guarda la foto.</li><li>Una <strong>Cloud Function</strong> se dispara automáticamente (onFinalize).</li><li>La función llama a <strong>Gemini Vision</strong> a través del SDK: <em>“Oye, ¿qué puedo cocinar con estos ingredientes?”</em>.</li><li>Gemini devuelve una receta en formato JSON.</li><li>La función guarda la receta en <strong>Firestore</strong>.</li><li>Tu frontend reacciona en tiempo real y le muestra la receta al usuario.</li></ol><p>¡Todo eso sin tocar un solo servidor Linux! 🐧🚫</p><h3>👨‍💻 El Código: Donde ocurre la magia</h3><p>Para que vean que no es puro humo, aquí les traigo un <em>snippet</em> de cómo se ve esto en la vida real usando <strong>TypeScript</strong> y <strong>Cloud Functions (2nd Gen)</strong>.</p><p>Vamos a crear una función que escuche cuando un usuario crea un documento en la colección chats. La función toma el texto, se lo manda a Gemini y actualiza el documento con la respuesta.</p><pre>import { onDocumentCreated } from &quot;firebase-functions/v2/firestore&quot;;<br>import { GoogleGenerativeAI } from &quot;@google/generative-ai&quot;;<br>import * as logger from &quot;firebase-functions/logger&quot;;<br><br>// 1. Inicializamos el cliente de Gemini<br>// ¡Recuerden guardar su API Key en las variables de entorno, nada de hardcodear! 😉<br>const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY || &quot;&quot;);<br>const model = genAI.getGenerativeModel({ model: &quot;gemini-1.5-flash&quot; });<br><br>export const chatWithGemini = onDocumentCreated(&quot;chats/{chatId}&quot;, async (event) =&gt; {<br>    // 2. Obtenemos la data del documento nuevo<br>    const snapshot = event.data;<br>    if (!snapshot) {<br>        return;<br>    }<br><br>    const data = snapshot.data();<br>    const userPrompt = data.prompt;<br><br>    if (!userPrompt) {<br>        logger.warn(&quot;¡Oye! No hay prompt en este documento.&quot;);<br>        return;<br>    }<br><br>    try {<br>        // 3. Invocamos a la bestia (Gemini) 🧠<br>        const result = await model.generateContent(userPrompt);<br>        const response = result.response.text();<br><br>        // 4. Guardamos la respuesta de vuelta en Firestore<br>        // ¡Así de fácil el frontend recibe la data en tiempo real!<br>        await snapshot.ref.update({<br>            response: response,<br>            status: &quot;completed&quot;,<br>            timestamp: new Date()<br>        });<br><br>        logger.info(&quot;¡Misión cumplida! Gemini ha hablado. 🤖&quot;);<br><br>    } catch (error) {<br>        logger.error(&quot;Ups, algo explotó&quot;, error);<br>        await snapshot.ref.update({ status: &quot;error&quot; });<br>    }<br>});</pre><p>¿Vieron qué limpio? Con menos de 50 líneas de código tienen un backend que escala automáticamente y utiliza uno de los modelos de IA más potentes del mundo. ¡Eso es eficiencia, <strong>loquillos y loquillas</strong>!</p><h3>Conclusión</h3><p>Mis <strong>loquillos y loquillas del code</strong>, estamos en la era dorada del desarrollo. Ya no hay excusas para no integrar IA en sus proyectos. La combinación de <strong>Gemini CLI</strong> para el cerebro y <strong>Firebase</strong> para el cuerpo es, hoy por hoy, una de las arquitecturas más eficientes, baratas y escalables que existen.</p><p>¡A picar código se ha dicho! No olviden dejarme en los comentarios qué van a construir con esto. 🔥👨‍💻👩‍💻</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=29387c072ac9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ ¡Adiós al Alt-Tab! Gemini 3 Pro y la nueva CLI: El Combo Definitivo para Devs]]></title>
            <link>https://rellydev.medium.com/adi%C3%B3s-al-alt-tab-gemini-3-pro-y-la-nueva-cli-el-combo-definitivo-para-devs-a211f75d5c7a?source=rss-9154c93e4a34------2</link>
            <guid isPermaLink="false">https://medium.com/p/a211f75d5c7a</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[google]]></category>
            <dc:creator><![CDATA[Abiel Jesrrel (Relly) Delgado Lee]]></dc:creator>
            <pubDate>Fri, 21 Nov 2025 12:07:13 GMT</pubDate>
            <atom:updated>2025-11-21T12:07:13.847Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gCM1Xk7Pe5qMOsFr.jpg" /></figure><p><strong>¡Qué tal, loquillos y loquillas del code!</strong> 👋</p><p>Aquí su amigo <strong>RellyDev</strong> reportándose. Hoy no les traigo un tutorial cualquiera, hoy vengo a traerles <em>la</em> noticia que va a cambiar la forma en la que picamos código. Si creían que la IA ya era parte de su flujo de trabajo, agárrense de la silla porque lo que Google acaba de soltar con <strong>Gemini 3 Pro</strong> y su integración nativa en <strong>CLI</strong> es simplemente <strong>NIVEL DIOS</strong>. 🤯</p><p>¿Listos para ver el futuro? ¡Vamos al lío!</p><h3>🧠 ¿Qué trae de nuevo Gemini 3 Pro?</h3><p>Primero, hablemos del motor. Gemini 3 Pro no es solo una mejora incremental; es un salto cuántico en razonamiento lógico y comprensión de contexto.</p><ul><li><strong>Ventana de Contexto “Infinita”:</strong> Ya no importa si tu repo tiene 50 archivos o 5,000. Gemini 3 Pro se lo come todo sin alucinar.</li><li><strong>Razonamiento Multi-hop:</strong> Ahora puede seguir la lógica de un bug que salta entre el frontend, el backend y la base de datos sin perder el hilo.</li><li><strong>Velocidad Supersónica:</strong> La latencia es prácticamente cero. Es como tener a un Senior Engineer sentado a tu lado respondiendo antes de que termines de preguntar.</li></ul><h3>💻 La Joya de la Corona: Gemini CLI Integration</h3><p>Aquí es donde la cosa se pone interesante para nosotros, los que vivimos en la terminal. Olvídense de copiar y pegar errores en el navegador. Google ha lanzado la <strong>Gemini CLI nativa</strong>.</p><p>Imaginen esto. Están en su terminal y les salta un error horrible en Python. Antes: <em>Copiar error -&gt; Alt-Tab -&gt; Navegador -&gt; Pegar -&gt; Esperar -&gt; Copiar solución -&gt; Alt-Tab -&gt; Pegar</em>. 😴</p><p><strong>Ahora con Gemini CLI:</strong></p><pre>$ python main.py 2&gt; error.log<br>$ cat error.log | gemini fix --explain</pre><p>¡PUM! 💥 Gemini lee el error, analiza tu código local (sí, tiene acceso seguro al contexto de tu directorio actual si se lo permites) y te da la solución directamente en la terminal o incluso te genera un PR automático.</p><h3>Comandos que me volaron la cabeza:</h3><ol><li><strong>gemini refactor</strong>: Le pasas un archivo spaghetti y te devuelve una obra de arte limpia y tipada.</li><li><strong>gemini test --generate</strong>: Lee tu función y te crea los unit tests cubriendo los edge cases que ni tú habías pensado.</li><li><strong>gemini explain @archivo</strong>: ¿Entraste a un proyecto legacy y no entiendes nada? Le preguntas a la CLI y te explica la arquitectura en segundos.</li></ol><h3>🔥 Beneficios Enormes para mis Loquillos y Loquillas</h3><p>¿Por qué deberían emocionarse? Porque esto nos devuelve lo más valioso que tenemos: <strong>TIEMPO</strong>.</p><ol><li><strong>Adiós al Context Switching:</strong> Mantienes el <em>flow</em>. Todo sucede en tu IDE y tu terminal. No más distracciones con pestañas de Chrome abiertas.</li><li><strong>Debugging Proactivo:</strong> Gemini 3 Pro no solo arregla el error, te dice <em>por qué</em> pasó y cómo evitarlo en el futuro. Es como tener un mentor 24/7.</li><li><strong>Automatización de Tareas Aburridas:</strong> ¿Escribir documentación? ¿Hacer scripts de migración? Déjaselo a la CLI. Tú encárgate de la lógica de negocio compleja, que es donde está la diversión.</li></ol><blockquote><strong><em>El veredicto de RellyDev:</em></strong><em> Esta integración convierte a la terminal en un superpoder. Ya no es solo una pantalla negra con letras blancas; es un entorno de desarrollo inteligente y colaborativo.</em></blockquote><h3>👇 ¡Quiero leerlos!</h3><p>¿Qué es lo primero que van a automatizar con la nueva CLI? ¿Creen que esto reemplaza a Stack Overflow definitivamente? 🤔</p><p>Déjenme sus comentarios abajo, compartan este post si les voló la cabeza y recuerden: <strong>¡A seguir rompiéndola y picando código!</strong> 💻🔥</p><p>¡Nos vemos en el próximo commit loquillos y loquillas del code!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a211f75d5c7a" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>