<?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: Miguel Lopez</title>
    <description>The latest articles on DEV Community by Miguel Lopez (@miguelbc7).</description>
    <link>https://dev.to/miguelbc7</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F618693%2F048d8e42-436a-4f97-bd8a-67ab6ab9f4e0.jpeg</url>
      <title>DEV Community: Miguel Lopez</title>
      <link>https://dev.to/miguelbc7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miguelbc7"/>
    <language>en</language>
    <item>
      <title>Angular 19: Reactividad Simple</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Fri, 25 Apr 2025 18:43:05 +0000</pubDate>
      <link>https://dev.to/miguelbc7/angular-19-reactividad-simple-27ga</link>
      <guid>https://dev.to/miguelbc7/angular-19-reactividad-simple-27ga</guid>
      <description>&lt;p&gt;Hola de nuevo 👋. En artículos como &lt;a href="https://dev.to/miguelbc7/tu-chatbot-open-source-en-vs-code-6og"&gt;Tu Chatbot Open Source en VS Code&lt;/a&gt; o &lt;a href="https://dev.to/miguelbc7/mixins-en-sass-55i7"&gt;Mixins en SASS&lt;/a&gt;, siempre busco herramientas que hagan el código más limpio. ¡Hoy les traigo los nuevos Signals, Models y el control flow con @if, &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/else"&gt;@else&lt;/a&gt; y &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Signals: Reactividad Sin Esfuerzo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Los Signals son variables "inteligentes" que actualizan la UI automáticamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Ejemplo: Contador reactivo  
import { signal, computed } from '@angular/core';  

class ContadorComponent {  
  count = signal(0);  
  double = computed(() =&amp;gt; this.count() * 2);  

  incrementar() {  
    this.count.update(v =&amp;gt; v + 1);  
  }  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Por qué me gustan?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No más subscribe() o async pipe.&lt;/li&gt;
&lt;li&gt;Integración perfecta con los nuevos @if y &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt; 😉.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Control Flow: Olvida los ngIf y ngFor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Angular 19 introduce una sintaxis más limpia para condicionales y bucles.&lt;/p&gt;

&lt;p&gt;@if y &lt;a class="mentioned-user" href="https://dev.to/else"&gt;@else&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Ejemplo: Mensaje de usuario --&amp;gt;  
@if (usuario()) {  
  &amp;lt;p&amp;gt;Bienvenido, {{ usuario().nombre }}&amp;lt;/p&amp;gt;  
} @else {  
  &amp;lt;p&amp;gt;Inicia sesión 🔑&amp;lt;/p&amp;gt;  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ventaja: Más intuitivo que *ngIf y else, sin .&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt; y &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Ejemplo: Lista de tareas --&amp;gt;  
@for (tarea of tareas(); track tarea.id) {  
  &amp;lt;div&amp;gt;{{ tarea.titulo }}&amp;lt;/div&amp;gt;  
} @empty {  
  &amp;lt;p&amp;gt;¡No hay tareas! 🎉&amp;lt;/p&amp;gt;  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;track: Mejora el rendimiento (¡adiós a trackBy!).&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;: Muestra contenido si la lista está vacía.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Models y Inputs: Validación Integrada&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Con Models, podras validar Inputs automaticamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { model } from '@angular/core';  

class FormularioComponent {  
  // Modelo con validación automática  
  email = model&amp;lt;string&amp;gt;('', {  
    validate: (valor) =&amp;gt; valor.includes('@') ? null : 'Email inválido ❌'  
  });  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Inject y Effect: Código Más Limpio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inyectar servicios sin constructor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { inject } from '@angular/core';  

class PerfilComponent {  
  servicioAuth = inject(AuthService); // ¡Magic!  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Effect para sincronizar datos (ejemplo: guardar en localStorage):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effect(() =&amp;gt; {  
  localStorage.setItem('tema', tema());  
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ejemplo Completo: Lista de Tareas Reactiva&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { signal, effect } from '@angular/core';  

class TareasComponent {  
  tareas = signal&amp;lt;Tarea[]&amp;gt;([]);  

  constructor() {  
    effect(() =&amp;gt; {  
      console.log('Tareas actualizadas:', this.tareas());  
    });  
  }  

  agregarTarea(titulo: string) {  
    this.tareas.update(t =&amp;gt; [...t, { id: Date.now(), titulo }]);  
  }  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Template con @for y @if --&amp;gt;  
@if (tareas().length &amp;gt; 0) {  
  &amp;lt;div class="lista"&amp;gt;  
    @for (tarea of tareas(); track tarea.id) {  
      &amp;lt;div&amp;gt;{{ tarea.titulo }}&amp;lt;/div&amp;gt;  
    }  
  &amp;lt;/div&amp;gt;  
} @else {  
  &amp;lt;p&amp;gt;¡Añade tu primera tarea! 📝&amp;lt;/p&amp;gt;  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Angular 19 me encanta por su sencillez. Los Signals, el nuevo control flow (@if, &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;) y Models eliminan código repetitivo y hacen todo más intuitivo.&lt;/p&gt;

&lt;p&gt;Para los que vienen de versiones antiguas:&lt;/p&gt;

&lt;p&gt;El nuevo control flow es opcional, pero recomiendo usarlo (¡es el futuro!).&lt;/p&gt;

&lt;p&gt;Signals integran mejor con Reactividad que los Observables en componentes simples.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tu Chatbot Open Source en VS Code</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Wed, 13 Nov 2024 14:53:37 +0000</pubDate>
      <link>https://dev.to/miguelbc7/tu-chatbot-open-source-en-vs-code-6og</link>
      <guid>https://dev.to/miguelbc7/tu-chatbot-open-source-en-vs-code-6og</guid>
      <description>&lt;p&gt;El día de hoy vamos a hablar sobre un tema que a muchos les interesa, como configurar nuestro propio chatbot open source en VS Code y que funcione sin internet (Pd: para la instalación si requerimos internet).&lt;/p&gt;

&lt;p&gt;Para el día de hoy utilizaremos 2 herramientas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;LM Studio, un software para uso de LLM open source como chatbots en nuestro sistema operativo. &lt;a href="https://lmstudio.ai/" rel="noopener noreferrer"&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continue, una extensión para VS Code que nos permitirá consumir nuestro modelo desde LM Studio. &lt;a href="https://marketplace.visualstudio.com/items?itemName=Continue.continue" rel="noopener noreferrer"&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El primer paso es descargar LM Studio e instalarlo en nuestro sistema operativo:&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%2Fh83kajmspasnjijvkl95.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%2Fh83kajmspasnjijvkl95.png" alt="Image description" width="684" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al tener LM Studio instalado, lo abrimos y a nuestra izquierda tenemos 4 iconos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat: Funciona muy parecido a Chatgpt, Gemini o Perplexity.&lt;/li&gt;
&lt;/ul&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%2Fmjsy2uaevj0dcnw136qb.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%2Fmjsy2uaevj0dcnw136qb.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer: Una sección para lanzar el LM Studio como API de terceros en local.&lt;/li&gt;
&lt;/ul&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%2F13sih1a3gvm4zzc2owdp.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%2F13sih1a3gvm4zzc2owdp.png" alt="Image description" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My models: Donde podrás ver todos los modelos disponibles en tu LM Studio.&lt;/li&gt;
&lt;/ul&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%2F0or3gwulvddsxj1zomlz.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%2F0or3gwulvddsxj1zomlz.png" alt="Image description" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discover: La sección donde se pueden descargar los distintos modelos.&lt;/li&gt;
&lt;/ul&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%2F2b3ai537dibm48ozxhmu.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%2F2b3ai537dibm48ozxhmu.png" alt="Image description" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora que ya entendemos un poco mejor la estructura del LM Studio, podemos comenzar por ir a la sección Discover y descargar los modelos que queramos, al tener esto listo ya podemos ir al chat y comenzar a usar el LM Studio como si de ChatGPT se tratara (Claro que no con tanta potencia, recordemos que esto es open source).&lt;/p&gt;

&lt;p&gt;Nos vamos a la pestaña de Chat y en medio de la pantalla hay una barra donde nos permite elegir entre todos los modelos que hemos descargado para iniciar el chat.&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%2F1a15zc4bfhbvdzh84yta.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%2F1a15zc4bfhbvdzh84yta.png" alt="Image description" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora podemos comenzar a hablar con nuestro chatbot sin ningun problema, y segun el modelo que utilicemos podemos darle archivos como imagenes, docx, xlsx, pdf, entre otros.&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%2Fcnf9jdspd47y38bcs0l9.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%2Fcnf9jdspd47y38bcs0l9.png" alt="Image description" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bueno podemos decir que ya tenemos un chatbot pero eso no es todo lo que queremos, queremos usar este chatbot dentro de VS Code para trabajar con el sin tener que estar moviéndonos entre pestañas y poder contextualizar rápidamente al modelo con el que estamos trabajando.&lt;/p&gt;

&lt;p&gt;Nos dirigimos a la pestaña Developer del LM Studio y presionamos el boton Start Server.&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%2F1yhcbi4yj50y6u1qbsb8.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%2F1yhcbi4yj50y6u1qbsb8.png" alt="Image description" width="371" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto lanzará el LM Studio como una API, luego vamos a descargar la extensión Continue (He dejado el link al principio).&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%2Fk6yjgcsp3a0jk0kpuxz8.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%2Fk6yjgcsp3a0jk0kpuxz8.png" alt="Image description" width="800" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Habiendo descargado la extensión en nuestro VS Code veremos algo muy parecido a esto:&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%2F80l3uquki3v9z1z59yqk.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%2F80l3uquki3v9z1z59yqk.png" alt="Image description" width="391" height="968"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Procedemos a configurarlo presionando en "Select Model" y luego "Add chat model"&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%2Fmvqgqy2xr9nvmumrvpeg.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%2Fmvqgqy2xr9nvmumrvpeg.png" alt="Image description" width="340" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto abrira un modal que nos solicitará algunos datos y lo configuraremos de la siguiente manera:&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%2Fql7up066emidhq73n5fi.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%2Fql7up066emidhq73n5fi.png" alt="Image description" width="346" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y ahora nuestro VS Code tiene su propio chatbot con modelos LLM open source.&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%2Fm64azfv6yw8pw8mj8ivm.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%2Fm64azfv6yw8pw8mj8ivm.png" alt="Image description" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E incluso nos permitira contextualizar o hacer algunas acciones directamente desde el código sin usar el chatbot.&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%2F0abcub2z1buew0x14s9c.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%2F0abcub2z1buew0x14s9c.png" alt="Image description" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto es todo por hoy, espero que les haya gustado este curso, pronto vendré con mas para ayudarlos con tips, cursos y herramientas para desarrolladores.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vscode</category>
      <category>extensions</category>
    </item>
    <item>
      <title>Mixins en SASS</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Wed, 13 Nov 2024 14:24:11 +0000</pubDate>
      <link>https://dev.to/miguelbc7/mixins-en-sass-11pn</link>
      <guid>https://dev.to/miguelbc7/mixins-en-sass-11pn</guid>
      <description>&lt;p&gt;Los mixins son herramientas que proveen los preprocesadores CSS, aunque no son funciones se pueden percibir como tal, y su principal utilidad es reutilizar código.&lt;/p&gt;

&lt;p&gt;En mas de una ocasión hemos tenido la necesidad de crear múltiples clases que hacen lo mismo pero cambian en un solo valor, ejemplo múltiples clases para el font-size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.fs-10 {
  font-size: 10px;
}
.fs-20 {
  font-size: 20px;
}
.fs-30 {
  font-size: 30px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si nos fijamos, lo único que cambia en este escenario es el numero tanto para nombrar la clase como para setear el valor del font-size, usado un mixin podemos crear una función que cree este código para nosotros de forma automatica.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Esto es un mapa, lo que conocemos como un objeto en javascript
$sizes: (
  "10": "10px",
  "20": "20px",
  "30": "30px"
) 

// El mixin que crea las clases
@mixin generate-font-sizes($sizes) {
  // Recorremos cada uno de los elementos del mapa
  @each $key, $value in $sizes{
    // Creamos la clase e interpolamos los valores
    .fs-#{$key} {
      font-size: #{$value};
    }
  }
}

// Invocamos al mixin para que se ejecute
@include generate-font-sizes($sizes);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al compilar nuestro código tendremos el mismo resultado que la primera vez, pero ahora pueden estar pensando que nuestro código es mas largo que el resultado, y tal vez es cierto pero si quiero por ejemplo hacer un recorrido del 1 al 100 y crear clases del fs-1 al fs-100 tambien puedo hacerlo con un mixin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@mixin generate-font-sizes() {
  @for $size from 1 through 100 {
    .fs-#{$size} {
      font-size: #{$size}px;
    }
  }
}
@include generate-font-sizes();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto tendremos el resultado esperado, y esto no solo sirve para el font-size sino para cualquier cosa que se nos ocurra, podemos construir grandes cantidades de código con pequeños bloques de código en un mixin.&lt;/p&gt;

&lt;p&gt;Esto es todo por ahora, aprendimos a usar los mixing&lt;/p&gt;

</description>
      <category>scss</category>
      <category>css</category>
    </item>
    <item>
      <title>Mixins en SASS</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Fri, 08 Nov 2024 16:57:57 +0000</pubDate>
      <link>https://dev.to/miguelbc7/mixins-en-sass-55i7</link>
      <guid>https://dev.to/miguelbc7/mixins-en-sass-55i7</guid>
      <description>&lt;p&gt;Los mixins son herramientas que proveen los preprocesadores CSS, aunque no son funciones se pueden percibir como tal, y su principal utilidad es reutilizar código.&lt;/p&gt;

&lt;p&gt;En mas de una ocasión hemos tenido la necesidad de crear múltiples clases que hacen lo mismo pero cambian en un solo valor, ejemplo múltiples clases para el font-size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.fs-10 {
  font-size: 10px;
}
.fs-20 {
  font-size: 20px;
}
.fs-30 {
  font-size: 30px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si nos fijamos, lo único que cambia en este escenario es el numero tanto para nombrar la clase como para setear el valor del font-size, usado un mixin podemos crear una función que cree este código para nosotros de forma automática.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Esto es un mapa, lo que conocemos como un objeto en JavaScript
$sizes: (
  "10": "10px",
  "20": "20px",
  "30": "30px"
) 

// El mixin que crea las clases
@mixin generate-font-sizes($sizes) {
  // Recorremos cada uno de los elementos del mapa
  @each $key, $value in $sizes{
    // Creamos la clase e interpolamos los valores
    .fs-#{$key} {
      font-size: #{$value};
    }
  }
}

// Invocamos al mixin para que se ejecute
@include generate-font-sizes($sizes);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al compilar nuestro código tendremos el mismo resultado que la primera vez, pero ahora pueden estar pensando que nuestro código es mas largo que el resultado, y tal vez es cierto pero si quiero por ejemplo hacer un recorrido del 1 al 100 y crear clases del fs-1 al fs-100 también puedo hacerlo con un mixin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// El mixin que crea las clases
@mixin generate-font-sizes() {
  // El loop que hace el recorrido de 1 a 100
  @for $size from 1 through 100 {
    // Creamos la clase e interpolamos los valores
    .fs-#{$size} {
      font-size: #{$size}px;
    }
  }
}

// Invocamos al mixin para que se ejecute
@include generate-font-sizes();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto tendremos el resultado esperado, y esto no solo sirve para el font-size sino para cualquier cosa que se nos ocurra, podemos construir grandes cantidades de código con pequeños bloques de código en un mixin.&lt;/p&gt;

&lt;p&gt;Esto es todo por ahora, aprendimos a usar los mixin y a reutilizar código CSS en los preprocesadores.&lt;/p&gt;

</description>
      <category>scss</category>
      <category>css</category>
    </item>
    <item>
      <title>El uso de los modelos de IA open source en el desarrollo</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Wed, 06 Nov 2024 14:08:11 +0000</pubDate>
      <link>https://dev.to/miguelbc7/el-uso-de-los-modelos-de-ia-open-source-en-el-desarrollo-3j9h</link>
      <guid>https://dev.to/miguelbc7/el-uso-de-los-modelos-de-ia-open-source-en-el-desarrollo-3j9h</guid>
      <description>&lt;p&gt;Durante el ultimo año han aparecido un gran numero de herramientas con inteligencia artificial para hacer mas sencilla la vida de los usuarios, ya sea generación de imágenes o chatbots, incluso escalando a herramientas que ejecutan procesos gigantescos y profesionales.&lt;/p&gt;

&lt;p&gt;He estado investigando, aprendiendo y probando muchas de estas herramientas desde chatgpt, gemini hasta dall-e o midjourney, todas funcionan muy bien pero cuando yo quiero escalar mis aplicaciones con estas herramientas me encuentro con que no tienen una alternativa gratuita u open source.&lt;/p&gt;

&lt;p&gt;Esto me ha hecho llevar mi investigación a un paso mas allá y me he encontrado con &lt;strong&gt;stable diffusion ui&lt;/strong&gt; (Generación de imágenes, &lt;a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" rel="noopener noreferrer"&gt;https://github.com/AUTOMATIC1111/stable-diffusion-webui&lt;/a&gt;) y con *&lt;em&gt;ollama *&lt;/em&gt;(Chatbot, &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;https://ollama.com/&lt;/a&gt;), ambas son herramientas open source que te permiten ejecutar un servicio como API para consumirlo desde cualquiera de nuestras aplicaciones, con esto he llegado un paso mas allá con alternativas open source, pero para que esto funcione debo mantener estas herramientas ejecutándose para ser consumidas por nuestras aplicaciones.&lt;/p&gt;

&lt;p&gt;Para entender como llevar esto a nuestras aplicaciones es importante entender como funcionan estas herramientas, y básicamente lo que hacen es utilizar archivos con la extensión "safetensors" que son LLM o modelos de lenguaje de gran tamaño, siendo estos modelos entrenados para realizar diferentes funciones según las necesidades de quien lo entrene (Ejemplo: Generación de imágenes, traducción, desarrollo de código, chatbot, entre otros).&lt;/p&gt;

&lt;p&gt;Al entender un poco los modelos LLM y los archivos "safetensors" nos llega la siguiente pregunta como usar estos archivos en mis aplicaciones, y aquí es donde entra HugginFace, una web/base de datos de modelos de inteligencia artificial open source, y han creado su librería propia para python con 2 componentes extremadamente útiles para lo que queremos "&lt;strong&gt;Transformers&lt;/strong&gt;" y "&lt;strong&gt;Diffusers&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Transformers *&lt;/em&gt;(&lt;a href="https://huggingface.co/docs/transformers/index" rel="noopener noreferrer"&gt;https://huggingface.co/docs/transformers/index&lt;/a&gt;) es el componente que nos permite consumir cualquier modelo especializado en texto, ejemplo convertir audio a texto o viceversa, modelos de chatbox como llama de Meta, entre otros.&lt;/p&gt;

&lt;p&gt;import transformers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import torch

model_id = "meta-llama/Llama-3.1-8B"

pipeline = transformers.pipeline(
    "text-generation", model=model_id, model_kwargs={"torch_dtype": torch.bfloat16}, device_map="auto"
)

pipeline("Hey how are you doing today?")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Diffusers&lt;/strong&gt; (&lt;a href="https://huggingface.co/docs/diffusers/index" rel="noopener noreferrer"&gt;https://huggingface.co/docs/diffusers/index&lt;/a&gt;) es el componente que nos permite consumir cualquier modelo especializado en generación de imágenes, ejemplo stable diffusion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from diffusers import AutoPipelineForText2Image
import torch

pipe = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")

prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."

image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A este proceso se le conoce como Inferencia de modelos LLM, y a partir de aquí basado en esta información puedes comenzar a aplicar inteligencia artificial en tus diferentes aplicaciones con Python.&lt;/p&gt;

&lt;p&gt;Cabe destacar que también he intentado usar la inferencia de modelos con otro lenguaje como nodejs y la verdad es que no funciona tan bien como con python, pero es importante mencionar que se necesita un hardware potente para la inferencia de modelos LLM por lo que lo que puedes ahorrar el uso de las API de ChatGPT o Gemini lo puedes gastar en comprar un hardware adecuado.&lt;/p&gt;

&lt;p&gt;Hasta aquí llega este mi primer articulo, espero que mi camino para el uso de modelos LLM en el desarrollo de software te ayude a saltar pasos en este camino.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
