<?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: Fernilo</title>
    <description>The latest articles on DEV Community by Fernilo (@fernilo).</description>
    <link>https://dev.to/fernilo</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%2F2220594%2F1f4f4dc6-ea52-4800-bb5c-f1d2a40468c8.jpeg</url>
      <title>DEV Community: Fernilo</title>
      <link>https://dev.to/fernilo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fernilo"/>
    <language>en</language>
    <item>
      <title>REST VS SOAP</title>
      <dc:creator>Fernilo</dc:creator>
      <pubDate>Fri, 29 Nov 2024 18:35:21 +0000</pubDate>
      <link>https://dev.to/fernilo/soap-12-simple-object-access-protocol-4cgl</link>
      <guid>https://dev.to/fernilo/soap-12-simple-object-access-protocol-4cgl</guid>
      <description>&lt;p&gt;Cuando se envía una solicitud de datos a una API de REST, se suele hacer a través de un protocolo de transferencia de hipertexto,  denominado HTTP. Una vez que reciben la solicitud, las API diseñadas para REST (conocidas como API o servicios web de RESTful) pueden devolver mensajes en distintos formatos: HTML, XML, texto sin formato y JSON. Opera principalmente mediante verbos HTTP (GET, POST, PUT, DELETE).&lt;/p&gt;

&lt;p&gt;REST es Menos robusto para transacciones complejas o seguridad avanzada pero es más rápido y ligero (JSON es menos pesado que XML). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escenarios comunes:&lt;/strong&gt; Aplicaciones web y móviles, API públicas.&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%2Fls92lcy3a7ms123zw6no.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%2Fls92lcy3a7ms123zw6no.png" alt="Image description" width="800" height="603"&gt;&lt;/a&gt;&lt;br&gt;
(Fuente: Seobility)&lt;/p&gt;

&lt;p&gt;SOAP (Simple Object Access Protocol) es un protocolo de comunicación basado en XML que permite la interacción entre sistemas a través de redes. Como es un protocolo, impone reglas integradas que aumentan la complejidad y la sobrecarga, lo cual puede retrasar el tiempo que tardan las páginas en cargarse&lt;/p&gt;

&lt;p&gt;Por su seguridad y por la integridad de los datos, SOAP es más recomendable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escenarios comunes:&lt;/strong&gt; Servicios empresariales, integraciones complejas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplos
&lt;/h3&gt;

&lt;h5&gt;
  
  
  REST(json)
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/users/123 HTTP/1.1
Host: example.com

Response:
{
    "id": 123,
    "name": "John Doe"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  SOAP(xml)
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /soap HTTP/1.1
Host: example.com
Content-Type: text/xml
&amp;lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;
    &amp;lt;soap:Body&amp;gt;
        &amp;lt;GetUser&amp;gt;
            &amp;lt;UserId&amp;gt;123&amp;lt;/UserId&amp;gt;
        &amp;lt;/GetUser&amp;gt;
    &amp;lt;/soap:Body&amp;gt;
&amp;lt;/soap:Envelope&amp;gt;

Response:
&amp;lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;
    &amp;lt;soap:Body&amp;gt;
        &amp;lt;GetUserResponse&amp;gt;
            &amp;lt;User&amp;gt;
                &amp;lt;Id&amp;gt;123&amp;lt;/Id&amp;gt;
                &amp;lt;Name&amp;gt;John Doe&amp;lt;/Name&amp;gt;
            &amp;lt;/User&amp;gt;
        &amp;lt;/GetUserResponse&amp;gt;
    &amp;lt;/soap:Body&amp;gt;
&amp;lt;/soap:Envelope&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>soap</category>
      <category>api</category>
      <category>rest</category>
      <category>json</category>
    </item>
    <item>
      <title>MyISAM VS InnoDB</title>
      <dc:creator>Fernilo</dc:creator>
      <pubDate>Tue, 05 Nov 2024 02:54:47 +0000</pubDate>
      <link>https://dev.to/fernilo/myisam-vs-innodb-55c4</link>
      <guid>https://dev.to/fernilo/myisam-vs-innodb-55c4</guid>
      <description>&lt;p&gt;Al estructurar la base de datos para nuestro producto, es fundamental considerar aspectos clave como la performance ,la integridad de los datos y la necesidad de manejar o no transacciones, entre otros factores. &lt;/p&gt;

&lt;p&gt;En MySQL, contamos con distintos motores de almacenamiento que nos permiten optimizar estos aspectos según los requerimientos del proyecto, garantizando un rendimiento eficiente y seguro.&lt;/p&gt;

&lt;p&gt;Dependiendo de la versión de mysql podemos utilizar los motores de almacenamiento:&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%2F7ell01ja7xg8u204zvp6.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%2F7ell01ja7xg8u204zvp6.png" alt="Image description" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora ¿Que función tienen los motores de almacenamiento?&lt;/p&gt;

&lt;p&gt;Los motores de almacenamiento gestionan el almacenamiento, la organización y la recuperación de datos en las tablas de la base de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuándo elegir InnoDB o MyISAM?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;InnoDB:&lt;/strong&gt; Si necesitas integridad de datos, soporte de transacciones o concurrencia alta en escrituras, InnoDB es ideal, ya que garantiza operaciones seguras y evita conflictos en entornos multiusuario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MyISAM:&lt;/strong&gt; Es adecuado cuando se requiere alta velocidad de lectura en aplicaciones de solo lectura o cuando las operaciones de escritura son poco frecuentes. Este motor es más rápido en lecturas pero tiene limitaciones en cuanto a integridad de datos y concurrencia en escritura.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;MyIsam o InnoDB&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Estos dos motores son los más utilizados y reconocidos. Cada uno tiene características que los hacen adecuados para diferentes tipos de aplicaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  InnoDB
&lt;/h3&gt;

&lt;p&gt;InnoDB es la version por default de MySQL desde la versión 5.5 (Julio 2010!).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transacciones:&lt;/strong&gt; Soporta transacciones ACID, lo cual es crucial para la integridad de datos.&lt;br&gt;
&lt;strong&gt;Integridad referencial:&lt;/strong&gt; Permite claves foráneas, manteniendo relaciones entre tablas, requiere índices para las llaves foráneas, Si no creas el índice manualmente, InnoDB lo creará automáticamente.&lt;br&gt;
&lt;strong&gt;Bloqueo de filas:&lt;/strong&gt; Ideal para alta concurrencia en escritura, ya que permite operaciones simultáneas sin bloquear la tabla completa.&lt;br&gt;
&lt;strong&gt;Recuperación de fallos:&lt;/strong&gt; Tiene mecanismos para recuperación automática en caso de error.&lt;br&gt;
&lt;strong&gt;Uso de memoria:&lt;/strong&gt; Requiere más memoria y almacenamiento.&lt;/p&gt;

&lt;h3&gt;
  
  
  MyISAM
&lt;/h3&gt;

&lt;p&gt;MyISAM fue el motor de almacenamiento predeterminado hasta diciembre de 2009; luego, InnoDB reemplazó al motor de almacenamiento predeterminado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No transaccional:&lt;/strong&gt; No soporta transacciones ni claves foráneas.&lt;br&gt;
&lt;strong&gt;No realiza verificación de integridad referencial:&lt;/strong&gt; No soporta llaves foráneas, los indices son opcionales&lt;br&gt;
&lt;strong&gt;Bloqueo de tablas:&lt;/strong&gt; Bloquea tablas completas en operaciones de escritura, lo cual puede ser más rápido en consultas de solo lectura, pero limita la concurrencia en escrituras.&lt;br&gt;
&lt;strong&gt;Velocidad en lectura:&lt;/strong&gt; más rápido para leer y ligeramente más rápido para insertar.&lt;br&gt;
&lt;strong&gt;Recuperación limitada:&lt;/strong&gt; Menos robusto ante fallos inesperados.&lt;br&gt;
&lt;strong&gt;Menor uso de memoria:&lt;/strong&gt; Ocupa menos espacio en almacenamiento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otros motores de almacenamiento en MySQL
&lt;/h2&gt;

&lt;p&gt;Además de InnoDB y MyISAM, MySQL ofrece otros motores de almacenamiento que pueden ser útiles en casos específicos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MEMORY:&lt;/strong&gt; Almacena datos en memoria RAM, proporcionando acceso extremadamente rápido. Ideal para tablas temporales o datos que necesitan una manipulación rápida y no requieren persistencia en disco.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARCHIVE:&lt;/strong&gt; Diseñado para almacenar grandes volúmenes de datos en formato comprimido. Se usa para registros de solo lectura, como logs, donde la recuperación rápida es menos prioritaria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSV:&lt;/strong&gt; Guarda los datos en formato CSV, permitiendo su fácil exportación e importación. Es útil para intercambiar datos entre aplicaciones o realizar análisis externos.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Transacciones en laravel</title>
      <dc:creator>Fernilo</dc:creator>
      <pubDate>Mon, 21 Oct 2024 23:01:26 +0000</pubDate>
      <link>https://dev.to/fernilo/transacciones-en-laravel-24fk</link>
      <guid>https://dev.to/fernilo/transacciones-en-laravel-24fk</guid>
      <description>&lt;p&gt;En ciertas ocasiones, necesitamos realizar una serie de operaciones consecutivas, y es fundamental que todas se completen con éxito, sin que ninguna quede a medias.&lt;/p&gt;

&lt;p&gt;Un ejemplo común es la creación de un usuario, donde es esencial que también se asignen roles y se envíe un correo de registro. &lt;/p&gt;

&lt;p&gt;Para manejar este tipo de situaciones, se utilizan las transacciones. A continuación, presentamos un método que crea un usuario, asigna el rol, y luego envía un correo a través del método sendEmail(). Este método recibe el correo electrónico como argumento y realiza el envío correspondiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\DB;

public function save(array $data)
{
    try {
           $user = User::create($data);

           $user-&amp;gt;syncRoles([$data['role']]);

           $this-&amp;gt;sendEmail([
                'email' =&amp;gt; $data['email'],
           ]);

            return $user;
   } catch (\Exception $e) {
          throw new BadRequestException("Error al guardar nuevo usuario");
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Debemos aplicar 3 métodos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DB::beginTransaction();&lt;/code&gt; Inicia una transacción&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DB::commit();&lt;/code&gt; Confirma los cambios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DB::rollback();&lt;/code&gt; En caso de que alguna operación no se pueda realizar revertirá todos los cambios haciendo que el estado sea el mismo a antes del inicio de la transacción.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementando transacciones en el código anterior nos queda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\DB;

public function save(array $data)
{
     // Iniciar la transacción
     DB::beginTransaction();
     try {

        $user = User::create($data);

        $user-&amp;gt;syncRoles([$data['role']]);

        $this-&amp;gt;sendEmail([
             'email' =&amp;gt; $data['email'],
        ]);

        // Confirmo la transacción
        DB::commit();

        return $user;
     } catch (\Exception $e) {
        // Si falla hago rollback
        DB::rollback();

        throw new BadRequestException("Error al guardar nuevo usuario");
     }
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto nos aseguramos que el conjunto de operaciones se ejecuten completamente o no se ejecuten en absoluto.&lt;/p&gt;

&lt;p&gt;Laravel también proporciona otro método mas concreto &lt;code&gt;transaction&lt;/code&gt; de la fachada DB. En este caso el &lt;code&gt;commit&lt;/code&gt; y el &lt;code&gt;rollback&lt;/code&gt; se realizan de forma automática. Esto es recomendable cuando la cantidad de operaciones son pocas o no requiere operaciones adicionales antes de realizar el &lt;code&gt;rollback&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB::transaction(function () use($data){

  $user = User::create($data);

  $user-&amp;gt;syncRoles([$data['role']]);

  $this-&amp;gt;sendEmail([
      'email' =&amp;gt; $data['email'],
  ]);

  return $user;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Importante: Consideraciones del motor de base de datos&lt;/strong&gt;&lt;br&gt;
No todos los motores de almacenamiento soportan transacciones. InnoDB es un motor que sí soporta transacciones, mientras que MyISAM no lo hace. Es fundamental asegurarse de que las tablas de la base de datos estén utilizando un motor que admita transacciones para que estas funcionen correctamente.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>database</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
