<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Omar Guerrero</title>
    <description>The latest articles on DEV Community by Omar Guerrero (@omargpax).</description>
    <link>https://dev.to/omargpax</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3039450%2Fafae1104-f922-4f5b-b4e4-f938a976564c.jpeg</url>
      <title>DEV Community: Omar Guerrero</title>
      <link>https://dev.to/omargpax</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omargpax"/>
    <language>en</language>
    <item>
      <title>D-MO (Data Micro-Optimizer)</title>
      <dc:creator>Omar Guerrero</dc:creator>
      <pubDate>Tue, 18 Aug 2026 21:07:05 +0000</pubDate>
      <link>https://dev.to/omargpax/d-mo-data-micro-optimizer-244f</link>
      <guid>https://dev.to/omargpax/d-mo-data-micro-optimizer-244f</guid>
      <description>&lt;p&gt;En el día a día del desarrollo de software y el análisis de datos, la preparación y limpieza de archivos financieros suele ser una de las tareas más repetitivas y propensas a errores. Tratar con layouts rígidos, filas desfasadas y nombres de columnas que cambian sin previo aviso genera una fricción operativa constante.&lt;/p&gt;

&lt;p&gt;Para resolver este problema de raíz—y manteniendo un enfoque estricto en la seguridad de la información—desarrollé &lt;strong&gt;D-MO (Data Micro-Optimizer)&lt;/strong&gt;, una potente herramienta web de procesamiento &lt;strong&gt;ETL (Extract, Transform, Load)&lt;/strong&gt; que corre completamente del lado del cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Origen: Privacidad por Diseño
&lt;/h2&gt;

&lt;p&gt;Cuando manejamos reportes bancarios o información financiera sensible, subirlos a plataformas externas de conversión representa un riesgo crítico de seguridad. &lt;strong&gt;D-MO nació bajo la premisa de la privacidad absoluta:&lt;/strong&gt; todo el procesamiento ocurre en la memoria local del navegador a través del cliente. Los datos estructurados jamás se envían a un servidor externo, eliminando latencias de red y garantizando un entorno de &lt;em&gt;zero server overhead&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitectura del Pipeline (Flujo de Datos)
&lt;/h2&gt;

&lt;p&gt;El sistema procesa la información de manera secuencial a través de un flujo desacoplado, lo que permite transformar archivos complejos en datasets listos para producción en un solo clic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   [ Archivo Local ] (.csv / .xlsx / .xlsb)
         │
         ▼
   ┌──────────────┐
   │  DropZone    │ ◄── Validación de Extensión y Tamaño
   └──────┬───────┘
         │ (Buffer / Texto plano)
         ▼
   ┌──────────────┐
   │ File Parser  │ ◄── Detección de delimitadores y headers dinámicos
   └──────┬───────┘
         │ (JSON Normalizado)
         ▼
   ┌──────────────┐
   │  ETL Engine  │ ◄── Reglas de Negocio, Mapeo de Alias y Filtros CUSTOM
   └──────┬───────┘
         │ (Dataset Limpio)
         ▼
   ┌──────────────┐
   │ Export File  │ ◄── Generación de reportes limpios listos
   └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Core Técnico y Capas del Sistema
&lt;/h2&gt;

&lt;p&gt;La aplicación está construida sobre &lt;strong&gt;Next.js 14 (App Router)&lt;/strong&gt; y &lt;strong&gt;TypeScript&lt;/strong&gt;, dividiendo su lógica interna en tres componentes principales:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Interfaz y Coordinación (&lt;code&gt;page.tsx&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Actúa como el orquestador del ciclo de vida de los datos. Captura los archivos cargados mediante una interfaz arrastrar y soltar (&lt;code&gt;DropZone&lt;/code&gt;), invoca las utilidades de parseo, alimenta al motor de transformación con el estado actual y actualiza dinámicamente las métricas de la UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Capa de Parseo y Serialización (&lt;code&gt;file-parser.ts&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Utiliza la librería &lt;code&gt;xlsx&lt;/code&gt; (SheetJS) para analizar libros de trabajo, normalizando los datos en bruto y resolviendo dinámicamente la fila correcta de cabeceras en archivos de Excel complejos.&lt;/li&gt;
&lt;li&gt;Implementa &lt;code&gt;papaparse&lt;/code&gt; para realizar una lectura veloz mediante streaming en memoria y detección automática de delimitadores en archivos CSV.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Motor de Reglas Tolerante a Variaciones (&lt;code&gt;etl-engine.ts&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Es el cerebro de D-MO. Utiliza un sistema robusto de emparejamiento basado en funciones de normalización de cadenas de texto. Esto permite que el motor identifique cabeceras dinámicas mediante un catálogo flexible de alias, procesando layouts con sutiles diferencias en los nombres de las columnas sin romper el flujo de transformación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Enfoque conceptual del mapeo dinámico y tolerante a alias&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;resolveColumnHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;aliasMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;normalizedTarget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[\s&lt;/span&gt;&lt;span class="sr"&gt;_-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aliasMap&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[\s&lt;/span&gt;&lt;span class="sr"&gt;_-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;normalizedTarget&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Panel de Control e Indicadores en Tiempo Real
&lt;/h2&gt;

&lt;p&gt;Para dar soporte visual y trazabilidad completa al proceso técnico, la UI cuenta con dos secciones clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consola de Logs (&lt;code&gt;LogConsole&lt;/code&gt;):&lt;/strong&gt; Proporciona auditoría visual en tiempo real de cada validación y transformación ejecutada por el motor, categorizada por estados mediante un diseño limpio (&lt;code&gt;info&lt;/code&gt;, &lt;code&gt;warn&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;, &lt;code&gt;success&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panel de Métricas (&lt;code&gt;StatsBar&lt;/code&gt;):&lt;/strong&gt; Visualización analítica inmediata que muestra las filas procesadas vs. exportadas, el conteo de columnas resultantes y el tiempo exacto de ejecución del pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparativa de Enfoques
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Procesamiento Tradicional (Servidor)&lt;/th&gt;
&lt;th&gt;Enfoque D-MO (Cliente)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Riesgo potencial al transferir datos a terceros&lt;/td&gt;
&lt;td&gt;Privacidad absoluta; los datos nunca salen del navegador&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Costos de Infraestructura&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requiere servidores dedicados y escalabilidad de cómputo&lt;/td&gt;
&lt;td&gt;Consumo de infraestructura cero; utiliza el hardware del cliente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Velocidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sujeto a la latencia de subida y bajada de la red&lt;/td&gt;
&lt;td&gt;Procesamiento instantáneo directo en memoria&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;D-MO demuestra que no siempre es necesario delegar flujos de datos operativos pesados a arquitecturas de backend complejas. Trasladar la lógica de un pipeline ETL directo al cliente usando TypeScript no solo abarata costos de infraestructura, sino que resuelve el factor más crítico en entornos financieros corporativos: el cumplimiento normativo y el resguardo de la información.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Al construir herramientas de datos basadas en el cliente, prioriza librerías que soporten lecturas por bloques o streaming para evitar congelar el hilo principal (Main Thread) de la interfaz de usuario al procesar datasets masivos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Prueba: &lt;a href="https://dmo.omargpax.dev" rel="noopener noreferrer"&gt;dmo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>nextjs</category>
      <category>etl</category>
      <category>ai</category>
    </item>
    <item>
      <title>Personalised creator-badge and sound player?</title>
      <dc:creator>Omar Guerrero</dc:creator>
      <pubDate>Thu, 10 Apr 2025 22:14:58 +0000</pubDate>
      <link>https://dev.to/omargpax/personalised-creator-badge-and-sound-player-3134</link>
      <guid>https://dev.to/omargpax/personalised-creator-badge-and-sound-player-3134</guid>
      <description>&lt;p&gt;Yep... just that. &lt;/p&gt;

&lt;p&gt;A few days ago I was wanting to try something new, and seeing the spotify embedded sound player I wanted to replicate it, but with a custom, creator oriented touch. It took me a few days to customize it and it's finally here (visit: &lt;a href="https://creator-badge.vercel.app" rel="noopener noreferrer"&gt;creator-badge&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub8ve81gotgf7ajzhjeb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub8ve81gotgf7ajzhjeb.png" alt=" " width="800" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I'm thinking of taking it a step further, how would you like it if I added little things like the number of followers on GitHub? Or maybe the number of fans on your main social network, whichever one you like to show the most on your card! I think that will be the mission of some early mornings well accompanied by coffee. ☕&lt;/p&gt;

&lt;p&gt;What do you think of this first version, would you embed it on your website? I'd love to hear your feedback - what do you think I could improve or change to make it even cooler?&lt;/p&gt;

&lt;p&gt;PS: In fact, I'm already working on a version that will return an SVG (without sound), similar to the cool &lt;a href="https://github.com/anuraghazra/github-readme-stats" rel="noopener noreferrer"&gt;github-readme-stats&lt;/a&gt;, but with its own features.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>github</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
