<?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>Forem: Ariel Mirra</title>
    <description>The latest articles on Forem by Ariel Mirra (@arielmirra).</description>
    <link>https://forem.com/arielmirra</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%2F30411%2F1a1d5f78-4945-471c-9318-3f656dc4df98.jpg</url>
      <title>Forem: Ariel Mirra</title>
      <link>https://forem.com/arielmirra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/arielmirra"/>
    <language>en</language>
    <item>
      <title>Qué son las bases de datos orientadas a grafos y para qué se usan</title>
      <dc:creator>Ariel Mirra</dc:creator>
      <pubDate>Mon, 27 Jul 2020 17:09:00 +0000</pubDate>
      <link>https://forem.com/arielmirra/que-son-las-bases-de-datos-orientadas-a-grafos-y-para-que-se-usan-2j5j</link>
      <guid>https://forem.com/arielmirra/que-son-las-bases-de-datos-orientadas-a-grafos-y-para-que-se-usan-2j5j</guid>
      <description>&lt;p&gt;No importa si estas empezando a programar o sos un ingeniero experimentado, en cada proyecto te toca responder la pregunta: ¿Qué tecnología debería usar? ¿Qué soporta mejor lo que quiero hacer? En un mundo donde cada vez hay más opciones, esta pregunta no es tan fácil de responder. Pero te aseguro una cosa:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"La calidad del proyecto depende de los conocimientos y las tecnologías que el diseñador del mismo maneje" - El sabiondo Ariel&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Haciendo este análisis en mi tesis de grado conocí y usé las &lt;strong&gt;bases de datos orientadas a grafos&lt;/strong&gt; (o BDOG de acá en adelante), particularmente Neo4j y hoy vengo a transmitirte este conocimiento para expandir tus horizontes de software y herramientas.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es un grafo?
&lt;/h2&gt;

&lt;p&gt;Para los que no conocen este poderoso concepto, un grafo es simplemente una forma de guardar información en &lt;strong&gt;entidades y relaciones&lt;/strong&gt; , generalmente representado como &lt;strong&gt;nodos y vértices&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A diferencia de las bases de datos relacionales (todo lo que use SQL), estas bases de datos representan entidades sin conceptos como &lt;em&gt;keys&lt;/em&gt; (PK/FK), cardinalidad, herencia y otros. Las bases de datos orientadas a grafos son más simples a la hora de guardar la información. ¿Esto es bueno? ¿Es malo? Depende únicamente de lo que querés hacer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quiero verlo gráficamente
&lt;/h3&gt;

&lt;p&gt;Nada mejor para explicar este tipo de base de datos que con un gráfico:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2Fa8344fdb-a8d7-47b2-b942-be9e0ebec1c3" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2Fa8344fdb-a8d7-47b2-b942-be9e0ebec1c3" alt="Figura 1"&gt;&lt;/a&gt;Figura 1: Base de datos de clientes, órdenes y productos en una base de datos relacional&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F027fc289-ce8c-44b3-82d3-2a0b395273f3" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F027fc289-ce8c-44b3-82d3-2a0b395273f3" alt="Figura 2"&gt;&lt;/a&gt;Figura 2: Base de datos de clientes, órdenes y productos en una base de datos orientada a grafos&lt;/p&gt;

&lt;h3&gt;
  
  
  Perfecto, ¿Cuándo conviene usarla?
&lt;/h3&gt;

&lt;p&gt;En un grafo, agregar y quitar relaciones interdependientes y complejas entre entidades es sumamente fácil y más entendible. En cambio, en una base de datos basada en tablas la complejidad de agregar relaciones crece de forma exponencial a la complejidad del modelo. Con grafos, los cambios en el esquema de las entidades tienen un costo mucho mas bajo a SQL. Además, si lo que se quiere persistir es la relación entre entidades no cabe duda que un grafo es la mejor opción.&lt;/p&gt;

&lt;p&gt;Gracias a estas ventajas, las bases de datos orientadas a grafos son particularmente útiles en sistemas cuyos casos de uso requieren:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Representación de redes de información&lt;/li&gt;
&lt;li&gt;Información dinámica y cambiante&lt;/li&gt;
&lt;li&gt;No hay un esquema fijo&lt;/li&gt;
&lt;li&gt;Pueden haber distintos número de atributos &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redes sociales&lt;/li&gt;
&lt;li&gt;Knowledge Graphs para Inteligencia Artificial&lt;/li&gt;
&lt;li&gt;Sistemas de recomendaciones a usuarios&lt;/li&gt;
&lt;li&gt;Redes Neuronales de Machine Learning&lt;/li&gt;
&lt;li&gt;Árboles jerárquicos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Manos a la obra
&lt;/h2&gt;

&lt;p&gt;Suficiente teoría por hoy. Se aprende mucho más cuando los dedos empujan teclas.&lt;/p&gt;

&lt;p&gt;Para empezar descargaremos una excelente BDOG llamada &lt;a href="https://neo4j.com/download" rel="noopener noreferrer"&gt;Neo4j&lt;/a&gt;. También podemos jugar con el &lt;a href="https://neo4j.com/sandbox" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt; que nos ofrece para empezar ya mismo, es gratis y nos podemos registrar con Google.&lt;/p&gt;

&lt;p&gt;En lo que sigue del tutorial usaremos el sandbox así cualquiera puede seguir el tutorial. Lo que haremos será:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crearnos una cuenta y un proyecto en la plataforma&lt;/li&gt;
&lt;li&gt;Abrir el proyecto en el navegador&lt;/li&gt;
&lt;li&gt;Correr nuestra primer línea de Cypher Query Language&lt;/li&gt;
&lt;li&gt;Admirar la belleza de los nodos interconectados mediante relaciones y la excelente interfaz gráfica de Neo4j&lt;/li&gt;
&lt;li&gt;¡Y lo vamos a hacer todo esto en menos de 5 minutos!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Setup del proyecto
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F7e1038cb-955c-4691-abe1-5a5c7f2f54e5" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F7e1038cb-955c-4691-abe1-5a5c7f2f54e5" alt="proyecto de neo4j"&gt;&lt;/a&gt;Lo primero es ingresar a la plataforma y elegir un proyecto base para jugar. En mi caso elegí Twitter. Neo4j nos creó un container con nuestra BDOG en la que podemos jugar e incluso conectar con alguna aplicación nuestra. Ahora esperamos y abrimos el proyecto en el navegador.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F3d1b14eb-c716-4d7d-a996-6247b972ac47" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F3d1b14eb-c716-4d7d-a996-6247b972ac47" alt="alt"&gt;&lt;/a&gt;Lo primero que veremos será algo así, y acá mismo podemos quedarnos a experimentar un buen rato, pero como dije menos de 5 minutos vamos a simplemente correr la query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MATCH (n) RETURN n LIMIT 25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Que me mostrará 25 nodos y sus relaciones. Inmediatamente podemos ver cómo Neo4j grafica los nodos y sus relaciones y que podemos interactuar con ellos. En el menú de la izquierda podemos hacer selecciones y filtrar sin necesidad de correr comandos en &lt;a href="https://neo4j.com/developer/cypher-query-language" rel="noopener noreferrer"&gt;Cypher Query Language&lt;/a&gt; nosotros mismos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cypher Query Language
&lt;/h3&gt;

&lt;p&gt;Similar al SQL, a un grafo podemos recorrerlo y darle órdenes (queries) mediante un lenguaje llamado Cypher Query Language. Este lenguaje es bastante intuitivo para empezar, sobre todo si tenemos conocimientos previos de SQL. Acá les dejo una &lt;a href="https://neo4j.com/developer/cypher-resources" rel="noopener noreferrer"&gt;lista de recursos disponibles&lt;/a&gt; de Cypher incluyendo eBooks, videos y tutoriales por si quieren profundizar más sobre el tema (es super interesante).&lt;/p&gt;

&lt;p&gt;Volviendo a nuestra BDOG en el navegador, sea cual sea el comando que corrieron para analizar el grafo, lo interesante es que podemos ver la misma información plasmada en el grafo en formatos como tabla y JSON, lo que nos da una idea lo fácil y compatible que este tipo de bases de datos son con el resto del ecosistema:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2Fdf96f476-1b91-4a34-9770-f0692a202323" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2Fdf96f476-1b91-4a34-9770-f0692a202323" alt="alt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ya has visto suficiente
&lt;/h3&gt;

&lt;p&gt;Esto es todo lo que tenes que saber sobre BDOG para empezar, los puntos interesantes a tener en cuenta son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los casos de uso para usar una BDOG son definidos y particulares, hay que saber cuando usarlas y obtener todos sus beneficios&lt;/li&gt;
&lt;li&gt;Utiliza un lenguaje especial para recorrer el grafo&lt;/li&gt;
&lt;li&gt;Neo4j es el proveedor más conocido y posee recursos y una interfaz de calidad (y no, no me están pagando por decir esto lamentablemente).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ahora te toca a ti
&lt;/h2&gt;

&lt;p&gt;Espero que te haya servido para aprender algo nuevo, ahora te toca seguir aprendiendo y profundizando. Gracias por estar acá.&lt;/p&gt;

&lt;p&gt;Un saludo, &lt;a href="https://linktr.ee/arielmirra" rel="noopener noreferrer"&gt;Ariel Mirra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.instagram.com/ariel.mirra" rel="noopener noreferrer"&gt;instagam&lt;/a&gt; | &lt;a href="//linkedin.com/in/ariel-mirra"&gt;linkedin&lt;/a&gt; | &lt;a href="https://linktr.ee/arielmirra" rel="noopener noreferrer"&gt;otros proyectos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>neo4j</category>
      <category>db</category>
      <category>sql</category>
    </item>
    <item>
      <title>Qué es React, Redux y cómo se relacionan</title>
      <dc:creator>Ariel Mirra</dc:creator>
      <pubDate>Mon, 20 Jul 2020 14:30:35 +0000</pubDate>
      <link>https://forem.com/arielmirra/que-es-react-y-react-hooks-y-como-se-relacionan-4e1e</link>
      <guid>https://forem.com/arielmirra/que-es-react-y-react-hooks-y-como-se-relacionan-4e1e</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2Fdff981f3-1303-4782-ad99-75b97b723a87" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2Fdff981f3-1303-4782-ad99-75b97b723a87" alt="alt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Partamos desde lo básico y vayamos agregando conocimiento. La idea es que salgas de acá en unos minutos sabiendo qué es &lt;a href="https://reactjs.org" rel="noopener noreferrer"&gt;React&lt;/a&gt;, qué es &lt;a href="https://redux.js.org" rel="noopener noreferrer"&gt;Redux&lt;/a&gt; y cómo juntarlos para hacer ambos más poderosos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es React?
&lt;/h2&gt;

&lt;p&gt;React es una librería Javascript focalizada en el desarrollo de interfaces de usuario, o al menos así es como React se define. La realidad es que React es una herramienta poderosa con la cual podemos crear todo tipo de aplicaciones web, SPAs (Single Page Application) o inlcuso aplicaciones para Android y iOS.&lt;/p&gt;

&lt;p&gt;React fue desarrollada inicialmente por facebook, es open-source y ampliamente utilizada gracias a su capacidad de rápidamente poder generar interfaces de usuario, mucho más que otros Frameworks como Angular que ofrecen algo más complejo, aunque con ambos se puede lograr las mismas funcionalidades. La razón de esto es porque React utiliza archivos&lt;code&gt;.jsx&lt;/code&gt;, los cuales tienen la lógica y la UI en el mismo archivo y se dividen en "componentes". Por ejemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;formatName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// javascript function&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;;&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// javascript object&lt;/span&gt;
  &lt;span class="na"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ariel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mirra&lt;/span&gt;&lt;span class="dl"&gt;'&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;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="c1"&gt;// HTML to render&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue-border&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;formatName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="c1"&gt;//virtual DOM&lt;/span&gt;
  &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// render this element...&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// inside this div&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Acá te dejo un &lt;a href="https://stackblitz.com/edit/react-dstdh1" rel="noopener noreferrer"&gt;proyecto en StackBlitz&lt;/a&gt; donde podés jugar con código de React y aprender viendo su funcionamiento.&lt;/p&gt;

&lt;p&gt;Si querés usar React en tu propia máquina necesitás tener instalado &lt;a href="https://nodejs.org/es" rel="noopener noreferrer"&gt;NodeJS y npm&lt;/a&gt;. Luego, solo es cuestión de correr el comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npx create-react-app my-app


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;y ya tendremos una aplicación en ReactJS funcionando para empezar. Excelente.&lt;/p&gt;

&lt;p&gt;Los archivos  &lt;code&gt;.jsx&lt;/code&gt; no son exactamente JS + HTML, sino que algunos atributos de nuestro viejo HTML cambian. Por ejemplo, verán que usé className="blue-border" en vez de class="blue-border".&lt;/p&gt;

&lt;p&gt;Notarán además, si son detallistas, que estamos renderizando nuestro HTML en el &lt;strong&gt;ReactDOM&lt;/strong&gt;. Esto es el Virtual DOM de React.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es el virtual DOM?
&lt;/h3&gt;

&lt;p&gt;Si entramos al mundo de ReactJS, vamos a escuchar hablar muchas veces sobre el &lt;strong&gt;Virtual DOM&lt;/strong&gt;. Este concepto nace de una idea brillante, actualizar únicamente la parte del &lt;a href="https://desarrolloweb.com/articulos/que-es-el-dom.html" rel="noopener noreferrer"&gt;DOM&lt;/a&gt; que necesita cambiar en vez de todo el DOM real. En las aplicaciones Javascript de antes, se recibe el JSON del servidor y se genera nuevo HTML a renderizar, lo que actualiza toda la página en cada cambio.&lt;/p&gt;

&lt;p&gt;Si me preguntás a mi, lo mejor de React es su ecosistema; la cantidad de ejemplos en internet, herramientas disponibles y complementos hace a la plataforma accesible y potente. Una de las mejores integraciones es &lt;strong&gt;&lt;a href="https://es.redux.js.org" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es Redux?
&lt;/h3&gt;

&lt;p&gt;No hay mejor descripción que la que ellos mismos se dan:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Redux es un contenedor predecible del estado de aplicaciones JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Redux es una excelente herramienta para manejar el estado de una aplicación. Sus principales beneficios son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estado global e innmutable&lt;/li&gt;
&lt;li&gt;Mayor control del estado de la aplicación y el flujo de datos&lt;/li&gt;
&lt;li&gt;Arquitectura escalable de datos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con apenas 2kb, Redux es una herramienta escalable y potente para manejar el estado de cualquier aplicación Javascript&lt;/p&gt;

&lt;h3&gt;
  
  
  El flujo de la información
&lt;/h3&gt;

&lt;p&gt;La principal ventaja de Redux es cómo administra los cambios de estado. Para entenderlo, es necesario conocer 3 conceptos clave:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El &lt;strong&gt;Store&lt;/strong&gt; como la única fuente de la verdad&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;State&lt;/strong&gt; es de solo lectura&lt;/li&gt;
&lt;li&gt;Los cambios al State pueden hacerse únicamente a través de &lt;strong&gt;acciones (actions) y funciones puras (reducers)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/5aba89b6daab934631adffc1f301d17bb273268b/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6d656469612d702e736c69642e65732f75706c6f6164732f3336343831322f696d616765732f323438343535322f415243482d5265647578322d7265616c2e676966" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/5aba89b6daab934631adffc1f301d17bb273268b/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6d656469612d702e736c69642e65732f75706c6f6164732f3336343831322f696d616765732f323438343535322f415243482d5265647578322d7265616c2e676966" alt="El flujo de información de Redux"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De esta forma, se logra centralizar el estado de la aplicación y por lo tanto unificar el lugar para realizar cambios. Esto hace el desarrollo muchísimo más simple:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F659aa7d2-f213-4027-a725-d782af88535e" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphotos.collectednotes.com%2Fphotos%2F642%2F659aa7d2-f213-4027-a725-d782af88535e" alt="única fuente de la verdad"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todo el estado de tu aplicación esta almacenado en un único árbol dentro de un único store. La única forma de cambiar el árbol de estado es emitiendo una acción, un objeto describiendo que ocurrió.&lt;/p&gt;

&lt;p&gt;Para especificar como las acciones transforman el árbol de estado, usas reducers puros.&lt;/p&gt;

&lt;p&gt;¡Eso es todo!&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalación
&lt;/h3&gt;

&lt;p&gt;Para instalar la versión estable de Redux:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm i &lt;span class="nt"&gt;-S&lt;/span&gt; redux


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Si queremos usarlo con React también vamos a instalar la &lt;a href="https://github.com/reduxjs/react-redux" rel="noopener noreferrer"&gt;conexión a React&lt;/a&gt; y &lt;a href="https://github.com/gaearon/redux-devtools" rel="noopener noreferrer"&gt;las herramientas de desarrollo&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm i &lt;span class="nt"&gt;-S&lt;/span&gt; react-redux
npm i &lt;span class="nt"&gt;-D&lt;/span&gt; redux-devtools


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ahora veamos algo de código:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/**
Esto es un reducer, una función pura con el formato
(state, action) =&amp;gt; newState. Describe como una acción transforma el estado. El estado puede ser cualquier tipo de objeto inmutable, es decir, se devuelve un nuevo objeto si el estado cambió.

En este ejemplo, usamos `switch` y strings, pero puedes usar cualquier forma
que desees si tiene sentido para tu proyecto.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&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;state&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DECREMENT&lt;/span&gt;&lt;span class="dl"&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;state&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;default&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;state&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="c1"&gt;// Creamos un store de Redux almacenando el estado de la aplicación.&lt;/span&gt;
&lt;span class="c1"&gt;// Su API es { subscribe, dispatch, getState }.&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Puedes suscribirte manualmente a los cambios, o conectar tu vista directamente&lt;/span&gt;
&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// La única forma de modificar el estado interno es despachando acciones.&lt;/span&gt;
&lt;span class="c1"&gt;// Las acciones pueden ser serializadas, registradas o almacenadas luego para volver a ejecutarlas.&lt;/span&gt;
&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DECREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// 1&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Por último, para conectar nuestro Store con nuestros componentes de React es suficiente con utilizar &lt;code&gt;connect&lt;/code&gt; del conector:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decrement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./actionCreators&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c1"&gt;// const Counter = ...&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapStateToProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="cm"&gt;/&lt;em&gt;, ownProps&lt;/em&gt;/&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;br&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapDispatchToProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decrement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;mapStateToProps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;mapDispatchToProps&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Ahora te toca a ti&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Esto es solo el comienzo, si querés seguir profundizando te dejo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un proyecto de ejemplo de &lt;a href="https://codesandbox.io/s/9on71rvnyo" rel="noopener noreferrer"&gt;TODOs usando React y Redux&lt;/a&gt; ya que siempre se aprende mejor cuando las manos están ocupadas&lt;/li&gt;
&lt;li&gt;La documentación oficial de &lt;a href="https://reactjs.org" rel="noopener noreferrer"&gt;React&lt;/a&gt; y &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que te haya servido para aprender algo nuevo, ahora te toca seguir aprendiendo y profundizando. Gracias por estar acá.&lt;/p&gt;

&lt;p&gt;Un saludo, &lt;a href="https://linktr.ee/arielmirra" rel="noopener noreferrer"&gt;Ariel Mirra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.instagram.com/ariel.mirra" rel="noopener noreferrer"&gt;instagam&lt;/a&gt; | &lt;a href="//linkedin.com/in/ariel-mirra"&gt;linkedin&lt;/a&gt; | &lt;a href="https://linktr.ee/arielmirra" rel="noopener noreferrer"&gt;otros proyectos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>react</category>
      <category>redux</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Cómo actualizar Angular-CLI de forma rápida y eficiente</title>
      <dc:creator>Ariel Mirra</dc:creator>
      <pubDate>Sat, 18 Jul 2020 17:53:05 +0000</pubDate>
      <link>https://forem.com/arielmirra/como-actualizar-angular-cli-de-forma-rapida-y-eficiente-3kb9</link>
      <guid>https://forem.com/arielmirra/como-actualizar-angular-cli-de-forma-rapida-y-eficiente-3kb9</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F990%2F1%2AOc2PsJ-QKOUG2I8J3HNmWQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F990%2F1%2AOc2PsJ-QKOUG2I8J3HNmWQ.png" alt="Tengo que admitir que soy fan del logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Siempre lo mismo
&lt;/h2&gt;

&lt;p&gt;Para muchos desarrolladores (me incluyo) actualizar Angular no es tan fácil como poner un comando en la terminal y chau. Me llegan avisos de que mi versión diverge con otras, me encuentro leyendo sobre las mejoras de la última versión y cuando me decido a actualizar mi cabeza está en blanco... ¿Se romperá algo? ¿Qué comandos tengo que correr? Si también te pasa algo así, acá dejé explicado mi experiencia para que a vos también te sirva:&lt;/p&gt;

&lt;p&gt;Primero que nada, chequeamos nuestra versión del cli (Command Line Interface) haciendo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

ng &lt;span class="nt"&gt;--version&lt;/span&gt; &lt;span class="c"&gt;# para angular-cli v7 o menos&lt;/span&gt;
ng version  &lt;span class="c"&gt;# para angular-cli v8+&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Si queremos actualizar debemos primero desinstalar la actual versión de angular-cli del sistema:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;npm uninstall &lt;span class="nt"&gt;-g&lt;/span&gt; angular-cli  &lt;span class="c"&gt;# Mac o Linux&lt;/span&gt;
npm uninstall &lt;span class="nt"&gt;-g&lt;/span&gt; angular-cli &lt;span class="c"&gt;# Windows (requiere Powershell en modo administrador)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Por si las moscas, siempre verifico el caché a ver si no le erré:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;npm cache verify
&lt;span class="nb"&gt;sudo &lt;/span&gt;npm cache clean   &lt;span class="c"&gt;# opcional para gente con TOC como yo&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Y por fin llegó el momento más esperado, darle darle una buena bienvenida a todas esas nuevas features y fixes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @angular/cli@latest


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;La flag &lt;strong&gt;&lt;em&gt;-g&lt;/em&gt;&lt;/strong&gt; significa ‘global’, hace que esté disponible en cualquier parte del sistema.&lt;/p&gt;

&lt;p&gt;Obviamente que vamos a volver a chequear la versión para asegurarnos:&lt;/p&gt;

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

PS C:\Users\arimi&amp;gt; ng version
_                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/
Angular CLI: 8.2.2
Node: 12.8.0
OS: win32 x64
Angular:
...
Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.802.2
@angular-devkit/core         8.2.2
@angular-devkit/schematics   8.2.2
@schematics/angular          8.2.2
@schematics/update           0.802.2
rxjs                         6.4.0


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Colorín colorado
&lt;/h2&gt;

&lt;p&gt;Hasta acá todo anduvo bien? Perfecto, ya podes cerrar esto y seguir con tu vida. Suerte!&lt;/p&gt;
&lt;h2&gt;
  
  
  Esto no ha terminado
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Tuviste problemas?&lt;/strong&gt; No importa, vamos por los más comunes a ver si lo solucionamos.&lt;/p&gt;

&lt;p&gt;Si a la hora de instalar &lt;strong&gt;se colgó infinitamente la instalación&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Probá si tu conexión es decente&lt;/li&gt;
&lt;li&gt;Puede ser problema de proxy, corré lo siguiente:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm config &lt;span class="nb"&gt;rm &lt;/span&gt;proxy
npm config &lt;span class="nb"&gt;rm &lt;/span&gt;https-proxy


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Esto vuelve la configuración de proxy a default y de repente todo funciona y compila y somos felices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listo para mi, ahora seguís vos
&lt;/h2&gt;

&lt;p&gt;Espero que te haya servido para aprender algo nuevo, ahora te toca seguir aprendiendo y profundizando. Gracias por estar acá y pensás que le puede servir a alguien que conocés o al equipo, compartilo.&lt;/p&gt;

&lt;p&gt;Un saludo, &lt;a href="https://linktr.ee/arielmirra" rel="noopener noreferrer"&gt;Ariel Mirra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://instagram.com/arielmirra" rel="noopener noreferrer"&gt;instagam&lt;/a&gt; | &lt;a href="https://linkedin.com/in/ariel-mirra" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; | &lt;a href="https://linktr.ee/arielmirra" rel="noopener noreferrer"&gt;otros proyectos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>angular</category>
      <category>material</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Qué es PolymerJs y porqué tenés que saberlo</title>
      <dc:creator>Ariel Mirra</dc:creator>
      <pubDate>Sat, 18 Jul 2020 01:17:01 +0000</pubDate>
      <link>https://forem.com/arielmirra/que-es-polymerjs-y-porque-tenes-que-saberlo-1ac6</link>
      <guid>https://forem.com/arielmirra/que-es-polymerjs-y-porque-tenes-que-saberlo-1ac6</guid>
      <description>&lt;p&gt;A la hora de hacer una aplicación web, la discusión siempre es entre los mejores Frameworks como Angular o React o Vue y porqué cada uno es mejor o peor que el otro. Pero yo vengo a dar a conocer algo mucho más universal, compatible, y más fácil de aprender:  &lt;strong&gt;PolymerJs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DpKhgHnM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://photos.collectednotes.com/photos/642/235e0e2b-aba7-42fe-a826-40c262475e01" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DpKhgHnM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://photos.collectednotes.com/photos/642/235e0e2b-aba7-42fe-a826-40c262475e01" alt="PolymerJs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es PolymerJs?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.polymer-project.org/"&gt;Polymer&lt;/a&gt; es un proyecto que te ayuda a desbloquear todo el potencial de la web. Es una librería y un toolbox para utilizar &lt;a href="https://www.webcomponents.org"&gt;WebComponents&lt;/a&gt; y crear aplicaciones web progresivas (PWA).&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Pero qué es un WebComponent y porqué tiene tanto potencial?
&lt;/h3&gt;

&lt;p&gt;Excelente pregunta mi joven padawan. Voy a dejar que &lt;a href="https://developer.mozilla.org/es/docs/Web/Web_Components"&gt;MDN&lt;/a&gt; (la biblia de los desarrolladores) la responda por mi:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Los Componentes Web son una colección de tecnologías que te permiten crear elementos personalizados reutilizables — con su funcionalidad encapsulada apartada del resto del código — y utilizarlos en las aplicaciones web.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Creando un Hello World reutilizable
&lt;/h3&gt;

&lt;p&gt;Suficiente teoría por hoy. Se aprende mucho más cuando los dedos empujan teclas. Vamos a crear nuestro primer componente reutilizable con la ayuda de Polymer para que veas lo fácil que es y lo bien que funciona.&lt;/p&gt;

&lt;p&gt;Para empezar necesitamos algunas herramientas que quizás ya tenes instaladas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download"&gt;NodeJs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/downloads"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com"&gt;npm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora que tenemos lo básico para el desarrollo web, instalamos Polymer CLI:&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;npm install -g polymer-cli@next&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 y cloneamos el ejemplo inicial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://westdabestdb@bitbucket.org/westdabestdb/polymerapp.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez que hayas hecho esto es momento de sacar Polymer a dar una vuelta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;polymerapp
polymer serve
//applications: http://127.0.0.1:8081
//reusable components: http://127.0.0.1:8081/components/polymerapp/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora si vas a &lt;a href="http://127.0.0.1:8081"&gt;http://127.0.0.1:8081&lt;/a&gt; deberías ver una hermosa y minimalista pantalla de Hello World. Eso que estas viendo es un componente reutilizable, vayamos a verlo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;PolymerElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;html&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@polymer/polymer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;HelloWorld&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;PolymerElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;who&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;who&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;who&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;properties&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="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;who&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&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="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;template&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;html&lt;/span&gt;&lt;span class="s2"&gt;`
        &amp;lt;div class="app-container"&amp;gt;
            Hello [[who]]
        &amp;lt;/div&amp;gt;

        &amp;lt;style&amp;gt;
            .app-container {
                text-align: center;
                font-family: Arial, Helvetica, sans-serif;
                font-weight: bold;
                font-size: 5em;
                height: 100vh;
                width: 100vw;
                background-color: #e3e3e3;
                display: flex;
                align-items: center;
                justify-content: center;
            }
        &amp;lt;/style&amp;gt;
        `&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="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello-world&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HelloWorld&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para los que ya saben React, esto es como estar en casa. Tenemos un constructor con un parámetro llamado &lt;code&gt;who&lt;/code&gt; que lo asigno a una propiedad interna del mismo nombre. Mi template es código HTML con CSS que saluda a lo que le hayan pasado en la variable &lt;code&gt;who&lt;/code&gt;. Por último, le doy un nombre a mi componente y lo llamo hello-world para que lo podamos mostrar haciendo únicamente &lt;code&gt;&amp;lt;hello-world who="there!"&amp;gt;&amp;lt;/hello-world&amp;gt;&lt;/code&gt; que es exactamente lo que hago desde el index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./HelloWorld.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;PolymerApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;PolymerElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;properties&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="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;who&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&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="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;template&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;html&lt;/span&gt; &lt;span class="s2"&gt;`
        &amp;lt;hello-world who="there!"&amp;gt;&amp;lt;/hello-world&amp;gt;
        `&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="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;polymer-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PolymerApp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto es todo, los puntos interesantes a tener en cuenta son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los WebComponents son universales, no requieren ninguna librería y se pueden mostrar en cualquier navegador&lt;/li&gt;
&lt;li&gt;Los componentes que creamos son reutilizables y podemos ver muchos más creados por otros &lt;a href="https://www.webcomponents.org/"&gt;acá&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Podemos crear aplicaciones únicamente con esta librería&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Listo para mi, ahora seguís vos
&lt;/h2&gt;

&lt;p&gt;Espero que te haya servido para aprender algo nuevo, ahora te toca seguir aprendiendo y profundizando. Gracias por estar acá.&lt;/p&gt;

&lt;p&gt;Un saludo, &lt;a href="https://linktr.ee/arielmirra"&gt;Ariel Mirra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.instagram.com/ariel.mirra"&gt;instagam&lt;/a&gt; | &lt;a href="//linkedin.com/in/ariel-mirra"&gt;linkedin&lt;/a&gt; | &lt;a href="https://linktr.ee/arielmirra"&gt;otros proyectos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>polymer</category>
      <category>spanish</category>
      <category>javascript</category>
    </item>
    <item>
      <title>¿Qué es una API y para qué sirve? Cómo funcionan y porqué son tan valiosas.</title>
      <dc:creator>Ariel Mirra</dc:creator>
      <pubDate>Thu, 11 Jun 2020 09:03:00 +0000</pubDate>
      <link>https://forem.com/arielmirra/que-es-una-api-y-para-que-sirve-como-funcionan-y-porque-son-tan-valiosas-3688</link>
      <guid>https://forem.com/arielmirra/que-es-una-api-y-para-que-sirve-como-funcionan-y-porque-son-tan-valiosas-3688</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5CYIqfv4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/750/1%2ATNt5E-8yPDs1-8fMqzWXbw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5CYIqfv4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/750/1%2ATNt5E-8yPDs1-8fMqzWXbw.png" alt="APIs y sus aplicaciones más utilizadas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es una API?
&lt;/h2&gt;

&lt;p&gt;Una API (&lt;em&gt;Application Programming Interface&lt;/em&gt;) es como un mozo en un restaurante: Se encarga de llevar tus pedidos (&lt;em&gt;requests&lt;/em&gt;) que elegiste del menú (&lt;em&gt;API Spec&lt;/em&gt;) hacia la cocina (&lt;em&gt;Server&lt;/em&gt;). Una vez que la comida está hecha, el mozo se encarga de traerte a la mesa lo que pediste (&lt;em&gt;Response&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Esto mismo explica Mulesoft en su &lt;a href="https://youtu.be/s7wmiS2mSXY"&gt;video&lt;/a&gt; o &lt;a href="https://www.mulesoft.com/resources/api/what-is-an-api"&gt;blogpost&lt;/a&gt; sobre el tema.&lt;/p&gt;

&lt;p&gt;Una API es un software intermediario que permite a dos aplicaciones hablarse entre si. Cada vez que abrís una red social en tu iPhone o Android, toda esa información fue pedida y provista por una API.&lt;/p&gt;

&lt;p&gt;Existen muchos protocolos a los cuales las APIs se adhieren, como &lt;a href="https://www.ionos.es/digitalguide/servidores/know-how/que-es-rpc/"&gt;RPC&lt;/a&gt;, &lt;a href="https://www.tutorialspoint.com/soap/what_is_soap.htm"&gt;SOAP&lt;/a&gt;, &lt;a href="https://www.asyncapi.com/docs/getting-started/"&gt;Async&lt;/a&gt;, &lt;a href="https://graphql.org/"&gt;GraphQL&lt;/a&gt;, pero para este post en particular vamos a estar hablando del protocolo más usado, &lt;a href="https://www.mulesoft.com/resources/api/what-is-rest-api-design"&gt;REST&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Además, una API provee una capa importante de seguridad. Ya que las llamadas y el intercambio de información es explícito y sucinto, la información de tu celular nunca queda expuesta. Solo se comunica y se obtiene lo que es necesario, como comprar comida sin bajarse del auto, vos decís qué querés, ellos te dicen que quieren a cambio, y finalmente obtienes tu comida. Fácil, continuemos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es una API Specification?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sf7hebOM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/750/1%2Ag_2fugyFMt9D_f0Alp-o9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sf7hebOM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/750/1%2Ag_2fugyFMt9D_f0Alp-o9w.png" alt="Cómo se ve una API Specification, a grandes rasgos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Una API Specification es una forma estandarizada y estructurada de describir una API HTTP de forma que sea legible por humanos y máquinas" - Ariel Mirra&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Querés comprar un pasaje de avión. Entrás a una página llamada Aterrizar.com que tiene información de múltiples aerolíneas, le preguntás qué pasajes hay para el lugar X en la fecha Y cuyo precio sea menor a Z, la página te devuelve todos los pasajes que cumplen tus requisitos. ¿Cómo les pidió la información a las aerolíneas? Ahí es donde las especificaciones de APIs vienen al rescate.&lt;/p&gt;

&lt;p&gt;Aterrizar.com se dedica a pedirle a las aerolíneas, según como éstas lo tenga en su especificación, la información que vos querés y mostrártela toda junta. Es capaz de hacer esto porque cada aerolínea tiene una API Spec pública que muestra cómo pedirle información y cómo ésta es devuelta.&lt;/p&gt;

&lt;p&gt;Eso es una API Specification, detalla toda la información y recursos que la API expone en un lenguaje legible por humanos y máquinas, en su mayoría &lt;a href="https://developer.mozilla.org/es/docs/Learn/JavaScript/Objects/JSON"&gt;JSON&lt;/a&gt; y YAML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Genial... ¿Y para qué sirve?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vEyuv2U_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1050/1%2AxuDNZkmBEirOVTcyB9pu7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vEyuv2U_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1050/1%2AxuDNZkmBEirOVTcyB9pu7g.png" alt="La estructura de una API Specification"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Las API Specs son las que hacen posible toda la interacción entre sistemas independientes que hoy en día nos rodea. Pero eso no es lo único:&lt;/p&gt;

&lt;h3&gt;
  
  
  Generación automática de documentación
&lt;/h3&gt;

&lt;p&gt;Todos odiamos escribir documentación, con una buena especificación podemos generar un documento o inlcuso una página interactiva en tiempo real que muestre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Información sobre la API:&lt;/strong&gt; Quién la hizo, qué versión, que licencia, en qué server y mucho más.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qué recursos ofrece:&lt;/strong&gt; Cuales son los endpoints, qué métodos tienen disponibles, cuáles son los parámetros que aceptan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cómo es el esquema de los datos&lt;/strong&gt; a enviar y recibir, junto con ejemplos de cada uno de ellos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Probar la &lt;a href="https://swagger.io/tools/swagger-ui/"&gt;API en vivo&lt;/a&gt;&lt;/strong&gt; utilizando o cambiando los ejemplos provistos y explorando los diferentes resultados posibles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automatización en todos lados
&lt;/h3&gt;

&lt;p&gt;Una especificación detallada nos dá la posibilidad de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Crear su &lt;a href="https://docs.mulesoft.com/mule-runtime/4.3/build-application-from-api"&gt;implementación de forma automática&lt;/a&gt;&lt;/strong&gt;, generando código en diferentes lenguajes o incluso pudiendo importar, publicar y testear la API especificada en servicios como &lt;a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-from-example.html"&gt;AWS&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-rest-api"&gt;Azure&lt;/a&gt; o &lt;a href="https://cloud.google.com/endpoints/docs/openapi/about-cloud-endpoints"&gt;Google Cloud&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatizar el monitoreo y testeo&lt;/strong&gt; de APIs con servicios como &lt;a href="https://support.smartbear.com/alertsite/docs/monitors/api/soapui/create.html"&gt;Smartbear&lt;/a&gt;, ya que la especificación funciona como un contrato de funcionamiento donde se sabe de antemano que recibe y que devuelve, y se valida que esto suceda.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Suficiente, quiero crear mi propia API Specification
&lt;/h2&gt;

&lt;p&gt;Tengo una buena noticia para vos y te aliento a que transformes conocimiento a sabiduría a través de acción:&lt;/p&gt;

&lt;h3&gt;
  
  
  En menos de 5 minutos podés hacerlo
&lt;/h3&gt;

&lt;p&gt;Llegó la hora de poner en acción todo lo dicho en palabras. Tomate 5 minutos para explorar alguna de estas herramientas de creación de especificaciones de APIs, te va a ayudar a cimentar el conocimiento adquirido de forma gratuita y sin tener que descargar nada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stoplight.io/studio/"&gt;Spotlight.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://editor.swagger.io/"&gt;Swagger Editor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O si querés saber más y probar todas las posibilidades que mencioné antes, te recomiendo echarle un vistazo a &lt;a href="https://www.mulesoft.com/platform/enterprise-integration"&gt;Mulesoft’s Anypoint Platform&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Si llegaste hasta acá quiero darte las gracias y hacerte saber que te estas yendo mejor de lo que llegaste, ¡Seguí así!&lt;/p&gt;

&lt;p&gt;Un saludo, &lt;a href="https://linktr.ee/arielmirra"&gt;Ariel Mirra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.instagram.com/ariel.mirra"&gt;instagam&lt;/a&gt; | &lt;a href="//linkedin.com/in/ariel-mirra"&gt;linkedin&lt;/a&gt; | &lt;a href="https://linktr.ee/arielmirra"&gt;otros proyectos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>angular</category>
      <category>material</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
