<?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: Fernando Chata</title>
    <description>The latest articles on Forem by Fernando Chata (@fernandochata).</description>
    <link>https://forem.com/fernandochata</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%2F436770%2F6720abf3-a0c5-48af-a89a-337f80175ded.jpeg</url>
      <title>Forem: Fernando Chata</title>
      <link>https://forem.com/fernandochata</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fernandochata"/>
    <language>en</language>
    <item>
      <title>Buenas prácticas APIs</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Tue, 11 Apr 2023 22:44:44 +0000</pubDate>
      <link>https://forem.com/fernandochata/buenas-practicas-apis-2bkd</link>
      <guid>https://forem.com/fernandochata/buenas-practicas-apis-2bkd</guid>
      <description>&lt;h3&gt;
  
  
  Usar nombres de recursos (sustantivos)
&lt;/h3&gt;

&lt;p&gt;❌ GET /querycarts/123&lt;br&gt;
✅ GET /carts/123&lt;/p&gt;

&lt;h3&gt;
  
  
  Uso de plurales
&lt;/h3&gt;

&lt;p&gt;❌ GET /cart/123&lt;br&gt;
✅ GET /carts/123&lt;/p&gt;

&lt;h3&gt;
  
  
  Idempotencia
&lt;/h3&gt;

&lt;p&gt;❌ POST /carts&lt;br&gt;
✅ POST /carts {requestId: 123}&lt;/p&gt;

&lt;h3&gt;
  
  
  Uso de versionado
&lt;/h3&gt;

&lt;p&gt;❌ GET /carts/v1/123&lt;br&gt;
✅ GET /v1/carts/123&lt;/p&gt;

&lt;h3&gt;
  
  
  Uso de paginado
&lt;/h3&gt;

&lt;p&gt;❌ GET /carts&lt;br&gt;
✅ GET /carts?pageSize=xx&amp;amp;pageToken=xx&lt;/p&gt;

&lt;h3&gt;
  
  
  Ordenado
&lt;/h3&gt;

&lt;p&gt;❌ GET /carts&lt;br&gt;
✅ GET /carts?sort_by=id&lt;/p&gt;

&lt;h3&gt;
  
  
  Filtrado
&lt;/h3&gt;

&lt;p&gt;❌ GET /carts&lt;br&gt;
✅ GET /carts?filter=color:blue&lt;/p&gt;

&lt;h3&gt;
  
  
  Acceso Seguro
&lt;/h3&gt;

&lt;p&gt;❌ X-API-KEY = xxxxx&lt;br&gt;
✅ X-API-KEY = xxxxx&lt;br&gt;
   X-EXPIRE = xxxxx&lt;br&gt;
   X-REQUEST-SIGNATURE = (URL + QueryString + Expire + Body)&lt;/p&gt;

&lt;h3&gt;
  
  
  Referencia cruzada de recursos
&lt;/h3&gt;

&lt;p&gt;❌ GET /carts/123?item=321&lt;br&gt;
✅ GET /carts/123/items/321&lt;/p&gt;

&lt;h3&gt;
  
  
  Agregar un elemento nuevo
&lt;/h3&gt;

&lt;p&gt;❌ POST /carts/123?addItem=321&lt;br&gt;
✅ POST /carts/123/items:add{itemID: "items/321"}&lt;/p&gt;

</description>
      <category>spanish</category>
    </item>
    <item>
      <title>Optimización del rendimiento de una aplicación Node.js</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Sun, 26 Mar 2023 03:15:08 +0000</pubDate>
      <link>https://forem.com/fernandochata/optimizacion-del-rendimiento-de-una-aplicacion-nodejs-1nge</link>
      <guid>https://forem.com/fernandochata/optimizacion-del-rendimiento-de-una-aplicacion-nodejs-1nge</guid>
      <description>&lt;h2&gt;
  
  
  Minimize blocking I/O operation
&lt;/h2&gt;

&lt;p&gt;Node.js está diseñado para manejar operaciones de E/S sin bloqueo, lo que significa que puede manejar varias solicitudes simultáneamente sin bloquear el bucle de eventos. Para optimizar el rendimiento, minimice cualquier operación de E/S que bloquee mediante operaciones asincrónicas o dividiendo las tareas grandes en tareas más pequeñas.&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="c1"&gt;//Blocking I/O example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Non-blocking I/O example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file.txt&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&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="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use caching
&lt;/h2&gt;

&lt;p&gt;El almacenamiento en caché es una técnica utilizada para almacenar datos a los que se accede con frecuencia en la memoria, de modo que se pueda acceder a ellos rápidamente y sin tener que recuperarlos de un disco o de la red. Utilice el almacenamiento en caché en su aplicación Node.js para reducir la cantidad de consultas a la base de datos y solicitudes de red.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;NodeCache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node-cache&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;myCache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;NodeCache&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;stdTTL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;checkperiod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getDataFromDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Database query goes here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myCache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getDataFromDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;myCache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&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;data&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use a load balancer
&lt;/h2&gt;

&lt;p&gt;Si su aplicación maneja una gran cantidad de solicitudes, use un balanceador de carga para distribuir la carga de trabajo entre varias instancias de su aplicación. Esto mejorará el rendimiento y reducirá el riesgo de accidentes o tiempo de inactividad.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cluster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cluster&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;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&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;numCPUs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;os&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;cpus&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isMaster&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Master &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is running`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// Fork workers.&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;numCPUs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&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;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;exit&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="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`worker &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; died`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Workers can share any TCP connection&lt;/span&gt;
  &lt;span class="c1"&gt;// In this case it is an HTTP server&lt;/span&gt;
  &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&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="se"&gt;\n&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="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8000&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Worker &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; started`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Optimize your database queries
&lt;/h2&gt;

&lt;p&gt;Las consultas a la base de datos pueden ser un cuello de botella importante en el rendimiento. Optimice las consultas de su base de datos minimizando la cantidad de consultas, indexando su base de datos y utilizando características específicas de la base de datos, como vistas y procedimientos almacenados.&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="c1"&gt;// Indexing example&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;createIndex&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Stored procedure example&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runCommand&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`function(email) {
    return db.users.findOne({ email: email })
  }`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;john@example.com&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use a reverse proxy
&lt;/h2&gt;

&lt;p&gt;Un proxy inverso puede mejorar el rendimiento al almacenar en caché y comprimir activos estáticos como CSS, JavaScript e imágenes. Esto reduce la carga en su servidor y acelera la entrega de estos activos a los clientes.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&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;compression&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;compression&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use a task queue
&lt;/h2&gt;

&lt;p&gt;Si su aplicación realiza tareas de ejecución prolongada o que consumen muchos recursos, use una cola de tareas para administrarlas. Esto le permite distribuir la carga de trabajo y reducir el riesgo de bloqueos o tiempo de inactividad.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;kue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kue&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;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;kue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createQueue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;performTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;taskData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Long-running task goes here&lt;/span&gt;
  &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&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="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&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;performTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use a profiler
&lt;/h2&gt;

&lt;p&gt;Un generador de perfiles es una herramienta que puede ayudarlo a identificar cuellos de botella en el rendimiento de su aplicación. Utilice un generador de perfiles para analizar el rendimiento de su código e identificar las áreas en las que puede realizar mejoras.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;profiler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v8-profiler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;runHeavyTask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Heavy task goes here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;profiler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startProfiling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Heavy Task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;runHeavyTask&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;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;profiler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stopProfiling&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>node</category>
      <category>javascript</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Docker error "failed to solve with frontend dockerfile.v0"</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Wed, 24 Aug 2022 17:54:00 +0000</pubDate>
      <link>https://forem.com/fernandochata/docker-error-failed-to-solve-with-frontend-dockerfilev0-1ki7</link>
      <guid>https://forem.com/fernandochata/docker-error-failed-to-solve-with-frontend-dockerfilev0-1ki7</guid>
      <description>&lt;p&gt;Si aparece un error &lt;code&gt;failed to solve with frontend dockerfile.v0&lt;/code&gt; &lt;br&gt;
 cambiar &lt;strong&gt;"buildkit": false'&lt;/strong&gt; dentro de &lt;strong&gt;Settings / Docker Engine&lt;/strong&gt;,&lt;br&gt;
corresponde a una característica que construye las imágenes por defecto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": false
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>[error] [mysql] 1251</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Fri, 03 Jun 2022 20:59:13 +0000</pubDate>
      <link>https://forem.com/fernandochata/error-mysql-1251-1beo</link>
      <guid>https://forem.com/fernandochata/error-mysql-1251-1beo</guid>
      <description>&lt;p&gt;Por si le sirve a alguien...&lt;/p&gt;

&lt;p&gt;Al usar la imagen de &lt;a href="https://hub.docker.com/_/mysql?tab=tags"&gt;&lt;em&gt;mysql&lt;/em&gt;&lt;/a&gt; en Docker y tratarlo de enlazar desde una app con &lt;em&gt;node&lt;/em&gt; + &lt;a href="https://www.npmjs.com/package/mysql"&gt;&lt;em&gt;mysql&lt;/em&gt;&lt;/a&gt; me aparecía el siguiente error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[error] [mysql] 1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Al parecer es un plugin de cifrado de contraseñas (caching_sha2_password) incompatible con la versión de &lt;a href="https://hub.docker.com/_/mysql?tab=tags"&gt;&lt;em&gt;mysql&lt;/em&gt;&lt;/a&gt; que se encuentra alojada en Docker hub.&lt;/p&gt;

&lt;p&gt;Hay dos opciones o hacer un &lt;em&gt;pull&lt;/em&gt; de una versión anterior de mysql (en este caso la 5.7)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull mysql:5.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o modificar dicho plugin...&lt;/p&gt;

&lt;p&gt;Para saber si el error corresponde a lo de los plugins, y verificar si el usuario con el que se conectan a la BBDD lo usa, ocupar el siguiente comando, desde una terminal conectada a la BBDD mysql&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select user, plugin from mysql.user;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;si efectivamente usa &lt;strong&gt;caching_sha2_password&lt;/strong&gt; modificar la contraseña usando el plugin correspondiente con lo siguiente (modificar el &lt;em&gt;root&lt;/em&gt; y el &lt;em&gt;new_password&lt;/em&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alter user 'root'@'%' identified with mysql_native_password by "new_password";
flush privileges;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>npm</category>
      <category>mysql</category>
      <category>node</category>
      <category>spanish</category>
    </item>
    <item>
      <title>MongoDB for Dummies (like me)</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Sun, 29 May 2022 16:34:11 +0000</pubDate>
      <link>https://forem.com/fernandochata/mongo-for-dummies-like-me-1nh</link>
      <guid>https://forem.com/fernandochata/mongo-for-dummies-like-me-1nh</guid>
      <description>&lt;h2&gt;
  
  
  Ejecutables
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/installation/"&gt;https://www.mongodb.com/docs/manual/installation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/try/download/shell"&gt;https://www.mongodb.com/try/download/shell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comandos básicos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Conecta a tu instancia local de MongoDB
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Muestra todas las bases de datos&lt;/li&gt;
&lt;li&gt;Muestra todas las colecciones de la actual base de datos
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;show dbs
show collections
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cambia a la base de datos ingresada
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use &amp;lt;nombre_bd&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Muestra tu actual BD
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Elimina tu actual BD
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.dropDatabase()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Crear colección
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.createCollection(&amp;lt;Name&amp;gt;, Options)

db.createCollection(&amp;lt;Name&amp;gt;, {
   capped : true,
   size : sizeLimit,
   max : documentLimit,
   validator: { $and:
      [   { phone: { $type: "string" } },
          { email: { $regex: /@flares\.com$/ } },
          { status: { $in: [ "Registered", "Unknown" ] } }
       ]
    }
})

db.createCollection( 'login', {
    validator: { $jsonSchema: {
        bsonType: "object",
        "additionalProperties": false,
       required: [ "email" ],
       properties: {
          email: {
             bsonType : "string",
             pattern : "@flares\.com$",
             description: "string meets the given expression"
          },
          status: {
             enum: [ "registered", "Invalid" ],
             description: "status must be within enum values"
          }
       }
    } },
} )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cambiar nombre de colección
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.&amp;lt;db_name&amp;gt;.renameCollection(&amp;lt;new_name_collection&amp;gt;)
db.login.renameCollection(&amp;lt;newCollectionName&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Create
&lt;/h2&gt;

&lt;p&gt;db.&amp;lt;collectionName&amp;gt;.&amp;lt;command&amp;gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;insertOne &lt;em&gt;collectionName.insertOne({document})&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;insertMany &lt;em&gt;collectionName.insertMany([{document1},{document2},{ document3}….{ documentn}])&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crea uno o varios documentos dentro de una colección&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.insert({
   name: 'Fernando',
   age: 35,
   interesting: ['tecnology, 'music', 'movies'],
   address: {
      city: 'Santiago',
      street: 'Columbus av.'
   }.
   birdDate: Date()
})
db.users.insertOne({ name: "Fernando"})
db.users.insertMany({ name: "Fernando"}, {name: "Elias"})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Read
&lt;/h2&gt;

&lt;p&gt;db.&amp;lt;collectionName&amp;gt;.&amp;lt;command&amp;gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;find()&lt;/li&gt;
&lt;li&gt;find(&amp;lt;filterObject&amp;gt;)&lt;/li&gt;
&lt;li&gt;find(&amp;lt;filterObject&amp;gt;, &amp;lt;selectObject&amp;gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find().pretty()
db.users.find({ name: "Fernando"})
db.users.find({ email: "fernando@mail.com"}, {name: 1})
db.users.find({}, {email: 0})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando muestra todos los documentos de la colección.&lt;br&gt;
El segundo muestra todos los documentos cuyo &lt;code&gt;name&lt;/code&gt; sea &lt;code&gt;Fernando&lt;/code&gt;.&lt;br&gt;
El tercero muestra unicamente el &lt;code&gt;name&lt;/code&gt; de los documentos cuyo &lt;code&gt;email&lt;/code&gt; sea &lt;code&gt;fernando@mail.com&lt;/code&gt;&lt;br&gt;
El cuarto muestra todos los documentos excepto el campo &lt;code&gt;email&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;findOne(&amp;lt;filterObject&amp;gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.findOne({ name: "Fernando"})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muestra sólo el primer documento que cumple el filtro&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;countDocuments(&amp;lt;filterObject&amp;gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.countDocuments({ name: "Fernando"})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regresa el número de documentos que cumple el filtro&lt;/p&gt;




&lt;h2&gt;
  
  
  Update
&lt;/h2&gt;

&lt;p&gt;db.&amp;lt;collectionName&amp;gt;.&amp;lt;command&amp;gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;updateOne&lt;/li&gt;
&lt;li&gt;updateMany
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.updateOne({ age: 20 }, { $set: { age: 21 } })
db.users.updateMany({ age: 12 }, { $set: { age: 15 } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primero actualiza la edad del primer documento que encuentra, en cambio el segundo actualiza todos los documentos que cumplan el filtro.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;replaceOne
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.replaceOne({ age: 12 }, { name:"mi nombre", age: 13 })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reemplaza el primer objeto completo que cumpla el filtro&lt;/p&gt;




&lt;h2&gt;
  
  
  Delete
&lt;/h2&gt;

&lt;p&gt;db.&amp;lt;collectionName&amp;gt;.&amp;lt;command&amp;gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deleteOne&lt;/li&gt;
&lt;li&gt;deleteMany
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.deleteOne({age: 10})
db.users.deleteMany({age: 10})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando elimina el primer documento que cumpla el filtro y el segundo borra todos los documentos que cumplan el filtro&lt;/p&gt;




&lt;h2&gt;
  
  
  Filters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;$eq (equal)&lt;/li&gt;
&lt;li&gt;$ne (not equal)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find({ name: { $eq: "Fernando" } })
db.users.find({ name: { $ne: "Fernando" } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primero muestra todos los documentos cuyo &lt;code&gt;name&lt;/code&gt; sea igual a &lt;code&gt;Fernando&lt;/code&gt; y el segundo todos los que sean diferentes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$gt (greater than)&lt;/li&gt;
&lt;li&gt;$gte (greater than or equal)&lt;/li&gt;
&lt;li&gt;$lt (low than)&lt;/li&gt;
&lt;li&gt;$lte (low than or equal)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;b.users.find({ age: { $gt: 12 } })
db.users.find({ age: { $gte: 15 } })

b.users.find({ age: { $lt: 12 } })
db.users.find({ age: { $lte: 15 } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando muestra los documentos con un &lt;code&gt;age&lt;/code&gt; mayor a 12, sin incluirlo.&lt;br&gt;
El segundo muestra los documentos con un &lt;code&gt;àge&lt;/code&gt; mayor a 15 incluyendo los que tengan 15.&lt;br&gt;
Los dos siguientes de igual forma incluyendo o excluyéndolos del filtro.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$in (include)&lt;/li&gt;
&lt;li&gt;$nin (non include)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find({ name: { $in: ["Fernando", "Jose"] } })
db.users.find({ name: { $nin: ["Fernando", "Jose"] } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando muestra los documentos cuyo &lt;code&gt;name&lt;/code&gt; se encuentra en el arreglo y el segundo todos los que no se encuentren&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$and&lt;/li&gt;
&lt;li&gt;$or&lt;/li&gt;
&lt;li&gt;$not
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find({ $and: [{ age: 12 }, { name: "Fernando" }] })
db.users.find({ $or: [{ age: 12 }, { name: "Fernando" }] })
db.users.find({ name: { $not: { $eq: "Fernando" } } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando muestra los documentos que cumplen ambos filtros, el segundo sólo necesita cumplir uno de los filtros, el tercero invierte la selección dentro del filtro.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$exist
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find({ name: { $exists: true } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muestra los documentos que poseen un campo llamado &lt;code&gt;name&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$expr
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find({ $expr: { $gt: ["$nota1", "$nota2"] } })

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

&lt;/div&gt;



&lt;p&gt;Realiza la comparación entre diferentes campos, en el ejemplo se muestran los documentos cuya &lt;code&gt;nota1&lt;/code&gt; es mayor a su &lt;code&gt;nota2&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Read Modifiers
&lt;/h2&gt;

&lt;p&gt;Formatear salida&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pretty()
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find({ age: 10}).pretty();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obtener registros únicos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;distinct() &lt;em&gt;collectionName.distinct(field,query)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.distinct("name")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se pueden agregar al final de diferentes operaciones&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sort&lt;/li&gt;
&lt;li&gt;limit&lt;/li&gt;
&lt;li&gt;skip
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.users.find().sort({ name: 1 })
db.users.find().limit(2)
db.users.find().skip(4)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando ordena de forma alfabéticamente los documentos según el nombre.&lt;br&gt;
El segundo sólo muestra los 2 primeros documentos.&lt;br&gt;
El tercero omite los 4 primeros resultados&lt;/p&gt;




&lt;h2&gt;
  
  
  Complex Update Object
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;$set&lt;/li&gt;
&lt;li&gt;$inc&lt;/li&gt;
&lt;li&gt;$rename&lt;/li&gt;
&lt;li&gt;$unset
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;b.users.updateOne({ age: 12 }, { $set: { name: "jose" } })
b.users.updateOne({ age: 12 }, { $inc: { age: 2 } })
b.users.updateMany({}, { $rename: { age: "years" } })
db.users.updateOne({ age: 12 }, { $unset: { age: "" } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando actualiza el &lt;code&gt;name&lt;/code&gt; del primer documento que posea un &lt;code&gt;age&lt;/code&gt; de 12&lt;br&gt;
El segundo incrementa en 2 el &lt;code&gt;age&lt;/code&gt; del primer documento que posea un &lt;code&gt;age&lt;/code&gt; de 12&lt;br&gt;
El tercero cambia el nombre del campo &lt;code&gt;age&lt;/code&gt; a &lt;code&gt;years&lt;/code&gt; de todos los documentos&lt;br&gt;
El cuarto elimina el campo &lt;code&gt;age&lt;/code&gt; del primer documentos con un &lt;code&gt;age&lt;/code&gt; de 12&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$push&lt;/li&gt;
&lt;li&gt;$pull
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;b.users.updateMany({}, { $push: { friends: "John" } })
b.users.updateMany({}, { $pull: { friends: "Miguel" } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primero agrega un valor a al arreglo &lt;code&gt;friends&lt;/code&gt;, el segundo elimina el valor , ambos de todos los documentos.&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>spanish</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Docker</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Sat, 28 May 2022 04:06:00 +0000</pubDate>
      <link>https://forem.com/fernandochata/docker-43l2</link>
      <guid>https://forem.com/fernandochata/docker-43l2</guid>
      <description>&lt;h2&gt;
  
  
  &lt;a href="https://hub.docker.com/_/mongo"&gt;DockerHub MongoDB&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull mongo:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d
     -p &amp;lt;puerto de escucha&amp;gt;:27017
     -v &amp;lt;ruta de volumen&amp;gt;:/data/db
     --name &amp;lt;nombre de instancia&amp;gt;
     mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ej:
docker run -d -p 27017:27017 -v ~/dataDB/mongoDB:/data/db --name mymongodb mongo:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -it mymongodb bash
mongosh
db.createUser({user:"fernando", pwd:"password", roles:[]})
db.auth("fernando", "password")
show databases
use &amp;lt;db_name&amp;gt;
show collections
db.&amp;lt;collec_name&amp;gt;.find()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://hub.docker.com/_/postgres"&gt;PostgreSQL&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

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

docker run -d
     -p 5432:5432
     -v C:\dataDB\postgres:/var/lib/postgresql/data
*    -e POSTGRES_PASSWORD=&amp;lt;password&amp;gt;
     -e POSTGRES_USER=&amp;lt;user_name&amp;gt;
     -e POSTGRES_DB=&amp;lt;database_name&amp;gt;
     --name pgdb
     postgres

psql -U &amp;lt;user&amp;gt; --password  --db &amp;lt;database_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://hub.docker.com/_/microsoft-mssql-server"&gt;SQL Server&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull mcr.microsoft.com/mssql/server:2022-latest

docker run -d -p 1433:1433 \
     -e "ACCEPT_EULA=Y" \
     -e "MSSQL_SA_PASSWORD=&amp;lt;password&amp;gt;" \
     --name sql1 \
     mcr.microsoft.com/mssql/server:2022-latest


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

&lt;/div&gt;



&lt;p&gt;&lt;a href=""&gt;MySQL&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

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

docker run -d
     -p 3306:3306
*    -e MYSQL_ROOT_PASSWORD=pswd
     -e MYSQL_DATABASE=
     -e MYSQL_USER=
     -e MYSQL_PASSWORD=
     -v C:\dataDB\mySQL:/var/lib/mysql 
     --name mysqldb
     mysql

docker exec -it mysqldb mysql -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;otros comandos útiles&lt;/p&gt;

&lt;p&gt;Detiene la ejecución de un contenedor&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;docker stop id_contenedor&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lista las imagenes descargadas&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;docker images&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Elimina containers&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;docker rm id_contenedor&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Elimina imagenes&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;docker rmi nombre_imagen&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lista de containers&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;docker ps -a -q -s&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;(-a, muestra todos los containers incluso los que no se encuentran corriendo)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(-q, muestra sólo los id de los containers)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(-s, muestra el tamaño de los containers)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>spanish</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Formatos de fechas y horas en Javascript</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Sun, 02 Aug 2020 20:49:03 +0000</pubDate>
      <link>https://forem.com/fernandochata/formatos-de-fechas-y-horas-en-javascript-1j01</link>
      <guid>https://forem.com/fernandochata/formatos-de-fechas-y-horas-en-javascript-1j01</guid>
      <description>&lt;p&gt;Ojalá las cosas fuesen simples al hablar de fechas, lo común es:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Sun Aug 02 2020 14:54:33 GMT-0400 (hora estándar de Chile)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usando toLocaleDateString()
&lt;/h2&gt;

&lt;p&gt;Claro tanto texto no se vería bien, si queremos "embellecer" nuestros formatos de salida debemos usar toLocaleDateString() y obtendremos algo como:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatFullDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// 2/8/2020&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mejor, pero quería la versión larga, entonces le agregamos algunas opciones:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatFullDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;es-CL&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="na"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;long&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// narrow, short&lt;/span&gt;
     &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&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-digit&lt;/span&gt;
     &lt;span class="na"&gt;month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;short&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// numeric, 2-digit, narrow, long&lt;/span&gt;
     &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// 2-digit&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formatFullDate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// domingo, 2 de ago. de 2020&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ahí si, como se ven existen varias opciones, veamos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;es-CL: corresponde al idioma y al país&lt;/li&gt;
&lt;li&gt;narrow: devuelve la primera letra, por ejemplo, si fuese un domingo el resultado es sería una letra "D"&lt;/li&gt;
&lt;li&gt;long: devuelve la palabra completa&lt;/li&gt;
&lt;li&gt;short: devuelve la versión corta de la palabra, en el ejemplo devolvería la abreviación "dom"&lt;/li&gt;
&lt;li&gt;2-digit: obliga a devolver dos dígitos, si el día es menor de 10 devuelve el dia con un cero adelante, en caso de los años, devuelve los dos últimos dígitos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si nos encontrasemos en EEUU el resultado sería:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatFullDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en-ES&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="na"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;long&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// narrow, short&lt;/span&gt;
     &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&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-digit&lt;/span&gt;
     &lt;span class="na"&gt;month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;short&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// numeric, 2-digit, narrow, long&lt;/span&gt;
     &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// 2-digit&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// Sunday, Aug 2, 2020&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;como se ve el formato inglés es diferente al formato español.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando toLocaleTimeString()
&lt;/h2&gt;

&lt;p&gt;Ahora veamos las horas, para esto se usa toLocaleTimeString()&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLocaleTimeString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// 16:05:04&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;bien, bien, pero quizá queramos ver el AM o PM, o quizá nuestro país tiene diferentes zonas de horarias, por ejemplo en Chile, donde vivo, tenemos la Isla de Pascua, allá tienen dos hora de diferencia dependiendo del horario de invierno o verano, entonces tendré que agregar algunas opciones:&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="c1"&gt;// hora continental - Santiago de Chile&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatFullTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLocaleTimeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;es-CL&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="na"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;America/Santiago&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;hour12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
     &lt;span class="na"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&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-digit&lt;/span&gt;
     &lt;span class="na"&gt;minute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2-digit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// numeric&lt;/span&gt;
     &lt;span class="na"&gt;second&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2-digit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// numeric&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formatFullTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 4:28:45 p. m.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// hora insular - Isla de Pascua&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatFullTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLocaleTimeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;es-CL&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="na"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pacific/Easter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;hour12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
     &lt;span class="na"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&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-digit&lt;/span&gt;
     &lt;span class="na"&gt;minute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2-digit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// numeric&lt;/span&gt;
     &lt;span class="na"&gt;second&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2-digit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// numeric&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formatFullTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 2:28:45 p. m.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;encontramos nuevas opciones, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timeZone: corresponde a la hora horaria que queremos visualizar, por ejemplo en Estados Unidos sería algo como "America/Los_angeles" o "America/New_york"&lt;/li&gt;
&lt;li&gt;hour12: si queremos visualizar la hora en formato de 12 horas (agregando el AM o PM) la opción será "true" o en caso contrario de 24 horas&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>spanish</category>
    </item>
    <item>
      <title>NodeJS, la vida de los procesos.</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Sun, 02 Aug 2020 16:11:20 +0000</pubDate>
      <link>https://forem.com/fernandochata/nodejs-la-vida-de-los-procesos-2ff5</link>
      <guid>https://forem.com/fernandochata/nodejs-la-vida-de-los-procesos-2ff5</guid>
      <description>&lt;p&gt;Desde hace poco he comenzado a estudiar node, y a veces mientras hacia pruebas con el fetch api, el código no seguía el orden que en mi cabeza debía seguir. Además de dejarme con algo de insomnio comencé a leer a qué se debía.&lt;/p&gt;

&lt;p&gt;Veamos, si ves el siguiente código:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;program start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;first function&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="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;second function&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;third function&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="mi"&gt;1000&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;program end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y, si no sabes como funciona el setTimeout() podrías suponer un recorrido línea por línea, y esperar una salida por consola como esta:&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="c1"&gt;// program start&lt;/span&gt;
&lt;span class="c1"&gt;// first function&lt;/span&gt;
&lt;span class="c1"&gt;// second function&lt;/span&gt;
&lt;span class="c1"&gt;// third function&lt;/span&gt;
&lt;span class="c1"&gt;// program end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;claro, si te digo que el setTimeout() le pone un temporizador a una función (setTimeout(&amp;lt;función&amp;gt;,&amp;lt;tiempo en milisegundos&amp;gt;), es decir ejecuta la función después de determinados milisegundos), entonces quizá pienses que obtendrás algo como esto:&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="c1"&gt;// program start&lt;/span&gt;
&lt;span class="c1"&gt;// third function&lt;/span&gt;
&lt;span class="c1"&gt;// second function&lt;/span&gt;
&lt;span class="c1"&gt;// first function&lt;/span&gt;
&lt;span class="c1"&gt;// program end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pues te vas a quedar sentado, pues la salida por consola es:&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="c1"&gt;// program start&lt;/span&gt;
&lt;span class="c1"&gt;// program end   &amp;lt;--- Ojo, ojito, ojete&lt;/span&gt;
&lt;span class="c1"&gt;// third function&lt;/span&gt;
&lt;span class="c1"&gt;// second function&lt;/span&gt;
&lt;span class="c1"&gt;// first function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MYiuTEIi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/wJU1oC5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MYiuTEIi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/wJU1oC5.jpg" alt="pikachu" width="720" height="405"&gt;&lt;/a&gt;&lt;br&gt;
Pero cómo? resulta que javascript hace lo siguiente:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;program start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;esto lo toma y lo ejecuta, es decir te muestra por consola el mensaje, y pasa a la siguiente línea de código.&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="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;first function&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="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;acá se detiene y ve una función, la que podría o no demorarse, entonces la deja en una cola, para que se vaya ejecutando en segundo plano, y pasa a la siguiente línea de código.&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="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;second function&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;acá vuelve a encontrarse con otra función y hace lo mismo, a la cola que tengo prisa, y sigue con la siguiente línea&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="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;third function&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="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;se repite el proceso y pasa de la función y continua&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;program end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;acá encuentra algo que puede hacer e imprime por consola el mensaje, y encuentra el final del archivo.&lt;/p&gt;

&lt;p&gt;Mientras hacía todo esto, las funciones en cola siguieron ejecutándose y si llegaban a su final, pasaban a su vez a otra cola, de salida digamos.&lt;/p&gt;

&lt;p&gt;Javascript revisa la cola de salida y nos muestra los resultados de las funciones que se ejecutaron, todo en orden, revisa luego si queda algo en la cola donde se encontraban las funciones y si no queda nada, pasa a revisar nuevamente la cola de salida, si no encuentra nada pues termina su trabajo.&lt;/p&gt;

&lt;p&gt;Todo esto es por optimizar el tiempo de ejecución, pues si esperara hasta que cada función se ejecute para seguir a la siguiente, como el ejemplo, se demoraría en total 6 segundos, versus los 3 segundos que realmente se demora.&lt;/p&gt;

&lt;p&gt;Esto toma relevancia al usar funciones promesa, que no se tiene certeza de cuanto demorará en llegar la respuesta.&lt;/p&gt;

&lt;p&gt;Eso, bueno no soy experto así que si algo está mal o quieres acotar algo, pues tienes los comentarios y gustoso modifico.&lt;/p&gt;

&lt;p&gt;Más información acá la encuentras&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/API/WindowTimers/setTimeout"&gt;setTimeout()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Git for Dummies (like me)</title>
      <dc:creator>Fernando Chata</dc:creator>
      <pubDate>Sat, 01 Aug 2020 23:19:15 +0000</pubDate>
      <link>https://forem.com/fernandochata/git-for-dummies-like-me-29ij</link>
      <guid>https://forem.com/fernandochata/git-for-dummies-like-me-29ij</guid>
      <description>&lt;h3&gt;
  
  
  Configuración inicial
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.name "your name"

git config --global user.email "your_mail@mail.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inicializando Git
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;Esto comando crea una carpeta .git en nuestro directorio de trabajo, donde se almacenará información de todos los cambios que realicemos a nuestro proyecto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clonando repositorio remoto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone &amp;lt;link&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;con este comando "copiamos" a nuestra carpeta local todos los archivos y carpetas de un repositorio remoto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agregando los cambios de los archivos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add &amp;lt;archivo.ext&amp;gt;
or
git add -A
or
git add .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para guardar los cambios realizados primero debemos prepararlos, esto puede ser archivo por archivo, o todo el conjunto total de modificaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparando la subida
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -m “&amp;lt;message&amp;gt;”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando guarda los cambios realizados al código, le agrega un id o head a dicho "guardado", todo esto dentro de nuestro servidor local. El parametro "message" es un comentario para poder diferenciar diferentes subidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subiendo cambios a servidor local
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git pull origin &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando sube una copia de los cambios realizados en el codigo a nuestro servidor local. El parametro "branch" se refiere a la rama de nuestro servidor donde subiremos nuestros archivos, la rama principal es "master".&lt;/p&gt;

&lt;h3&gt;
  
  
  Subiendo cambios a servidor remoto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto sube nuestos cambios al branch (o rama) de nuestro repositorio remoto, la rama principal es "master".&lt;/p&gt;

&lt;h3&gt;
  
  
  Otros comandos
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;Muestra el estado actual de los cambios realizados desde el ultimo commit, los archivos nuevos creados, y los cambios en los diferentes archivos.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Nos muestra la rama actual donde nos encontramos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git reset --hard origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regresa el repositorio local al estado del repositorio remoto, se pierden los datos que has realizado desde el ultimo push.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b &amp;lt;new branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crea una nueva rama, y nos redirige allí.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nos cambia de rama.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
