<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom">
    <title>José Luis Luna — Engineering Lab</title>
    <subtitle>Arquitectura de software, Laravel, automatización y sistemas en producción</subtitle>
    <link href="https://joseluislunarubio.net" rel="alternate" type="text/html"/>
    <link href="https://joseluislunarubio.net/feed.xml" rel="self" type="application/atom+xml"/>
    <id>https://joseluislunarubio.net</id>
    <updated>2026-06-22T04:50:24+00:00</updated>
    <author>
        <name>José Luis Luna Rubio</name>
        <uri>https://joseluislunarubio.net</uri>
    </author>
        <entry>
        <id>https://joseluislunarubio.net/post/laravel/colecciones-en-laravel-la-forma-mas-elegante-de-manipular-datos-26-26</id>
        <title>Colecciones en Laravel: La Forma Más Elegante de Manipular Datos</title>
        <link href="https://joseluislunarubio.net/post/laravel/colecciones-en-laravel-la-forma-mas-elegante-de-manipular-datos-26-26" rel="alternate" type="text/html"/>
        <published>2026-06-22T04:50:24+00:00</published>
        <updated>2026-06-22T04:50:24+00:00</updated>
                <category term="Laravel" label="Laravel"/>
                <summary type="html">Aprende a utilizar Collections en Laravel para transformar, filtrar y procesar datos de forma más limpia y expresiva que con arrays tradicionales.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/til/svg-animatemotion-calcmode-paced-distribuye-velocidad-por-distancia-no-por-tiempo-9</id>
        <title>SVG animateMotion: calcMode=&quot;paced&quot; distribuye velocidad por distancia, no por tiempo.</title>
        <link href="https://joseluislunarubio.net/post/til/svg-animatemotion-calcmode-paced-distribuye-velocidad-por-distancia-no-por-tiempo-9" rel="alternate" type="text/html"/>
        <published>2026-05-19T00:12:41+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="TIL" label="TIL"/>
                <summary type="html">calcMode=&quot;paced&quot; mantiene velocidad constante en recorridos de distancia variable.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/til/laravel-lazy-collections-procesar-500k-rows-sin-explotar-memoria-5</id>
        <title>Laravel Lazy Collections: procesar 500k rows sin explotar memoria.</title>
        <link href="https://joseluislunarubio.net/post/til/laravel-lazy-collections-procesar-500k-rows-sin-explotar-memoria-5" rel="alternate" type="text/html"/>
        <published>2026-05-15T00:12:41+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="TIL" label="TIL"/>
                <summary type="html">cursor() + LazyCollection para streaming — la memoria se mantiene constante sin importar el volumen.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/debug/n-1-en-componentes-livewire-detectarlo-con-debugbar-y-resolverlo-con-eager-loading-10</id>
        <title>N+1 en componentes Livewire: detectarlo con Debugbar y resolverlo con eager loading.</title>
        <link href="https://joseluislunarubio.net/post/debug/n-1-en-componentes-livewire-detectarlo-con-debugbar-y-resolverlo-con-eager-loading-10" rel="alternate" type="text/html"/>
        <published>2026-05-12T00:12:41+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="Debug" label="Debug"/>
                <summary type="html">Cada re-render de un componente Livewire puede disparar N+1 si no usas with() en la consulta.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/debug/redis-ttl-no-invalida-cache-entre-requests-en-laravel-octane-6</id>
        <title>Redis TTL no invalida cache entre requests en Laravel Octane.</title>
        <link href="https://joseluislunarubio.net/post/debug/redis-ttl-no-invalida-cache-entre-requests-en-laravel-octane-6" rel="alternate" type="text/html"/>
        <published>2026-05-10T00:12:41+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="Debug" label="Debug"/>
                <summary type="html">En Octane el proceso PHP persiste entre requests. El TTL expira en Redis, pero el in-memory cache del worker sigue sirviendo datos stale.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/erp/erp-modular-4-4</id>
        <title>ERP Modular</title>
        <link href="https://joseluislunarubio.net/post/erp/erp-modular-4-4" rel="alternate" type="text/html"/>
        <published>2026-05-07T23:45:12+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="ERP" label="ERP"/>
                <summary type="html">Filament + módulos desacoplados + capas de servicios — el patrón que escala de 10 a 10.000 usuarios sin rediseño.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/observacion/css-custom-properties-vs-variables-sass-el-caso-donde-las-nativas-ganan-siempre-11</id>
        <title>CSS custom properties vs variables Sass: el caso donde las nativas ganan siempre.</title>
        <link href="https://joseluislunarubio.net/post/observacion/css-custom-properties-vs-variables-sass-el-caso-donde-las-nativas-ganan-siempre-11" rel="alternate" type="text/html"/>
        <published>2026-05-06T00:12:41+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="Observación" label="Observación"/>
                <summary type="html">Las CSS custom properties pueden cambiar en runtime. Las variables Sass no existen en producción.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/snippet/extender-un-resource-de-filament-3-sin-modificar-el-vendor-7</id>
        <title>Extender un Resource de Filament 3 sin modificar el vendor.</title>
        <link href="https://joseluislunarubio.net/post/snippet/extender-un-resource-de-filament-3-sin-modificar-el-vendor-7" rel="alternate" type="text/html"/>
        <published>2026-05-03T00:12:41+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="Snippet" label="Snippet"/>
                <summary type="html">Con resolveRecordRouteBinding + panel extension puedes añadir páginas y acciones a cualquier Resource de plugin sin tocar su código.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/micro/cuando-introduces-una-cola-en-tu-app-la-regla-del-segundo-8</id>
        <title>¿Cuándo introduces una cola en tu app? La regla del segundo.</title>
        <link href="https://joseluislunarubio.net/post/micro/cuando-introduces-una-cola-en-tu-app-la-regla-del-segundo-8" rel="alternate" type="text/html"/>
        <published>2026-04-26T00:12:41+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="Micro" label="Micro"/>
                <summary type="html">Si una operación tarda más de 1 segundo o puede fallar sin impactar al usuario, va a la cola.</summary>
    </entry>
        <entry>
        <id>https://joseluislunarubio.net/post/full-stack/sistema-de-reservas-3-3</id>
        <title>Sistema de Reservas</title>
        <link href="https://joseluislunarubio.net/post/full-stack/sistema-de-reservas-3-3" rel="alternate" type="text/html"/>
        <published>2026-04-22T23:45:12+00:00</published>
        <updated>2026-06-21T20:16:42+00:00</updated>
                <category term="Full Stack" label="Full Stack"/>
                <summary type="html">Auth, disponibilidad, pagos, colas, emails y realtime — las 7 capas que procesan cada reserva en producción.</summary>
    </entry>
    </feed>
