<?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: Pablo Agustín Canale</title>
    <description>The latest articles on DEV Community by Pablo Agustín Canale (@pablocanale).</description>
    <link>https://dev.to/pablocanale</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%2F766180%2F011fcf85-5b81-48a7-bca6-666d0f33202d.jpeg</url>
      <title>DEV Community: Pablo Agustín Canale</title>
      <link>https://dev.to/pablocanale</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pablocanale"/>
    <language>en</language>
    <item>
      <title>Certificados SSL</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Mon, 29 Aug 2022 18:00:35 +0000</pubDate>
      <link>https://dev.to/pablocanale/certificados-ssl-1f48</link>
      <guid>https://dev.to/pablocanale/certificados-ssl-1f48</guid>
      <description>&lt;p&gt;El protocolo SSL tiene sus fundamentos en dos conceptos:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Criptografía Asimétrica *&lt;/em&gt;(tambien conocida como criptografía de la clave pública)&lt;/p&gt;

&lt;p&gt;En este tipo de criptografía se generan dos claves relacionadas entre sí, una clave &lt;em&gt;pública&lt;/em&gt; y otra _privada, las cuales son generadas por algun algoritmo criptográfico.&lt;br&gt;
Entre los algoritmos más conocidos encontramos RSA, DSA y PKCS&lt;/p&gt;

&lt;p&gt;La clave pública es la que compartiremos con quienes queramos que se puedan comunicar con nosotros y la privada debemos mantenerla protegida, jamas compartirla. &lt;/p&gt;

&lt;p&gt;Cuando alguien quiere enviarnos un mensaje, este mensaje será encriptado con nuestra clave pública (previamente compartida) y solo nosotros podremos desencriptarlo utilizando la clave privada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criptografía Simétrica&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La forma simétrica utiliza una sola clave para encriptar y desencriptar, por lo tanto en una comunicación la clave solo la deberian tener ambas partes involucradas. Algunos de los algoritmos más conocidos utilizados son AES-128, AES-192 y AES-256.&lt;/p&gt;

&lt;p&gt;¿Qué es un certificado SSL?&lt;/p&gt;

&lt;p&gt;Tambien conocidos como certificados digitales, son archivos de datos emitidos por una autoridad certificada (CA, Certificate Authority) que utilizan criptografia asimétrica para establecer la conección segura entre dos partes utilizando el par de claves pública y privada. El certificado SSL contiene la clave pública y otros detalles, como la fecha de creación y expiración, la CA emitora del certificado e información sobre quienes lo están utilizando, entre otras cosas.&lt;/p&gt;

&lt;p&gt;El formato de un certificado esta dado por un standar llamado X.509.&lt;/p&gt;

&lt;p&gt;Hay diferentes formatos, PEM y PKCS#7 utilizan un codificado en Base64 ASCII mientras que DER y PKCS#12 lo hacen en binario.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Entrevista: Microservicios</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Thu, 24 Feb 2022 22:26:06 +0000</pubDate>
      <link>https://dev.to/pablocanale/entrevista-microservicios-4ifj</link>
      <guid>https://dev.to/pablocanale/entrevista-microservicios-4ifj</guid>
      <description>&lt;h2&gt;
  
  
  MICROSERVICIOS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es la arquitectura de Microservicios?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Podriamos hablar de un conjunto de caracteristicas para definirlos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Es un enfoque para crear una aplicacion como un conjunto de pequeños servicios independencientes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pueden comunicarse por HTTP (API REST) u otros mecanismos ligeros.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hay un mínimo de genstion centralizada, es decir contamos con variedad de servicios independientes que contribuyen a estos servicios mas grandes,desacomplando responsabilidades.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cada uno de los microservicios puede escribirse en lenguajes diferentes y utilizar diferentes bases de datos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¿Cuáles son las ventajas de los microservicios?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Como suelen ser servicios más pequeños suelen ser asignados a equipos de desarrollo chicos con conocimientos especificos haciendolos más manejables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pruebas atómicas, testeo de componentes más faciles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pruebas de integracion sectorizadas, E2E testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Permite utilizar diversas tecnoligias, teniendo cada microservicio la implementación que mas se ajuste a sus necesidades.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Facilita la implementación de múltiples instancias de un microservicio en diversos nodos. Escalabilidad horizontal.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Retos de la implementación de microservicios&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;El diseño adecuado, tanto cada microservicio particular como el conjunto de ellos formando la aplicación principal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gestión de infraestructura: configuracion distribuida, ApiGateway, control de resiliencia (adaptabilidad a fallos), patrones de reintentos, patron de circuit breaker. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gestión de transaccionalidad y la consistencia de los datos. Al tener servios con posibles bases de datos independientes es necesario asegurar la correcta persistencia y traslado de los datos de un lugar a otro.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo puede resolverse el problema de los parámetro de configuracion de los microservicios y sus instancias?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Patrón de configuración centralizada, cuando una aplicación se va a iniciar en el proceso de arranque va a buscar su configuración a un algun lugar (servidor de configuración) la lee y termina el arranque con esos datos. No hay que tener configuraciones locales.&lt;br&gt;
Se pueden cambiar estas configuraciones en "caliente" (una vez ya levantado el microservicio) utilizando features flags (hay empresas dedicadas a esto) o utilizando variables de entorno.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué mecanismos pueden implementarse para evitar fallos? RESILIENCIA&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Debemos conocer los fallos que puede tener la computación distribuida. (Voy a hacer otro post de esto)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dar una solución con Reintentos. Mecanismo que cuando un microservicio A llama a otro B  y este responde con un error, el A seguirá reintentando hacer la llamamada al servicio B.&lt;br&gt;
Sirve para dar solución a problemas transitorios de la red.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dar una solución con Circuit Breaker (CB). &lt;br&gt;
En el mismo escenario que arriba, el microservicio A tambien vuelve a reintentar llamados al microservicio B, pero luego de un estipulado número de fallos el CB hace un cambio de estado, para evitar la utilización innecesaria de recursos en procesar errores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El CB consiste en la implementación de una solución que permite tener mayor resiliencia,  hace de intermediario entre el cliente y el servicio que se desea consumir dando tres diferentes estados a las transacciones realiazadas. &lt;/p&gt;

&lt;p&gt;CLOSE, es cuando el flujo de llamada está funcionando correctamente. En caso de algun problema,una vez fallados ciertos intentos de llamada el CB pasa a estado abierto. &lt;/p&gt;

&lt;p&gt;OPEN, cuando pasa a estado abierto, corta el flujo de llamadas para evitar propagaciones de errores, encargandosé de la respuesta directa al cliente, avitando así la utilización de recursos innecesarios. El circuito continua abierto durante un periodo ya definido, luego de transcurrido ese tiempo pasa a estado semi-abierto.&lt;/p&gt;

&lt;p&gt;HALF-OPEN,se hace un mínimo de intentos para la corroboración del estado del servicio, si todo anda correctamente se restaura el flujo pasando a estado cerrado, de lo contrario volvera nuevamente a abierto y  se repite nuevamente el proceso.&lt;/p&gt;

&lt;p&gt;Podemos agregar a la fórmula una Fallback Policy (política de contingencia) y evitar cualquier tiempo de caida en nuestro flujo. Utilizando por ejemplo un servicio de respaldo alternativo mientras nuestro servicio principal esté caido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Que es servicio de descubrimiento y porqué son importantes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supongamos que tenemos 4 instancias de un servicio de menú y 2 instancias de pagos, todos con ids independientes. Si un tercer servicio de orden quiere consumir uno de los 4 servicios de menu y ademas que se realice el pago ¿Como sabe que servicio esta disponible y como encontrar su dirección?&lt;/p&gt;

&lt;p&gt;Necesitamos un Servidor de Registro y Descubrimiento (SRD):&lt;/p&gt;

&lt;p&gt;REGISTRO, cuando un servicio de la infraestructura inicia su operación o se levanta va a SRD a guardar su ubicación y disponibilidad Cualquier otro consumidor (por ejemplo el servicio de órdenes) puede saber en todo momento el estado y lugar del servicio requerido. Cada determinada cantidad de tiempo se realizan nuevas corroboraciones para asegurar la disponibilidad (healthCheck).&lt;/p&gt;

&lt;p&gt;DESCUCRIMIENTO, es la capacidad del servidor de devolver la ubicación correcta de las instancias activadas. Trabaja junto al balanceador de carga para determinar cual instancia esta con mayor disponibilidad.&lt;/p&gt;

&lt;p&gt;Continuara...&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>architecture</category>
      <category>webdev</category>
      <category>interview</category>
    </item>
    <item>
      <title>PATRONES DE DISEÑO</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Wed, 08 Dec 2021 18:47:39 +0000</pubDate>
      <link>https://dev.to/pablocanale/patrones-de-diseno-4nek</link>
      <guid>https://dev.to/pablocanale/patrones-de-diseno-4nek</guid>
      <description>&lt;p&gt;Cuando hablamos de patrones de diseño nos referimos a soluciones habituales a problemas comunes en el diseño de software. Podriamos hablar de un reseta a seguir que se puede amoldar para solucionar el problema en cuestión.&lt;/p&gt;

&lt;h2&gt;
  
  
  Categorias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Patrones creacionales&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proporcionan varios mecanismos de creación de objetos, permitiendo flexibilidad y reutilizacion de codigo. Por ejemplo,&lt;/p&gt;

&lt;p&gt;Factory Method:&lt;br&gt;
 Proporciona una interfaz para crear objetos en una superclase, las subclases pueden sobreescribir el metodo para cambiar el tipo de objeto que se creará.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_XpWfhE_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywbek16sqstxpnezahwq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_XpWfhE_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywbek16sqstxpnezahwq.png" alt="Image description" width="878" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Patrones estructurales&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los estructurales explican formas de ensamblar clases y objetos en estructuras más grandes, manteniendo los standares de flexibilidad y eficiencia. Por ejemplo,&lt;/p&gt;

&lt;p&gt;Decorator:&lt;br&gt;
  Es un patrón de diseño que permite añadir funcialidades a objetos colocando estos objetos dentro de objetos encapsuladores que contienen estas funcionalidades.&lt;/p&gt;

&lt;p&gt;"Wrapper" es el sobrenombre alternativo en ingles del patrón decorador. El wrapper implementa la misma interfaz que el objeto envuelto, haciendo del mismo bajo ojos del cliente un objeto idéntico. El Wrapper puede realizar alteraciones en el objeto antes y despues de su solicitud.&lt;/p&gt;

&lt;p&gt;Composite:&lt;br&gt;
 Permite componer objetos en ustructuras de árbol y trabajar con esas estructuras como si fueran objetos individuales.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Patrones de comportamiento&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los patrones de comportamiento tratan con metodos, algoritmos y la asignación de responsabilidades entre objetos.&lt;/p&gt;

&lt;p&gt;Iterador:&lt;br&gt;
 Nos permite una forma de recorrer los elementos en una coleccion sin saber si es una lista, pila, árbol, etc.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Conecciones de Microservicios y AWS</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Wed, 08 Dec 2021 17:07:48 +0000</pubDate>
      <link>https://dev.to/pablocanale/conecciones-de-microservicios-y-aws-4fjp</link>
      <guid>https://dev.to/pablocanale/conecciones-de-microservicios-y-aws-4fjp</guid>
      <description>&lt;h2&gt;
  
  
  ¿Como se se comunican los Microservicios?
&lt;/h2&gt;

&lt;p&gt;&lt;u&gt;Hay 2 formas:&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;La forma síncrona: comunicación entre servicios por medio de HTTP, manejando resquests y responses. Pero esto tiene un tiempos de respuesta altos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;La forma asíncrona: es utilizar colas de mensaje, si quiere comunicar un servicio A con uno B en el medio habrá una cola de mensajes, de la cual se hará cargo el servicio receptor a medida que vaya estando libre. Aminora los costos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ALGUNOS SERVICIOS AMAZON WEB SERVER (AWS)
&lt;/h2&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;SQS&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Amazon tiene un servicio llamado SQS (Simple Queue Service) , que maneja estas colas de forma serverless,  no tienen costos, las mantiene Amazon.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;DynamoDB&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Es un servicio de base de datos no relacional, permite todo tipo de operaciones CRUD y admite ACID principles.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;RDS: Relational Database Service&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Servicio de Amazon que nos brinda de base de datos relacional de forma serverless, el más común es aurora MySql.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Plataforma&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Nos brinda la infraestructura base y una capa sobre de software para facilitar la administración de las aplicaciones desplegadas.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Cloudwatch/Datadog&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Servicios de monitoreos, alertas y visualizacion de logs, sobre servicios AWS.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;VPC: Virtual Private Cloud&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Es principalmente una VPN, una red privada por la cual se conectan varios servicios, se puede configurar seguridad por medio de firewalls.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;API Gateway&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Permite exponer todos los servicos a través de una url única. Un rooteador de responses/requests y podes aportarle reglas de seguridad.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BG6g62Ov--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhwjy91o2phhutt6iyip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BG6g62Ov--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhwjy91o2phhutt6iyip.png" alt="Image description" width="782" height="456"&gt;&lt;/a&gt;  &lt;/p&gt;




&lt;p&gt;Ejemplo de conección a Dynamo con una libreria usando NodeJs&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ShBsD3fk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2076avbwjgugf70q57j9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ShBsD3fk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2076avbwjgugf70q57j9.png" alt="Image description" width="577" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>microservices</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>DOCKER</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Wed, 08 Dec 2021 04:01:25 +0000</pubDate>
      <link>https://dev.to/pablocanale/docker-597j</link>
      <guid>https://dev.to/pablocanale/docker-597j</guid>
      <description>&lt;h2&gt;
  
  
  DOCKER
&lt;/h2&gt;

&lt;p&gt;Docker es una plataforma de código abierto que permite a los desarrolladores empaquetar aplicaciones en contenedores y separar tus aplicaciones de tu infraestructura por medio de contenedores. &lt;br&gt;
Un contenedor es una unidad estandar de software que empaqueta código y todas las dependencias que este necesita para su funcionamiento, permite al desarrollador ejecutar el código en cualquier entorno informático.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gdXI0ReU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ke1568082qmlsnlxxn81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gdXI0ReU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ke1568082qmlsnlxxn81.png" alt="Image description" width="557" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Las imagenes de los contenedores son un paquete de software de poco peso que contiene todo lo necesario para correr una aplicacion, codigo, herramientas, librerias configuraciones, etc. &lt;/p&gt;

&lt;p&gt;Las imagenes de los contenedores se vuelven contenedores en tiempo de ejecución, cuando son ejecutadas en el Docker Engine. Podemos conseguir variedad de imagenes de Docker Hub.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Bases de datos y ORM</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Wed, 08 Dec 2021 02:53:29 +0000</pubDate>
      <link>https://dev.to/pablocanale/bases-de-datos-y-orm-3d5m</link>
      <guid>https://dev.to/pablocanale/bases-de-datos-y-orm-3d5m</guid>
      <description>&lt;p&gt;La base de datos es una recopilación de datos e información de forma organizada y estructurada.&lt;br&gt;
Normalmente cuentan con un sistema de gestión de base de datos (DBMS).&lt;/p&gt;

&lt;h2&gt;
  
  
  BASES DE DATOS RELACIONALES
&lt;/h2&gt;

&lt;p&gt;Es el modelo más utilizado hoy en día.&lt;br&gt;
En esencia las bases de datos relacionales son un conjunto de tablas formadas por columnas (campos) y filas (registros). La estructura nos ayuda a hacer &lt;strong&gt;relaciones&lt;/strong&gt; entre tablas mediante &lt;strong&gt;claves foráneas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿QUÉ ES UN DBMS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Es un programa que te permite crear, editar y administrar las bases de datos. La mayoria de las relacionales utilizan SQL, como MySQL o PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿QUÉ ES SQL?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Es un lenguaje de programación usado por casi todas las bases de datos relacionales para consultar, definir y manipular datos. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PRINCIPIOS ACID&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H1Ar2Gcs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kfa3addre1obkoiatdmj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H1Ar2Gcs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kfa3addre1obkoiatdmj.png" alt="Image description" width="386" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OBJECT RELATIONAL MAPPING (ORM)
&lt;/h2&gt;

&lt;p&gt;Es un modelo de programación que consiste en la transformación de las tablas de una base de datos, en una serie de entidades que simplifiquen las tareas básicas de acceso a los datos para el programador. &lt;/p&gt;

&lt;p&gt;¿Porqué queremos un ORM?&lt;/p&gt;

&lt;p&gt;Como sabemos SQL es el lenguaje más utilazado de consulta pero existen varios sistemas de gestión de base de datos que cuentan con diferencias en los mismos tipos de consultas, por ejemplo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EFo_-GFR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ijdhmv8idums8b0exjue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EFo_-GFR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ijdhmv8idums8b0exjue.png" alt="Image description" width="429" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto nos lleva a dificultades en el desarrollo ya que deberiamos aprendernos estas variaciones para cada base de datos distinta en la que trabajemos, y mas importante aún, si en un futuro deseamos migrar la aplicación, habría que reescribir una gran cantidad de consultas.&lt;/p&gt;

&lt;p&gt;Con el ORM nos facilitamos el trabajo, nos brinda ayuda en las labores básicas de cualquier acceso a datos, el CRUD (Create, Read, Update, Delete). Realizando todas estas labores a través de un lenguaje orientado a objetos.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>orm</category>
      <category>webdev</category>
      <category>database</category>
    </item>
    <item>
      <title>Principios SOLID</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Tue, 07 Dec 2021 22:09:20 +0000</pubDate>
      <link>https://dev.to/pablocanale/principios-solid-4oh9</link>
      <guid>https://dev.to/pablocanale/principios-solid-4oh9</guid>
      <description>&lt;h2&gt;
  
  
  ¿QUE ES SOLID?
&lt;/h2&gt;

&lt;p&gt;Es un acronónimo acuñado por Robert C.Martin (el tío Bob :D ), el escritor del Code Clean, representa los 5 principios basicos de la programación orientada a objetos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;S- Single Responsability: Resposabilidad simple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un componente o clase debe tener una responsabilidad única, sencilla y concreta. Dando simplicidad al código.&lt;/p&gt;

&lt;p&gt;Un ejemplo se observa cuando trabajamos con controladores y servicios en un MVC, por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export class AccountStatusController {
Si qui
  constructor(private accountStatusService: AccountStatusService) { }

  @Post() 
  create(@Body() accountStatus: AccountStatus): 
    Promise&amp;lt;AccountStatus&amp;gt; {
    return   
       this.accountStatusService.createStatus(accountStatus);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El controlador solo se encarga de la redirección de información (manejo de responses y requests), y los servicios de la lógica de negocio. En el controlador no se conocen detalles de la implementación de las funciones del servicio, de como realiza las consultas. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O- Open/Close:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Las entidades de software deben ser abiertas para la herencia pero cerradas a las modificaciones. &lt;/p&gt;

&lt;p&gt;Significa que ante peticiones de cambio en nuestro programá, debemos ser capaces de añadir funcionalidad sin alterar el codigo ya existente o al menos intentar tocarlo lo menos posible.&lt;/p&gt;

&lt;p&gt;Los problemas con el principio Open/close se suelen solucionar utilizando polimorfismo, es decir con la utilización de clases abstractas o interfaces.&lt;/p&gt;

&lt;p&gt;Supongamos que tenemos un servicio de notificaciones, que se encarga de mandar notificaciones dependiendo del tipo que le sea espeficicado por parámetro, esto rompe con el principio open/close porque sí el dia de mañana quiero agregarle otro tipo de envio, debo modificar el codigo ya existente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--04EjcBxH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8f1jf8fcn6m2ndqomiwj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--04EjcBxH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8f1jf8fcn6m2ndqomiwj.png" alt="Image description" width="880" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una forma de refactorizar es la siguiente, abstraemos en una clase abstracta o interface INotifications y la implementamos en las siguientes dos clases&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3leviIdp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e8pi4nye2ntz4ml8w56o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3leviIdp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e8pi4nye2ntz4ml8w56o.png" alt="Image description" width="880" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De esta forma, el servicio de notificación podría usar un array de notificaciones y las implementación del método &lt;em&gt;notify()&lt;/em&gt; dependenderia especificamente de cada clase concreta. Ahora sí quisieramos agregar otro tipo de servicio de notificación solo deberiamos crear una clase nueva e implementar la interface, no tocariamos para nada el codigo ya existente.&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  L-
&lt;/h2&gt;

&lt;p&gt;Liskov Substitution Principle (LSP)**&lt;/p&gt;

&lt;p&gt;Si tienes una clase padre la cual hereda a una clase hija, no debe la hija alterar el funcionamiento del padre.&lt;/p&gt;

&lt;p&gt;Esto quiere decir que si en un programa usamos cierta clase, deberíamos poder usar cualquiera de sus subclases sin interferir en la funcionalidad del programa.&lt;/p&gt;

&lt;p&gt;Para resaltar, es un principio que intenta dar buenas prácticas a la implementación de la herencia. Veamos un codigo donde no se cumple este principio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Persona {  

    constructor(nombres, dni, tarjeta){
      this.nombres = nombres
      this.dni = dni
      this.tarjeta = tarjeta
    }  

    getNombres() {
      return this.nombres;
    }
    setNombres(nombres) {
      this.nombres = nombres;
    }
    getDni() {
      return this.dni;
    }
    setDni(dni) {
      this.dni = dni;
    }
    getDni() {
        return this.dni;
      }
    setDni(tarjeta) {
        this.tarjeta = tarjeta;
    }
    Pagar() {
      return (console.log('Se realiza un pago'))
    }
  }

  class Niño  extends Persona{
    ...
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La clase persona esta bien definida individualmente, pero si intentamos hacer una clase derivada &lt;em&gt;Niño&lt;/em&gt; que extienda de persona nos encontrariamos con &lt;strong&gt;PROBLEMAS!&lt;/strong&gt; Un niño no podría tener una tarjeta y menos aun realizar pagos! &lt;/p&gt;

&lt;p&gt;Si cuando sobreescribimos un método en la clase que hereda necesitamos lanzar una excepción o no realizar nada, entonces probablemente estamos violando el LSP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I- Interface Segregation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una clases nunca debería depender de métodos que no usa, es decir que cuando hagamos interfaces que modalan comportamientos, deberiamos asegurarnos que las funciones que tenga esa interfaz van a ser relavantes para cualquier clase que las implemente. Si esto no pasa, podriamos dividir la interface en varias más pequeñas. &lt;/p&gt;

&lt;p&gt;Digamos que estamos implementando un zoológico y queremos crear una interfaz que sirva para todas las aves, la InterfazPajaro podria tener los métodos comer y volar para implementar en las clases gabiotas, flamenco y gorriones. Pero luego queremos agregar pingüinos (no vuelvan pero nadan) y aveztruces (corren) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eSICJylj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywzo2mzm8ci04io1n2q8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eSICJylj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywzo2mzm8ci04io1n2q8.png" alt="Image description" width="801" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La mejor forma de resolver esto es justamente ulilizando el principio de segregación de interfaces de la siguiente manera &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aQPdAg2Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trqcxcbm1ffiwqbkn3xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aQPdAg2Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trqcxcbm1ffiwqbkn3xl.png" alt="Image description" width="679" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De esta forma cada pájaro solo implementara las interfaces que necesita. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;D- Dependecy Inversion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;continuara...&lt;/p&gt;

</description>
      <category>codeclean</category>
      <category>javascript</category>
      <category>refactor</category>
      <category>interview</category>
    </item>
    <item>
      <title>Metodologías ágiles SCRUM</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Sat, 04 Dec 2021 23:06:18 +0000</pubDate>
      <link>https://dev.to/pablocanale/metodologias-agiles-scrum-2h5p</link>
      <guid>https://dev.to/pablocanale/metodologias-agiles-scrum-2h5p</guid>
      <description>&lt;p&gt;Las metodologías ágiles son aquellas que permiten adaptar la forma de trabajo a las condiciones del proyecto. Gracias a estas, las empresas consiguen gestionar sus proyectos de forma flexible, autónoma y eficaz, además de reducir costos y aumentar la productividad. Una de las más usadas es SCRUM.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;¿QUÉ ES SCRUM?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Es un framework o marco de trabajo utilizado para ayudar a las personas, equipos  y organizaciones a realizar proyectos complejos de una forma eficaz.&lt;/p&gt;

&lt;p&gt;Se basa en aspectos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Flexibilidad, adaptación a cambios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El factor humano.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Colaboración e interacción con el cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El desarrollo iterativo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ROLES en el Scrum:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;Product Owner&lt;/strong&gt;, es el responsable de reprentar las ideas del cliente en el proyecto, se encarga de la correcta realización del Product Backlog. &lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;Scrum Master&lt;/strong&gt;, es un lider servicial que se engarga de la buena realización del Scrum, brinda ayuda al equipo de desarrollo eliminando cualquier obstaculo que vaya apareciendo en el camino. Crea el backlog para el sprint. Enfoca al equipo en la iteración actual y trabaja estrechamente con el Product Owner. &lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;equipo de desarrollo&lt;/strong&gt; son los encargados de realizar las tareas priorizadas por el Product Owner, suelen ser pocas personas. Estiman las tareas del Product Backlog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿QUÉ ES EL SPRINT?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wyiEDy-Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/067ttnaadzt6sc9ebv70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wyiEDy-Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/067ttnaadzt6sc9ebv70.png" alt="Image description" width="880" height="446"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Es una iteración que suele agregar valor al producto, suele tener un intervalo de duración de 2 semanas a 1 mes. Allí se trabajan algunas de las tareas elegidas en el Product Backlog. El sprint cuenta con:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sprint planning:&lt;br&gt;
Reunión donde se decide que tareas abordar y el objetivo del sprint. Puede llegar a durar varias horas de duración. El equipo se compromete a hacer un sprint goal. Poker Planning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Daily meeting: &lt;br&gt;
Reunión diaria de corta duración, de 15 a 30 minutos aproximadamente. Se debe realizar con el Scrum Master y el equipo de desarrollo. Cada integrante éxplica allí en que esta trabajando y como lo realizará, tambien aquí se deben prensentar los impedimentos diarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sprint review: La famosa &lt;em&gt;DEMO&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se hace al final del sprint y es la única reunion a la que puede asistir el cliente. En ella se presenta al cliente lo desarrollado. Aquí el cliente verifica el avance y puede realizar feedback de lo expuesto. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sprint retrospective:
Es último evento de Scrum, el equipo se reune para evaluar como fue la implementación de la metodología en el sprint. Se busca que los integrantes reflexionen y propongan mejoras para la siguiente iteración.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Herramientras principales del SCRUM:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product Backlog&lt;/strong&gt;- Lista de requerimientos que engloban todo el proyecto, el producto Owner es el encargado de ordenarlo cumpliendo con los requerimientos del cliente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint Backlog&lt;/strong&gt;- Son un grupo de tareas del product backlog definidas en el sprint planning que el equipo de desarrollo se compromete a realizar durante el sprint.&lt;/p&gt;

</description>
      <category>intervew</category>
      <category>scrum</category>
      <category>agil</category>
    </item>
    <item>
      <title>API REST</title>
      <dc:creator>Pablo Agustín Canale</dc:creator>
      <pubDate>Thu, 02 Dec 2021 14:22:36 +0000</pubDate>
      <link>https://dev.to/pablocanale/preguntas-y-respuestas-de-entrevitas-backend-js-3177</link>
      <guid>https://dev.to/pablocanale/preguntas-y-respuestas-de-entrevitas-backend-js-3177</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;¿QUÉ ES UNA API?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Significa "Application Programming Interface", es un software que hace de intermediario entre dos aplicaciones, teniendo así un conjunto de reglas que nos permite la comunicación. &lt;br&gt;
En contraste con la interfaz de usuario la cual conecta a una persona con la computadora, las APIs conectan computadoras o piezas de software entre ellas.&lt;/p&gt;

&lt;p&gt;Las APIs estan constituidas de diferentes partes que actuan como herramientas o servicios que estan al alcance del programador. Cuando un programador usa estas partes se dice que "llama" (&lt;em&gt;call&lt;/em&gt;) a esa porción de la API. Estas llamadas son tambien conocidas como subrutinas, requests o endpoints.&lt;/p&gt;

&lt;p&gt;Por ejemplo si tenemos una aplicación web con su información almacenada en un servidor, la forma de acceder a los datos es por medio de una API. El servidor realizará la consulta a la base de datos y por medio de la API la información llegara a la aplicación.&lt;br&gt;
La API funciona como una &lt;em&gt;"fachada"&lt;/em&gt; para el cliente (software que quiere utilizar nuestras API) ya que solo exponen acciones sensillas, aunque por detras se esten realizando cosas muy complejas.&lt;/p&gt;

&lt;p&gt;Entonces, las API's de servicios web nos permiten el intercambio de información entre un servidor y un cliente, la comunicación se hará utizando el protocolo HTTP o HTTPS los datos normalmente son transportandos en formato JSON o XML&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ENDPOINT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Es un final de un canal de comunicación, es decir que cuando dos APIs interactuan entre si el punto de contacto entre ambas es lo que se denomina endpoint. Son las locaciones donde cada API puede acceder a los recursos que necesita para realizar sus funciones. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hIclzOKm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p1j5dujnr3ff5hlj1bt0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hIclzOKm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p1j5dujnr3ff5hlj1bt0.png" alt="Image description" width="819" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El lugar donde las APIs mandan requests y donde estan los recursos de la misma, son los endpoints. Puntos de entrada y salida de activos e informacion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hypertext Transfer Protocol&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Protocolo (conjunto de reglas) diseñado para la transferencia de información entre dispositivos que trabajan conectados en red. En definitiva, es lo que nos permite navegar en la web por medio de direcciones.&lt;/p&gt;

&lt;p&gt;HTTP sigue el clásico "cliente-servidor modelo", en donde un cliente abre una conección haciendo una request, luego espera a recibir la respuesta por parte del servidor.&lt;/p&gt;

&lt;p&gt;Métodos básicos de HTTP: POST, GET, PUT, PATCH y DELETE&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;REST es un tipo de API (es un servicio web), nos habla de un conjunto de reglas y estándares sobre como construir una API.&lt;br&gt;
Es decir es decir es una aplicacion del lado del backend que se engarga de la comunicación con la base de datos, lógica, etc. Dicha aplicación puede ser utilizada por medio del protococolo HTTP por cualquier tipo de cliente.&lt;/p&gt;

&lt;p&gt;Entonces vamos a tener diferentes métodos en los controladores de nuestra API REST y para cada uno de ellos vamos a tener definida una ruta (url) especifica y cada una de esas rutas tendra un método HTTP diferente&lt;/p&gt;

&lt;p&gt;En conclusión:&lt;/p&gt;

&lt;p&gt;REST simplemente es un principio sobre como usar las URLs (para la transferencia de datos) y el protocolo HTTP para estructurar una API.&lt;/p&gt;

</description>
      <category>http</category>
      <category>interview</category>
      <category>api</category>
      <category>rest</category>
    </item>
  </channel>
</rss>
