<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tincho</title>
    <description>The latest articles on DEV Community by Tincho (@martinnacimiento).</description>
    <link>https://dev.to/martinnacimiento</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%2F157827%2F9c359178-69c5-4499-b1c1-d56e7e92d7ed.jpg</url>
      <title>DEV Community: Tincho</title>
      <link>https://dev.to/martinnacimiento</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martinnacimiento"/>
    <language>en</language>
    <item>
      <title>JavaScript Engine ⚙️💛</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Wed, 17 Feb 2021 02:41:53 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/javascript-engine-id7</link>
      <guid>https://dev.to/martinnacimiento/javascript-engine-id7</guid>
      <description>&lt;p&gt;JavaScript es un lenguaje de programación que puede ser ejecutado en varios entornos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browsers&lt;/li&gt;
&lt;li&gt;Servers&lt;/li&gt;
&lt;li&gt;Mobile applications&lt;/li&gt;
&lt;li&gt;IoT&lt;/li&gt;
&lt;li&gt;Desktop applications&lt;/li&gt;
&lt;li&gt;Serverless functions&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The origin
&lt;/h1&gt;

&lt;p&gt;El entorno desde el cual todo comenzó, el entorno del cual otros entornos han tomado ideas es el browser. El browser proporciona varios conceptos y APIs, en la siguiente imagen puede apreciarse la infraestructura del browser y node.js, dos entornos muy populares de JS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2ku81ftht86wjp6b9s1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2ku81ftht86wjp6b9s1.png" alt="Alt Text" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Browser
&lt;/h1&gt;

&lt;p&gt;Cada Browser está desarrollado en diferentes lenguajes, e.g.:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔰 &lt;strong&gt;Chrome&lt;/strong&gt;: C, C++ y python, entre otros.&lt;/li&gt;
&lt;li&gt;🦊 &lt;strong&gt;Firefox&lt;/strong&gt;: C, C++, Rust, entre otros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con ellos construyen su backend de programa, que está formado por varias partes, una de ellas es el &lt;strong&gt;JS engine&lt;/strong&gt; ⚙️💛&lt;/p&gt;

&lt;h1&gt;
  
  
  JS Engine ⚙️💛
&lt;/h1&gt;

&lt;p&gt;El JS engine es la pieza clave de los browsers para que JS pueda ser ejecutado, pero no existe un solo motor, existen varios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔰 Chrome y 🎭 Opera utilizan el V8 engine 🎱&lt;/li&gt;
&lt;li&gt;🦊 Firefox utiliza Spidermonkey engine 🕷️🐒&lt;/li&gt;
&lt;li&gt;🗡️ Edge usa Chakra engine 🙏&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ECMACScript
&lt;/h1&gt;

&lt;p&gt;Cada JS engine es mantenido y actualizado ♻️ por un equipo de desarrolladores 👩‍💻 que se encargan de entre otras cosas, agregar las nuevas características del lenguaje que son lanzadas por el comité ECMACScript de forma anual.&lt;br&gt;
Desde el momento que es lanzada una nueva feature del lenguaje hasta que sea soportada por los browser hay un tiempo. Por lo que hay que estar atentos al soporte que de cada uno si querés hacer uso de nuevas features, el siguiente &lt;a href="(https://t.co/hhLcXmmmLQ?amp=1)"&gt;link&lt;/a&gt; es útil para esto.&lt;/p&gt;
&lt;h1&gt;
  
  
  Conclusión
&lt;/h1&gt;

&lt;p&gt;Hemos aprendido sobre la existencia del varios motores (engines) de JS y su importancia para ejecutar codigo JS en los navegadores, pero no solo en este entorno, sino tambien en los demas me falto decirte, el entorno de node.js esta contruido con el motor 🎱 V8 de Chrome 🔰, increible no? Al ocupar algunos de los navegadores mencionados hubo uno de estos motores haciendo que la pagina que visitaras fuera interactiva.&lt;/p&gt;
&lt;h1&gt;
  
  
  YAPA
&lt;/h1&gt;

&lt;p&gt;Como llegaste hasta aquí, quisiera darte un último concepto para que te lo lleves contigo y su significado también. El concepto es transpiladores. Pero antes de decirte su significado o para que sirve, mejor te doy el problema.&lt;/p&gt;

&lt;p&gt;Cuando mencione que seguro vas a estar ansioso de probar las nuevas características de JS apenas salieran, pero habría que esperar un tiempo hasta que el equipo de desarrolladores de los motores de JS lo implementaran en una nueva versión del motor. Bueno, los usuarios no están muy ansiosos por esto, es más, lo desconocen, y suelen no tener los navegadores actualizados por varios motivos. Entonces uno como desarrollador puede estar desarrollando su aplicación web con las últimas características del lenguajes, pero estas pueden no ser soportadas por el navegador del usuario el cual no puede entender esa nueva feature y hacer que nuestra aplicación web se rompa.&lt;/p&gt;

&lt;p&gt;¿Qué hacemos entonces? Seguimos con el código viejo de JS? No tiene sentido no? Para solucionar esto existen los transpiladores que nos permiten escribir código JS con las características de JS que queramos y hacer código equivalente o similar en el caso de no ser posible, para que navegadores más viejos puedan correr nuestra aplicación.&lt;br&gt;
Lo transpiladores más conocidos son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/traceur-compiler" rel="noopener noreferrer"&gt;Traceur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;Babel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;y también te comparto un temita, ¡que andes bien!&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/track/6FuGJB290AQMAHTfjOYVaK" width="100%" height="80px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Configure Jest in Nuxt.js</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Thu, 28 Jan 2021 02:19:52 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/configure-jest-in-nuxt-js-36e9</link>
      <guid>https://dev.to/martinnacimiento/configure-jest-in-nuxt-js-36e9</guid>
      <description>&lt;p&gt;If you already have a project created with Nuxt but without Jest configured, I'll show you how to do it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 My Nuxt.js version is &lt;code&gt;2.14.12&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Steps
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install dependencies&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-D&lt;/span&gt; @vue/test-utils babel-core@^7.0.0-bridge.0 babel-jest jest vue-jest
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add command &lt;code&gt;test&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add file &lt;code&gt;jest.config.js&lt;/code&gt; in root directory&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;moduleNameMapper&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;^@/(.*)$&lt;/span&gt;&lt;span class="dl"&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;&amp;lt;rootDir&amp;gt;/$1&lt;/span&gt;&lt;span class="dl"&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;^~/(.*)$&lt;/span&gt;&lt;span class="dl"&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;&amp;lt;rootDir&amp;gt;/$1&lt;/span&gt;&lt;span class="dl"&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;^vue$&lt;/span&gt;&lt;span class="dl"&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;vue/dist/vue.common.js&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;moduleFileExtensions&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;js&lt;/span&gt;&lt;span class="dl"&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;vue&lt;/span&gt;&lt;span class="dl"&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;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;transform&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;^.+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;.js$&lt;/span&gt;&lt;span class="dl"&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;babel-jest&lt;/span&gt;&lt;span class="dl"&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;.*&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;.(vue)$&lt;/span&gt;&lt;span class="dl"&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;vue-jest&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;collectCoverage&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="na"&gt;collectCoverageFrom&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;&amp;lt;rootDir&amp;gt;/components/**/*.vue&lt;/span&gt;&lt;span class="dl"&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;&amp;lt;rootDir&amp;gt;/pages/**/*.vue&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;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add file &lt;code&gt;.babelrc&lt;/code&gt; in root directory&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"presets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"@babel/preset-env"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"current"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create &lt;code&gt;test&lt;/code&gt; directory in root directory&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write your first test of your component &lt;code&gt;/test/YourComponent.spec.js&lt;/code&gt;&lt;br&gt;
&lt;/p&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;mount&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;@vue/test-utils&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;YourComponent&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;@/components/YourComponent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YourComponent&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;is a Vue instance&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="o"&gt;=&amp;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;wrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;YourComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeTruthy&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;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 I recommend you to read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vuejs.org/v2/guide/testing.html" rel="noopener noreferrer"&gt;Vue Testing (optional)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vue-test-utils.vuejs.org/" rel="noopener noreferrer"&gt;Vue Test Utils (important)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Thank you for readme! see you soon 😉
&lt;/h3&gt;

</description>
      <category>nuxt</category>
      <category>vue</category>
      <category>jest</category>
      <category>testing</category>
    </item>
    <item>
      <title>CAATs</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Mon, 30 Nov 2020 18:39:07 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/caats-1kai</link>
      <guid>https://dev.to/martinnacimiento/caats-1kai</guid>
      <description>&lt;p&gt;Herramientas de auditoría asistidas por computadora (CAATs) o herramientas y técnicas de auditoría asistidas por computadora (CAATs) es un campo en crecimiento dentro de la profesión de auditoría de TI. CAAT es la práctica de utilizar computadoras para automatizar los procesos de auditoría de TI.&lt;/p&gt;

&lt;p&gt;Los CAAT normalmente incluyen el uso de software básico de productividad de oficina, como hojas de cálculo, procesadores de texto y programas de edición de texto, y paquetes de software más avanzados que implican el uso de herramientas de análisis estadístico e inteligencia empresarial. Pero también hay disponible software especializado más dedicado.&lt;/p&gt;

&lt;p&gt;Los CAAT se han convertido en sinónimo de análisis de datos en el proceso de auditoría.&lt;/p&gt;

&lt;p&gt;Por eso me gustaría listar algunas de estas CAATs y abrir un hilo para compartir en los comentarios otras CAATs que conozcan.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lista
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kitploit.com/2020/06/lynis-300-security-auditing-tool-for.html" rel="noopener noreferrer"&gt;Lynis 3.0.0 - Security Auditing Tool for Unix/Linux Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kitploit.com/2020/09/nerve-network-exploitation.html" rel="noopener noreferrer"&gt;NERVE - Network Exploitation, Reconnaissance &amp;amp; Vulnerability Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kitploit.com/2020/10/vprioritizer-tool-to-understand.html" rel="noopener noreferrer"&gt;
vPrioritizer - Tool To Understand The Contextualized Risk (vPRisk) On Asset-Vulnerability Relationship Level Across The Organization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kitploit.com/2015/11/nmap-7-security-scanner-for-network.html" rel="noopener noreferrer"&gt;Nmap 7 - Security Scanner For Network Exploration &amp;amp; Security Audits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kitploit.com/2020/11/bulwark-organizational-asset-and.html" rel="noopener noreferrer"&gt;Bulwark - An Organizational Asset And Vulnerability Management Tool, With Jira Integration, Designed For Generating Application Security Reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kitploit.com/2020/11/threagile-agile-threat-modeling-toolkit.html" rel="noopener noreferrer"&gt;Threagile - Agile Threat Modeling Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En resumen &lt;a href="https://www.kitploit.com/" rel="noopener noreferrer"&gt;Kitploit&lt;/a&gt; parece un buen lugar para buscar estas herramientas y se encuentra bien explicada el uso de cada una.&lt;/p&gt;

</description>
      <category>audit</category>
      <category>computer</category>
      <category>tools</category>
      <category>caat</category>
    </item>
    <item>
      <title>COMPUTER AUDIT ROADMAP</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Mon, 30 Nov 2020 17:53:50 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/computer-audit-roadmap-37c2</link>
      <guid>https://dev.to/martinnacimiento/computer-audit-roadmap-37c2</guid>
      <description>&lt;p&gt;Para empezar esta hoja de ruta, quiero señalar que tiene como objetivo ser una guía, no pretende ser la "guía definitiva", por lo que si tiene puntos de vista diferentes o entiende que hay formas mejores de plantear la hoja de ruta, hagamelo saber en los comentarios. Aclarado esto, empecemos.&lt;/p&gt;

&lt;h1&gt;
  
  
  1 - &lt;a href="https://www.isaca.org/" rel="noopener noreferrer"&gt;ISACA&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;También conocida como &lt;strong&gt;I&lt;/strong&gt;nformation &lt;strong&gt;S&lt;/strong&gt;ystems &lt;strong&gt;A&lt;/strong&gt;udit and &lt;strong&gt;C&lt;/strong&gt;ontrol &lt;strong&gt;A&lt;/strong&gt;ssociation, o en español, Asociación de Control y Auditoría de Sistemas de Información.&lt;/p&gt;

&lt;p&gt;ISACA es una asociación profesional internacional enfocada en el gobierno de T&amp;amp;I (tecnología e información). ISACA a nivel mundial engloba el ITGI (Information Technology Governance Institute) y el &lt;a href="https://www.cmmiinstitute.com/" rel="noopener noreferrer"&gt;CMMI Institute&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Es una asociación internacional que apoya y patrocina el desarrollo de metodologías y certificaciones para la realización de actividades de auditoría y control en sistemas de información.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.1 Estructura de ISACA
&lt;/h2&gt;

&lt;p&gt;Defino la estructura de ISACA como lo que podemos aprovechar de lo que ofrece la asociación para aplicar a nuestras practicas de auditoria.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Certificaciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/credentialing/cisa" rel="noopener noreferrer"&gt;CISA&lt;/a&gt; (Auditor de Sistemas de Información Certificado):&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/credentialing/cism" rel="noopener noreferrer"&gt;CISM&lt;/a&gt; (Gerente de Seguridad de la Información Certificado):&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/credentialing/cgeit" rel="noopener noreferrer"&gt;CGEIT&lt;/a&gt; (Certificado en el Gobierno de la TI empresarial):&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/credentialing/crisc" rel="noopener noreferrer"&gt;CRISC&lt;/a&gt; (Certificado en el Control de Sistemas de Información y Riesgos):&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/credentialing/csx-p" rel="noopener noreferrer"&gt;CSX-P&lt;/a&gt; (Certificación de practicante de ciberseguridad):&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/credentialing/certified-data-privacy-solutions-engineer" rel="noopener noreferrer"&gt;CDPSE&lt;/a&gt; (Ingeniero certificado en soluciones de privacidad de datos):&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Frameworks, Estándares y Modelos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/resources/cobit" rel="noopener noreferrer"&gt;COBIT&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.isaca.org/bookstore/bookstore-risk-digital/ritf2" rel="noopener noreferrer"&gt;Risk IT Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.isaca.org/bookstore/audit-control-and-security-essentials/witaf4" rel="noopener noreferrer"&gt;IT Audit Framework (ITAF™): Un framework de practicas profesional para auditorias de TI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cmmiinstitute.com/" rel="noopener noreferrer"&gt;Capability Maturity Model Integration (CMMI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.isaca.org/bookstore/it-governance-and-business-management/WBMIS1" rel="noopener noreferrer"&gt;Business Model for Information Security (BMIS)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.isaca.org/resources/insights-and-expertise/audit-programs-and-tools#sort=relevancy&amp;amp;layout=card" rel="noopener noreferrer"&gt;Programas y Herramientas de Auditoria&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.isaca.org/resources/insights-and-expertise/publications#sort=%40searchdate%20descending&amp;amp;layout=card" rel="noopener noreferrer"&gt;Publicaciones&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.isaca.org/resources/insights-and-expertise/white-papers#sort=%40searchdate%20descending&amp;amp;layout=card" rel="noopener noreferrer"&gt;Documentos tecnicos (white papers)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Parece mucho para estudiar 🥴 ...&lt;/p&gt;

&lt;p&gt;Para empezar no es necesario leer todo desde mi criterio, pero conocer de forma general y saber que ese material esta disponible para cuando llegue el momento de contar con mas experiencia en el campo y profundizar algunos temas. Por eso lo que leí yo de todos esos recursos y recomiendo para empezar fue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/credentialing/cisa" rel="noopener noreferrer"&gt;CISA&lt;/a&gt;: No hacer la certificación, para ello se necesita experiencia como auditor en entrenamiento en varias auditorias, sino buscar una guía de estudio sobre la certificación y leer el primer capitulo donde se puede ver panorama general y el capitulo donde se describe un proceso de auditoria.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.isaca.org/bookstore/audit-control-and-security-essentials/witaf4" rel="noopener noreferrer"&gt;IT Audit Framework (ITAF™)&lt;/a&gt;: es un framework de practicas profesionales para auditorias de TI, donde podra encontrar estándares, lineamientos, herramientas y técnicas para orientar y asegurar la calidad del proceso de auditoria. De manera general es bueno conocer su estructura que es la siguiente:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estándares&lt;/strong&gt;, divididos en tres categorías:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estándares generales (serie 1000)&lt;/strong&gt;: Los principios de orientación según los cuales operan los profesionales de auditoría y aseguramiento de SI. Se refieren a la realización de todas las asignaciones y se ocupan de la ética, independencia, objetividad, debido cuidado, conocimiento, competencia y habilidad de los profesionales de auditoría y aseguramiento de SI. Las declaraciones de los estándares (en negrita) son obligatorias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estándares de desempeño (serie 1200)&lt;/strong&gt;: Se refieren a la realización de la asignación; es decir, planificación y supervisión, alcance, riesgo e importancia, movilización de recursos, gestión de supervisión y asignaciones, evidencia de auditoría y aseguramiento, y la puesta en práctica del juicio profesional y debido cuidado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estándares de reportes (serie 1400)&lt;/strong&gt;: Se refieren a los tipos de reportes, medios de comunicación y a la información comunicada.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Lineamientos&lt;/strong&gt;, que respaldan los estándares y también están divididos en tres categorías:

&lt;ul&gt;
&lt;li&gt;Lineamientos generales (serie 2000)&lt;/li&gt;
&lt;li&gt;Lineamientos de desempeño (serie 2200)&lt;/li&gt;
&lt;li&gt;Lineamientos de reportes (serie 2400)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Herramientas y técnicas&lt;/strong&gt;, que brindan orientación adicional para los profesionales de auditoría y aseguramiento de SI; por ejemplo, libros blancos, programas de auditoría/aseguramiento de SI, la familia de productos de COBIT 5&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  2 - Estándares
&lt;/h1&gt;

&lt;p&gt;El conocimiento de estándares internacionales es fundamental, pero lo es mas aun conocer primero a quienes crean tales estándares, se lista algunas organizaciones/institutos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.iso.org/home.html" rel="noopener noreferrer"&gt;ISO&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nist.gov/" rel="noopener noreferrer"&gt;NIST&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ITU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y algunos de los estándares que se deben conocer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ISO/IEC 27001&lt;/li&gt;
&lt;li&gt;ISO/IEC 27002&lt;/li&gt;
&lt;li&gt;ISO/IEC 17799&lt;/li&gt;
&lt;li&gt;NIST 800-53&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>computer</category>
      <category>audit</category>
    </item>
    <item>
      <title>Interpretación del Teorema de Bayes</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Sun, 15 Nov 2020 19:26:35 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/interpretacion-del-teorema-de-bayes-4f85</link>
      <guid>https://dev.to/martinnacimiento/interpretacion-del-teorema-de-bayes-4f85</guid>
      <description>&lt;p&gt;Hola! Estoy estudiando sobre el teorema de Bayes para IA que estoy cursando en este momento. Me he encontrado con problemas a la hora de entenderlo, en pocas palabras, el problema aparece en el momento de &lt;strong&gt;preguntar&lt;/strong&gt; sobre una probabilidad condicional, la cual no tenemos y que queremos encontrar con el teorema de Bayes, entonces para demostrar esto voy a mostrar el ejemplo de un &lt;a href="https://www.docirs.cl/entender_teorema_de_bayes_simple.asp#" rel="noopener noreferrer"&gt;sitio web&lt;/a&gt; que me parece no plantea de forma correcta la pregunta, y repito, "me parece" porque no esta mal hecho el ejercicio, pero leyendo de otras paginas encontré una forma mas entendible de plantear la pregunta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplo del sitio web
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkugb206wccn9qqh34vz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkugb206wccn9qqh34vz2.png" alt="Alt Text" width="442" height="741"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasta acá el planteo del problema esta bien, pero a la hora de hacer la pregunta de la probabilidad condicional me parece que no es correcto, les muestro:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyc95707pq9eeyrog1yi2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyc95707pq9eeyrog1yi2.png" alt="Alt Text" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La probabilidad que la bolita del segundo buzón sea roja, si la bolita del primer buzón salió negra &lt;strong&gt;ya la tenemos&lt;/strong&gt; y es la que ven el numerador. Cuando dice "si" esta representando la condición, es decir, información adicional que tenemos acerca de la probabilidad que buscamos. Es decir busca 'P(R2|N1)', la cual ya tenemos.&lt;/p&gt;

&lt;p&gt;Esto me genero una ofuscación, y no entendía nada. Hasta que investigando me encontré con un mejor planteo, mirando un &lt;a href="https://www.youtube.com/watch?v=zQqxBirepKw" rel="noopener noreferrer"&gt;vídeo de Unicoos&lt;/a&gt; y luego buscando &lt;a href="https://economipedia.com/definiciones/teorema-de-bayes.html" rel="noopener noreferrer"&gt;material&lt;/a&gt; en Google. Entonces entendí el que me parece a mi el planteo correcto, el ejercicio de ejemplo no esta mal desarrollado, pero si mal planteada la pregunta, la pregunta correcta seria la siguiente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cual es la probabilidad de que haya sacado una bolita negra en el primer buzón sabiendo que saque una bolita roja en el segundo buzón?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Es decir la probabilidad condicional que buscamos es: &lt;code&gt;P(N1|R2)&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otro ejemplo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5jeu2aul90xmgjyz2lzn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5jeu2aul90xmgjyz2lzn.png" alt="Alt Text" width="800" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;P(Licenciatura|Mujer) = la probabilidad de que cursando una licenciatura sea mujer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Es un poco confuso, pero como esta planteado la primer parte de la igualdad tenemos que como &lt;strong&gt;información que tenemos&lt;/strong&gt; es la probabilidad que sea mujer, y la que buscamos en la probabilidad de que sea licenciatura dado la información que tenemos. Entonces para mi un mejor planteo seria:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;P(Licenciatura|Mujer) = cual es la probabilidad de que una persona estudie una licenciatura sabiendo que es mujer&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Esto para mi tiene mucho mas sentido, y me siento cómodo resolviendo de esta forma los ejercicios. Espero que te sea de ayuda como para mi ha sido, y si tenes una forma mejor de interpretarlo házmelo saber en los comentarios!&lt;/p&gt;

&lt;p&gt;Ahora después de tanta ofuscación, Dakiti para levantarla porque dentro de unos días tengo parcial y hay que seguir estudiando 😂&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/track/47EiUVwUp4C9fGccaPuUCS" width="100%" height="80px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introducción a la Ciencia de Datos</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Fri, 23 Oct 2020 17:55:28 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/introduccion-a-la-ciencia-de-datos-1e67</link>
      <guid>https://dev.to/martinnacimiento/introduccion-a-la-ciencia-de-datos-1e67</guid>
      <description>&lt;p&gt;Si buscamos en Google "Como convertirse en un científico de datos?", probablemente nos confrontemos con una larga lista de &lt;strong&gt;habilidades&lt;/strong&gt;, desde modelado estadístico hasta programación en Python pasando por la comunicación efectiva eficaz y la realización de presentaciones. Una descripción de &lt;strong&gt;trabajo&lt;/strong&gt; podría describir un rol mas cercano a un estadístico, mientras que otro empleador busca a alguien quien tenga una maestría en informática. Cuando buscamos formas de ganar todas estas habilidades, encontraremos opciones desde volver a la escuela por una maestría hasta hacer un campo de entrenamiento (bootcamp) para comenzar a hacer análisis de datos en nuestro actual trabajo. Poner juntos, todas estas combinaciones de caminos puede sentirse insuperable, especialmente para personas quienes no están seguras en querer ser científicos de datos.&lt;/p&gt;

&lt;p&gt;La buena noticia es que no hay un único científico de datos que tenga todas estas habilidades. Los científicos de datos comparten bases de conocimientos, pero cada uno tiene su propia especialidad, al punto que no pueden intercambiar trabajos. La idea del post es ayudarlo a comprender qué son todos estos tipos de científicos de datos y cómo tomar las mejores decisiones para comenzar su carrera.&lt;/p&gt;

&lt;p&gt;Los objetivos de este post son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conocer las bases de la ciencia de datos, incluyendo las habilidades que necesitas para un trabajo y diferentes tipos de científicos de datos.&lt;/li&gt;
&lt;li&gt;Entrar en detalles sobre el papel de un científico de datos en cinco tipos de empresas para ayudarlo a comprender mejor cómo será el trabajo.&lt;/li&gt;
&lt;li&gt;Cubrir los caminos para obtener las habilidades necesarias para ser un científico de datos y las ventajas y desventajas de cada uno.&lt;/li&gt;
&lt;li&gt;Cubrir cómo crear una cartera de proyectos de ciencia de datos para obtener experiencia práctica en ciencia de datos y crear una cartera para mostrar a los empleadores potenciales&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>datascience</category>
    </item>
    <item>
      <title>Técnicas de replicacion para disponibilidad</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Wed, 01 Jul 2020 23:14:34 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/tecnicas-de-replicacion-para-disponibilidad-c9i</link>
      <guid>https://dev.to/martinnacimiento/tecnicas-de-replicacion-para-disponibilidad-c9i</guid>
      <description>&lt;h1&gt;
  
  
  Abstract 📖
&lt;/h1&gt;

&lt;p&gt;Vamos ver como proporcionar a los clientes acceso un objeto replicado es lógicamente indistinguible de acceder a un objeto único, pero altamente disponible. Vamos a estudiar este problema bajo 2 diferentes modelos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modelo 1&lt;/strong&gt;: los fallos pueden ser detectados precisamente, aplicando las técnicas &lt;strong&gt;primary-backup&lt;/strong&gt; y &lt;strong&gt;chain replication&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modelo 2&lt;/strong&gt;: todo lo contrario al primero, para hacer un modelo mas realista y significativamente mas desafiante. Aplicando técnicas basadas en votos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;La replicación es crear múltiples copias de un objeto posiblemente mutante (archivos, base de datos, etc) con el objectivo de proporcionar alta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Disponibilidad&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rendimiento&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integridad&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;o cualquier combinación de los mismos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Así, para una alta &lt;strong&gt;disponibilidad&lt;/strong&gt; e &lt;strong&gt;integridad&lt;/strong&gt;, las replicas necesitan ser diversas, así los fallos son lo suficientemente aislados. Para alto &lt;strong&gt;rendimiento&lt;/strong&gt;, solo debe haber una cantidad suficiente de réplicas para cumplir con la carga impuesta sobre el objeto replicado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pero nosotros acá, nos vamos a enfocar únicamente en técnicas para asegurar alta disponibilidad&lt;/strong&gt;. Particularmente en técnicas para dar a los clientes acceso un objeto replicado es lógicamente indistinguible de acceder a un objeto único (no replicado), pero altamente disponible.&lt;/p&gt;

&lt;p&gt;Esta propiedad "indistinguible de un solo objeto" a veces se llama &lt;em&gt;linealización&lt;/em&gt;, &lt;em&gt;semántica de una copia&lt;/em&gt;, o simplemente &lt;em&gt;consistencia&lt;/em&gt;, y se garantiza al imponer un orden total en las operaciones del cliente. Tal estrategia puede funcionar solo en un modelo de fallos restringido. Por ejemplo: Si los enlaces de comunicación fallidos dividen las réplicas, puede ser imposible proporcionar disponibilidad y coherencia para un objeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  2 enfoques 👩‍❤️‍👨
&lt;/h2&gt;

&lt;p&gt;Existen muchas técnicas de replicacion, pero 2 enfoques son bien conocidos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Replicacion Activa 😃
&lt;/h3&gt;

&lt;p&gt;También conocida como &lt;em&gt;replicacion de maquina de estado&lt;/em&gt;, las operaciones del cliente se ordenan mediante un protocolo de pedido y se envían directamente a una colección de réplicas. Cada replica individualmente ejecuta la operación. Mantener las réplicas consistentes requiere que el procesamiento sea determinista: dada la misma operación del cliente y el mismo estado, cada réplica produce la misma actualización de estado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Replicacion Pasiva 🥺
&lt;/h3&gt;

&lt;p&gt;También conocida como replicación de copia de seguridad primaria (primary-backup replication), una de las replicas es designada primaria. Ejecuta las operaciones y envía el resultado de actualizaciones de estado a cada replica (incluso a si misma), el cual, pasivamente aplican las actualizaciones de estado recibidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparando 😃🥺
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Si las operaciones son intensivas en cómputo, la replicación activa puede desperdiciar recursos computacionales, pero si las actualizaciones de estado son grandes, la replicación pasiva puede desperdiciar el ancho de banda de la red.&lt;/li&gt;
&lt;li&gt;La replicación activa no puede lidiar con el procesamiento no determinista, pero puede enmascarar fallas sin degradación del rendimiento, mientras que la replicación pasiva puede involucrar un retraso de detección y recuperación en caso de que el primario falle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Varias soluciones híbridas que combinan ambos enfoques son comunes. Algunos procesamientos se ejecutan en una sola réplica, mientras que otros procesan todas las réplicas. No son enfoques puramente activos ni pasivos, y enfrentan diferentes compensaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Salteando parte no necesaria por ahora, vamos al grano
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Primary-Backup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Quizas el metodo de replicacion mas comun en uso hoy en dia.&lt;/li&gt;
&lt;li&gt;El nodo no bloqueado y con &lt;em&gt;id&lt;/em&gt; mas bajo es designado &lt;strong&gt;primario&lt;/strong&gt; (&lt;em&gt;primary&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;El resto de nodos no bloqueados (en funcionamiento) son llamados &lt;strong&gt;copias de seguridad&lt;/strong&gt; (&lt;em&gt;backups&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Durante una operación normal, un cliente envía una actualización al primario y recibe una respuesta del primario.&lt;/li&gt;
&lt;li&gt;Si el primario falla, el cliente determina el nuevo primario al cual reenvía su actualización. El cliente hace esto hasta que recibe una respuesta o hasta que no queden servidores.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Paso a paso de construcción de un modelo en Vensim</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Wed, 01 Jul 2020 17:55:59 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/paso-a-paso-de-construccion-de-un-modelo-en-vensim-5am1</link>
      <guid>https://dev.to/martinnacimiento/paso-a-paso-de-construccion-de-un-modelo-en-vensim-5am1</guid>
      <description>&lt;p&gt;Nuestro objetivo es construir un &lt;strong&gt;modelo&lt;/strong&gt;, en el cual podamos realizar simulaciones. En este caso, el modelo trata de población.&lt;/p&gt;

&lt;h1&gt;
  
  
  Paso 1
&lt;/h1&gt;

&lt;p&gt;Una vez en Vensim,debemos configurar lo limites de tiempo de nuestro modelo, eso lo hacemos en la pestaña &lt;code&gt;models &amp;gt; settings &amp;gt; Time Bounds&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para este modelo lo dejamos configurado de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvm6sd8vyd0ovwh354swn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvm6sd8vyd0ovwh354swn.png" alt="Configuración de limites de tiempo del modelo" width="564" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Paso 2
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Comunicación en grupo</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Mon, 29 Jun 2020 17:57:53 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/comunicacion-en-grupo-4bd7</link>
      <guid>https://dev.to/martinnacimiento/comunicacion-en-grupo-4bd7</guid>
      <description>&lt;h1&gt;
  
  
  Comunicación en grupo
&lt;/h1&gt;

&lt;p&gt;Vamos a empezar explicando lo que es un grupo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Un &lt;strong&gt;grupo&lt;/strong&gt; es una colección de usuarios u objetos compartiendo un interés común o trabajando hacia un objetivo común.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un ejemplo de grupo, por ejemplo, en el área de sistemas distribuidos seria: un conjunto de servidores replicados formando un servicio altamente disponible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clasificación de grupos:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Por si la composición de miembros es fija o variable:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cerrado&lt;/strong&gt;: cuando su membresia permanece sin cambios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abierto&lt;/strong&gt;: cuando la membresia cambia de vez en cuando.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Por la naturaleza de comunicación:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;De igual a igual&lt;/strong&gt; (peer to peer): cuando todos los miembros tienen los mismos derechos y privilegios. Los miembros se comunican con sus pares para sustentar las actividades del grupo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jerárquico&lt;/strong&gt;: donde un miembro es distinguido del resto, y la comunicación toma lugar entre el miembro distinguido y el resto del grupo.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Los miembros de un grupo se comunican uno con otro usando alguna forma de &lt;strong&gt;multidifusion&lt;/strong&gt; (comunicación uno a muchos) que esta restringida a los miembros de ese grupo. Un mensaje enviado por cualquier miembro debe ser recibido por cada miembro o por ninguno de ellos. Esta propiedad de &lt;em&gt;atomicidad&lt;/em&gt; esta en el corazón de la comunicación en grupo, pero hay otros problemas también. Esto incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complejidad de la comunicación.&lt;/li&gt;
&lt;li&gt;La habilidad para tolerar varios tipos de fallos.&lt;/li&gt;
&lt;li&gt;Tolerancia de partición de red.&lt;/li&gt;
&lt;li&gt;Cuando un miembro cambia de una forma planeado o no, ciertas garantías deben mantenerse para preservar la integridad de los servicios del grupo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Multidifusion atómico
&lt;/h2&gt;

&lt;p&gt;Una multidifusion en un grupo es llamado atómico, es cuando el mensaje es recibido por cada miembro no defectuoso (es decir, en funcionamiento) o por ningún miembro. Es un requerimiento básico de las actividades orientadas a grupos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fallos
&lt;/h3&gt;

&lt;p&gt;Los fallos juegan un rol prominente en la implementacion de multidifusion atómica. En consecuencia, consideraremos dos clases amplias de multidifusión atómica: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Básica&lt;/strong&gt;: descarta bloqueos del proceso (o no proporciona ninguna garantía cuando los procesos fallan).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confiable&lt;/strong&gt;: toma el proceso bloqueado en cuenta y proporciona las garantías.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si se descartan las fallas, cada multidifusión básica es trivialmente atómica. Las multidifusiones atómicas confiables deben satisfacer las siguientes tres propiedades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validez&lt;/strong&gt;: si un proceso correcto multidifunde un mensaje m, eventualmente entrega m.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acuerdo&lt;/strong&gt;: si un proceso correcto entrega m, todos los procesos correctos eventualmente entregan m.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integridad&lt;/strong&gt;: cada proceso correcto entrega un mensaje m como máximo una vez, solo si algún proceso en el grupo multidifunde ese mensaje. Se descarta la recepción de mensajes espurios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La entrega de un mensaje afecta el estado del destinatario y la aplicación que admite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multidifusion IP
&lt;/h2&gt;

&lt;p&gt;Es una popular técnica para multidifusion en la capa de red.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capa de aplicación multidifusion
&lt;/h2&gt;

&lt;p&gt;Mientras multidifusion IP es eficiente con el ancho de banda y varios routers están equipados con esta facilidad, un significante impedimento significativo es el tamaño creciente del espacio de estado que cada enrutador debe mantener por grupo. La multidifusión de capa de aplicación es un enfoque alternativo que supera este problema. Las multidifusiones a nivel de aplicación se implementan como una serie de mensajes punto a punto. La red solo necesita proporcionar la entrega básica sin estado, unidifusión y el mejor esfuerzo. La desventaja es un aumento en el consumo de recursos de red como el ancho de banda, ya que el mismo mensaje puede enrutarse varias veces a través de un enlace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multicast ordenado
&lt;/h2&gt;

&lt;p&gt;En los grupos de multidifusión, hay dos problemas ortogonales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Confiabilidad&lt;/strong&gt;: garantizar que cada miembro reciba todos los mensajes enviados por los otros miembros a pesar de las fallas del proceso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orden&lt;/strong&gt;: incluso si la comunicación subyacente es confiable, garantizar el orden de entrega del mensaje puede estar lejos de ser trivial.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los siguientes son los tres tipos principales de ordenamientos que se han estudiado en el contexto de la multidifusión ordenada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multidifusión de orden local (también llamada FIFO de fuente única).&lt;/li&gt;
&lt;li&gt;Multidifusión de orden causal&lt;/li&gt;
&lt;li&gt;Multidifusión total de pedidos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Multidifusion de orden causal
&lt;/h2&gt;

&lt;p&gt;Esta implementacion usa vectores de marca de tiempos con una modificación menor. El vector es un manejador de eventos. En el algoritmo están involucrados 2 vectores, el vector propio del proceso que envía el mensaje y el vector propio del proceso que recibe el mensaje.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Envío&lt;/strong&gt;: Para enviar el mensaje a todos, el miembro que envía debe incrementar su posición del vector, y agregar el vector actualizado al mensaje.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recepción&lt;/strong&gt;: Para decidir si aceptar el mensaje este mensaje, el miembro que recibe tiene que decidir el orden causal de este mensaje con respecto a otros mensajes. Para eso debe cumplirse que mensaje[enviador] == vector&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Dinámica de sistemas</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Thu, 25 Jun 2020 16:02:23 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/dinamica-de-sistemas-3kgl</link>
      <guid>https://dev.to/martinnacimiento/dinamica-de-sistemas-3kgl</guid>
      <description>&lt;h1&gt;
  
  
  Variantes de la simulación 🤔
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Juegos operacionales&lt;/li&gt;
&lt;li&gt;Cadenas de Markov&lt;/li&gt;
&lt;li&gt;Simulación de sistemas

&lt;ul&gt;
&lt;li&gt;Método analítico

&lt;ul&gt;
&lt;li&gt;Método Montecarlo - Marcas de clase - números indices&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dinámica de sistemas&lt;/strong&gt; ⬅️&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Dinámica de sistemas 📖
&lt;/h1&gt;

&lt;p&gt;Es una &lt;strong&gt;metodología&lt;/strong&gt; para analizar y modelar el comportamiento temporal en entornos complejos.&lt;/p&gt;

&lt;p&gt;Se basa en la identificación de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;los bucles de realimentación entre los elementos 🔁&lt;/li&gt;
&lt;li&gt;las demoras en la información y materiales del sistema ⏳&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lo que hace diferente este enfoque de otros usados para estudiar sistemas complejos es el &lt;em&gt;análisis de los efectos de los bucles o ciclos de realimentación, en términos de flujos y depósitos adyacentes&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sus características
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Desmiembra a los sistemas hasta llegar a sus componentes elementales (del todo a las partes).&lt;/li&gt;
&lt;li&gt;La evolución de este modelo es dada por la relación de las variables independientes con otras denominadas dependientes.&lt;/li&gt;
&lt;li&gt;El objetivo básico es llegar a &lt;strong&gt;comprender las causas estructurales que provocan el comportamiento del sistema&lt;/strong&gt;. Esto implica aumentar el conocimiento sobre el papel de cada elemento del sistema, y a ver como diferentes acciones sobre las partes del sistema, acentúan o atenúan las tendencias del comportamiento implícitas en el mismo.&lt;/li&gt;
&lt;li&gt;A diferencia de otra metodologías no pretende predecir detalladamente el comportamiento futuro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta metodología permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identificar el problema.&lt;/li&gt;
&lt;li&gt;Desarrollar hipótesis dinámicas que explican las causas del problema.&lt;/li&gt;
&lt;li&gt;Construir un modelo de simulación del sistema que permita analizar la raíz del problema.&lt;/li&gt;
&lt;li&gt;Verificar que el modelo reproduce de forma satisfactoria el comportamiento observado en la realidad.&lt;/li&gt;
&lt;li&gt;Probar en el modelo las diferentes alternativas o políticas que solucionan el problema, e implementar la mejor solución.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Definición de dinámica de sistemas 💡
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Es una metodología de uso generalizado para modelar y estudiar el &lt;strong&gt;comportamiento de cualquier clase de sistema a través del tiempo&lt;/strong&gt;.&lt;br&gt;
Es  una herramienta para construir modelos de simulación basada en el estudio de las relaciones causales que existen entre las partes del sistema, para tomar decisiones en entornos complejos. Utiliza 2 tipos de diagramas, los &lt;strong&gt;Diagramas causales&lt;/strong&gt; y &lt;strong&gt;Diagramas de Forrester&lt;/strong&gt;. No tiene por objetivo predecir futuro de entorno que no se pueden modificar, sino que el objetivo es &lt;strong&gt;ayudar a tomar decisiones para solucionar un problema&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Diagramas
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Diagrama causal 🧍
&lt;/h2&gt;

&lt;p&gt;Es la &lt;strong&gt;representación gráfica de los elementos que influyen en un problema&lt;/strong&gt; y de las relaciones que existen entre ellos. Este diagrama nos permite &lt;strong&gt;identificar los feedbacks&lt;/strong&gt; que pueden dar estabilidad al sistema y también aquellos otros que pueden ser la palanca que nos permitirá transformarlo de una forma eficiente y radical. Es en general un &lt;strong&gt;paso previo a la construcción de un Diagrama de Forrester&lt;/strong&gt; y también son de utilidad al final del proceso de simulación ya que nos permiten explicar con mucha claridad nuestras conclusiones a una persona que no conozca nada de esta herramienta. El Diagrama Causal tiene pues una doble utilidad, al principio del estudio nos sirve para organizar los elementos que influyen en el problema, y al final del estudio nos sirve para explicar mejor las conclusiones y las recomendaciones a nuestro cliente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relaciones
&lt;/h3&gt;

&lt;p&gt;Las relaciones son sirven para representar causa y efecto entre las variables. Tenemos relaciones de 2 tipos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RELACIÓN CAUSAL&lt;/strong&gt;: Aquella en la que un elemento A determina a otro B, con relación de Causa a Efecto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RELACIÓN CORRELATIVA&lt;/strong&gt;: Existencia de una correlación entre dos elementos del sistema, sin existir entre ellos una relación Causa- relación Causa-Efecto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bucles
&lt;/h3&gt;

&lt;p&gt;A partir de las relaciones, es posible armar bucles de realimantación. Tenemos de 2 tipos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BUCLES DE REALIMETACIÓN POSITIVA&lt;/strong&gt;: Son aquellos en los que la variación de un elemento se propaga a lo largo del bucle de manera que refuerza la variación inicial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BUCLES DE REALIMETACIÓN NEGATIVA&lt;/strong&gt;: Son aquellos en los que la variación de un elemento se propaga a lo largo del bucle de manera que contrarreste la variación inicial. Tiende a crear equilibrio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Diagrama de Forrester 💻
&lt;/h2&gt;

&lt;p&gt;El diagrama de Forrester sirve para &lt;strong&gt;simular el modelo en el PC&lt;/strong&gt;, permite comprobar la coherencia de nuestras hipótesis, analizar el comportamiento del sistema, y por último simular diferentes políticas, de forma que los resultados que muestra el modelo ayudan a resolver mejor el problema que estamos analizando.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de variable del diagrama Forrester
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niveles&lt;/strong&gt;: son acumulaciones o variables de estado. Cambian en función de las variables de flujo y a veces por los auxiliares.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flujos&lt;/strong&gt;: hacen crecer o disminuir las variables de nivel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auxiliares&lt;/strong&gt;: son cálculos auxiliares que aclaran los pasos que llevan a cabo para dar como resultado en la variables de nivel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constantes&lt;/strong&gt;: valores que no se modifican con el tiempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flechas&lt;/strong&gt;: relacionan variables y representan causalidad entre si. Tenemos de 2 tipos:

&lt;ul&gt;
&lt;li&gt;Flecha normal o flujo de información: consiste en el paso de un valor a través de variables.&lt;/li&gt;
&lt;li&gt;Flecha especial o flujo de materiales: consiste en el paso de un valor que modifica a una variable de nivel. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Proceso de traducción</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Mon, 22 Jun 2020 00:49:29 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/proceso-de-traduccion-29kl</link>
      <guid>https://dev.to/martinnacimiento/proceso-de-traduccion-29kl</guid>
      <description>&lt;p&gt;Me encanta dejar el tema que me gusto en el día y con el que escucho mientras voy escribiendo, así que hoy les dejo:&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/track/3pm4XtcsRIFFtH2UErk62R" width="100%" height="80px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgjabqbmlc50wbj61cbnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgjabqbmlc50wbj61cbnv.png" alt="Proceso de traducción" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Analizador léxico 🚩
&lt;/h1&gt;

&lt;p&gt;Es genial empezar por entender que significa &lt;em&gt;léxico&lt;/em&gt; para poder entender que hace este analizador léxico. Así que busque por &lt;a href="https://definicion.de/lexico/" rel="noopener noreferrer"&gt;Internet&lt;/a&gt; y dice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Léxico es el &lt;strong&gt;vocabulario&lt;/strong&gt; de un idioma o de una región, el &lt;strong&gt;diccionario&lt;/strong&gt; de una lengua.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bien esto esto ya empieza a tener sentido, &lt;em&gt;léxico de un idioma&lt;/em&gt;, es decir, el idioma en nuestro área se traduce a &lt;strong&gt;lenguaje de programación&lt;/strong&gt;. Un programa o un código fuente esta escrito mediante un lenguaje de este tipo, para luego el cual después de un proceso de traducción una computadora pueda entender y ejecutar estas instrucciones, pero tranquilos, estamos en el primer paso del proceso, falta para eso.&lt;/p&gt;

&lt;p&gt;Entonces podemos decir:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;El &lt;strong&gt;analizador léxico&lt;/strong&gt; es la primera fase de un compilador, consiste en un programa que recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de &lt;strong&gt;tokens&lt;/strong&gt; (componentes léxicos) o símbolos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Buenísimo el concepto! Lo saque de &lt;a href="https://es.wikipedia.org/wiki/Analizador_l%C3%A9xico#:~:text=Un%20analizador%20l%C3%A9xico%20o%20analizador,(componentes%20l%C3%A9xicos)%20o%20s%C3%ADmbolos." rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt; por si quieren leer mas.&lt;/p&gt;

&lt;p&gt;Estos tokens sirven para el posterior fase del proceso de traducción, siendo la entrada para el &lt;em&gt;analizador sintáctico&lt;/em&gt;.&lt;br&gt;
Los &lt;strong&gt;tokens&lt;/strong&gt; del lenguaje de programación consisten en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Palabras reservadas&lt;/li&gt;
&lt;li&gt;Literales o constantes&lt;/li&gt;
&lt;li&gt;Símbolos especiales&lt;/li&gt;
&lt;li&gt;Identificadores&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Como lo hace?
&lt;/h2&gt;

&lt;p&gt;Buenísimo el concepto, todo lindo todo lindo, pero, COMO FUNCIONA CAPO?&lt;/p&gt;

&lt;p&gt;Saber como funciona es clave para la construcción de un analizador léxico, por eso, tenemos que saber los siguiente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La &lt;em&gt;especificación de un lenguaje de programación&lt;/em&gt; a menudo incluye un conjunto de &lt;em&gt;reglas&lt;/em&gt; que definen el léxico. Estas reglas consiste comúnmente en &lt;strong&gt;expresiones regulares&lt;/strong&gt; que indican un conjunto de posibles secuencias de caracteres que definen un token.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://es.wikipedia.org/wiki/Analizador_l%C3%A9xico" rel="noopener noreferrer"&gt;Made in Wikipedia&lt;/a&gt; papa! Si, hay que saber de expresiones regulares para poder hacer un analizador léxico.&lt;/p&gt;

&lt;p&gt;Si bien no te dije exactamente como funciona, te doy lo que esta involucrado en ese funcionamiento. Al momento que lees el post, yo me encuentro haciendo este apunte, próximo aplicar luego todo el conocimiento en una practica, así que estoy en deuda en eso para cuando sepa aplicarlo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Mecanismos
&lt;/h2&gt;

&lt;p&gt;Hay tres mecanismos básicos para construir un&lt;br&gt;
analizador lexicográfico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ad hoc&lt;/li&gt;
&lt;li&gt;Mediante la implementación manual de los
&lt;a href="https://es.wikipedia.org/wiki/Aut%C3%B3mata_finito#:~:text=Un%20aut%C3%B3mata%20finito%20(AF)%20o,un%20conjunto%20de%20estados%20finales." rel="noopener noreferrer"&gt;autómatas finitos&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mediante un &lt;a href="http://cogeeldineroycorre.blogspot.com/2007/05/metacompiladores.html#:~:text=Un%20metacompilador%20es%20un%20compilador,reconoce%20cualquier%20sentencia%20del%20lenguaje." rel="noopener noreferrer"&gt;metacompilador&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Analizador sintáctico 🚩
&lt;/h1&gt;

&lt;p&gt;Como hicimos con la palabra &lt;em&gt;léxico&lt;/em&gt; antes, vamos a entender la palabra &lt;em&gt;sintáctico&lt;/em&gt;, o mas bien, &lt;a href="https://definicion.de/sintaxis/" rel="noopener noreferrer"&gt;sintaxis&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La &lt;strong&gt;sintaxis&lt;/strong&gt; se entiende como el grupo de normas que marcan las secuencias correctas de los elementos propios de un lenguaje de programación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En otras palabras, podemos pensar que hacer una análisis de sintaxis es "ordenar" los elementos propios de un lenguaje, llámese tokens en nuestro caso, de alguna forma correcta, es decir, según ciertas normas o &lt;em&gt;reglas&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Si le queremos dar una vuelta mas de rosca al concepto, buscamos formar una &lt;strong&gt;estructura&lt;/strong&gt; con todos estos tokens que recibimos siguiendo unas ciertas reglas para poder formar esta estructura, que por cierto tiene forma de &lt;strong&gt;árbol&lt;/strong&gt; 🌳.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwwgag2tzmcread65zlag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwwgag2tzmcread65zlag.png" alt="Analizador Sintáctico" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bien, vamos bien estamos bien!&lt;br&gt;
&lt;iframe src="https://open.spotify.com/embed/track/2OWVCFTolecLiGZPquvWvT" width="100%" height="80px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;En paso tenemos los tokens y queremos llegar al árbol 🌳. Pero debemos antes pasar las &lt;strong&gt;REGLAS&lt;/strong&gt;!. Las reglas son la cosa mas inentendible que podrás ver al principio, pero cuando las entendes sos vos! Así que te voy a explicar como se leen y aplican estas reglas. Estas reglas son la que de alguna forma van a ir ordenando los tokens en una estructura de árbol, la primera pregunta que podemos hacer es,como escribimos estas reglas? Podemos usar otra otra palabra un poco mas formal para la ocasión, el lugar de escribir, digamos &lt;strong&gt;especificar&lt;/strong&gt;, bien! Tiene que haber una forma de especificar estas reglas, pues si! Se llama &lt;strong&gt;Gramática libre de contexto&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gramática de libre contexto
&lt;/h2&gt;

&lt;p&gt;Gramática de libre contexto? Si yo también me pregunte lo mismo, en que momento pasamos de estudiar informática a lengua. Pero todo tiene su explicación, y acá desde mi punto de vista personal te doy la mía. Estamos estudiando el proceso de traducción de un &lt;strong&gt;lenguaje de programación&lt;/strong&gt;, como tal, seria un &lt;a href="https://es.wikipedia.org/wiki/Lenguaje" rel="noopener noreferrer"&gt;lenguaje&lt;/a&gt;, pero uno &lt;a href="https://es.wikipedia.org/wiki/Lenguaje_formal#Especificaci%C3%B3n_de_lenguajes_formales" rel="noopener noreferrer"&gt;formal&lt;/a&gt;, en la cual estos para su construcción se definen un conjunto de reglas gramaticales que pueden ser de &lt;a href="https://es.wikipedia.org/wiki/Gram%C3%A1tica_libre_de_contexto#:~:text=En%20ling%C3%BC%C3%ADstica%20e%20inform%C3%A1tica%2C%20una,terminales%20y%2Fo%20no%20terminales." rel="noopener noreferrer"&gt;libre contexto&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por si no fue suficiente mi explicación, deje los links de cada tema. Pero en fin, la idea no es estudiar lengua, la idea acá es conocer como se especifican esas reglas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh0i8kh7f3iiapkk23y5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh0i8kh7f3iiapkk23y5e.png" alt="Especificación de reglas" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se ve en la imagen, hay una etiquetas que representan conceptos, es lo que voy a explicar ahora desde mis palabras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No terminal&lt;/strong&gt;: La primera parte (la izquierda a la flecha) encontramos el no terminal, que básicamente, es como una variable con identificador, es decir, su nombre involucra lo que hay a la derecha de la flecha cuando se lo invoca. También se lo ve a la derecha, este puede ser otra regla o la misma, ya que estas reglas pueden ser &lt;strong&gt;recursivas&lt;/strong&gt;, su nombre deberíamos reemplazar con su correspondiente "parte derecha".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal&lt;/strong&gt;: El terminal es básicamente el token o un valor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Producción&lt;/strong&gt;: Una producción es cada regla gramatical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora te estarás preguntando por que se llaman terminales y no terminales. En pocas palabras, eso es porque justamente al no terminal lo debemos reemplazar por su parte derecha, hasta que nos queden solo terminales y no podamos ir haciendo reemplazos (por eso se llaman terminales, porque la terminan), este proceso de ir reemplazando se llama &lt;strong&gt;Derivaciones&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pero antes de hablar de derivaciones, terminemos esto con unos conceptos mas. Cuando armemos reglas o producciones, existen unos símbolos especiales.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcfzixtj6yy0r89hgc2f1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcfzixtj6yy0r89hgc2f1.png" alt="Símbolos de las reglas" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y por ultimo las producciones se pueden escribir de otra manera, utilizando la &lt;a href="https://es.wikipedia.org/wiki/Notaci%C3%B3n_de_Backus-Naur" rel="noopener noreferrer"&gt;notación de Backus-Naur&lt;/a&gt; (BNF). BNF es un sistema de reglas de derivación, escrito como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;simbolo&amp;gt; ::= &amp;lt;expresión con símbolos&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Derivaciones
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrxnzlvnfcofi5fyr4k9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrxnzlvnfcofi5fyr4k9.jpg" alt="Continuara" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>teoriadelacomputacion</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Algoritmos de sincronización de relojes</title>
      <dc:creator>Tincho</dc:creator>
      <pubDate>Sun, 31 May 2020 20:14:06 +0000</pubDate>
      <link>https://dev.to/martinnacimiento/algoritmos-de-sincronizacion-de-relojes-56e8</link>
      <guid>https://dev.to/martinnacimiento/algoritmos-de-sincronizacion-de-relojes-56e8</guid>
      <description>&lt;p&gt;Tema recomendado para la lectura:&lt;br&gt;
&lt;iframe width="100%" height="80px" src="https://open.spotify.com/embed/track/37b2LyzvKZduFJd8GmJhJW?si=AXe92xDlQ9qdne3xBiJAAQ%20"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Introducción
&lt;/h1&gt;

&lt;p&gt;La sincronización de relojes en un sistema distribuido consiste en garantizar que los procesos se ejecuten de forma cronológica y a la misma vez respetar el orden de los eventos dentro del sistema.&lt;/p&gt;

&lt;p&gt;Existen 2 tipos de relojes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Físicos: relacionado con el tiempo real.&lt;/li&gt;
&lt;li&gt;Lógicos. lo importante es el &lt;strong&gt;orden&lt;/strong&gt; de los eventos, no en el tiempo que ocurren.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dentro de los relojes físicos encontramos 2 tipos de sincronizacion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Externa: los relojes se sincronizan con una fuente de tiempo externa fiable.&lt;/li&gt;
&lt;li&gt;Interna: los relojes no se sincronizan con una fuente de tiempo externa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Algoritmos
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Cristian
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Para relojes físicos con sincronizacion externa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El algoritmo de Cristian es un método, dentro de la computación distribuida, para la sincronizacion de relojes. Consiste en un servidor conectado a una fuente de UTC y unos clientes que se sincronizan con dicho servidor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Funcionamiento
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Un proceso &lt;em&gt;p&lt;/em&gt; hace una petición de tiempo al servidor en un mensaje &lt;em&gt;mr&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Al momento de enviar la peticion guarda una marca tiempo Tr de ese momento.&lt;/li&gt;
&lt;li&gt;El servidor responde con un mensaje &lt;em&gt;mt&lt;/em&gt; en el que incluye su tiempo &lt;em&gt;Tutc&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;El proceso que recibe el mensaje &lt;em&gt;mt&lt;/em&gt; guarda la marca de tiempo de llegada Tt.&lt;/li&gt;
&lt;li&gt;El proceso debe hacer una estimación previa a actualizar su reloj, debido al tiempo de transmisión del mensaje por la red. &lt;em&gt;Tutc + RTT/2 = Tcliente, donde RTT= (Tt - Tr)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;El proceso &lt;em&gt;p&lt;/em&gt; actualiza su reloj con &lt;em&gt;Tcliente&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1AAxn8un--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/3/35/Algoritmo_cristian.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1AAxn8un--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/3/35/Algoritmo_cristian.jpg" alt="Diagrama del Algoritmo de cristian"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inconvenientes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Presenta la posibilidad de fallo debido a la existencia de un único servidor. Cristian sugiere múltiples servidores de tiempo sincronizados que suministren el tiempo. El cliente envía a un mensaje de petición a todos los servidores y toma la primera respuesta recibida.&lt;/li&gt;
&lt;li&gt;El algoritmo no contempla problemas de mal funcionamiento o fraude por parte del servidor.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Berkeley
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Para relojes físicos con sincronizacion interna.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se creo para entornos en los cuales no se tienen fuentes de tiempo UTC, gracias a este algoritmo los relojes del entorno puedan mantenerse sincronizados de igual manera. Es un algoritmo centralizado, ya que el servidor se va a elegir entre todos los nodos del entorno, así quedando un &lt;strong&gt;maestro&lt;/strong&gt; y resto serán todos &lt;strong&gt;esclavos&lt;/strong&gt;. La esencia del algoritmo es que el maestro solicita a los esclavos su hora periódicamente para así poder obtener la &lt;strong&gt;diferencia promedio&lt;/strong&gt; entre todas las horas (incluyendo la propia hora del maestro), así el maestro envía esa diferencia promedio a todos los esclavos, y todos incluido el maestro actualizan sus horas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7z2ux81b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/2/27/AlgBerkeley.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7z2ux81b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/2/27/AlgBerkeley.jpg" alt="Diagrama del algoritmo de Berkeley"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Funcionamiento
&lt;/h3&gt;

&lt;p&gt;Depende del libro o la fuente en donde aprende este algoritmo puede variar si el coordinador de tiempo es quien obtiene la diferencia individual entre su hora con cada esclavo o si el cliente ya le da la diferencia, de igual manera, al final resulta ser lo mismo, en el algoritmo hay un &lt;strong&gt;coordinador activo&lt;/strong&gt; que solicita las horas para actualizarlas, no como en el método de Cristian que el coordinar o coordinadores son pasivos. En los pasos yo opte por que el cliente pase la diferencia. Ahí vamos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Coordinador solicita el tiempo de los esclavos pasando su propio tiempo &lt;em&gt;Tmaestro&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Los esclavos devuelven la diferencia entre el tiempo del maestro &lt;em&gt;Tmaestro&lt;/em&gt; recibido en el mensaje y su tiempo &lt;em&gt;Ten&lt;/em&gt; (Tiempo de esclavo &lt;em&gt;n&lt;/em&gt;). Es como decir "estoy así de lejos de ti coordinador". La formula seria &lt;em&gt;DEn = Tmaestro - Ten&lt;/em&gt;, donde &lt;em&gt;DTn&lt;/em&gt; significa Diferencia de Tiempo &lt;em&gt;n&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;El coordinador recibe todas las &lt;em&gt;DTn&lt;/em&gt; y tiene su propia diferencia de tiempo también que es 0, ya que el participa en la operación. &lt;/li&gt;
&lt;li&gt;El coordinador hace un promedio con todas las diferencias de tiempo y obtiene la &lt;strong&gt;diferencia de tiempo promedio&lt;/strong&gt; &lt;em&gt;DTP&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;El coordinador recuerda esta &lt;em&gt;DTP&lt;/em&gt; y se las envía a los esclavos. Y ahora todos realizan la siguiente formula para actualizar sus relojes &lt;em&gt;RELOJnuevo = [DTn + (DTP)] + RELOJactual&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Recordar que para las operaciones las variables son tiempo, hay que respetar sus unidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inconvenientes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;En caso de que el maestro falle, dejará de preguntar la hora y, en consecuencia, se perderá la sincronización.&lt;/li&gt;
&lt;li&gt;En el paso de mensajes entre maestro y esclavos y viceversa se ha de tener en cuenta el retraso que genera el propio envío de los mensajes por lo que tendremos errores a la hora de sincronizar.&lt;/li&gt;
&lt;li&gt;Otro de los problemas de ser un algoritmo centralizado será el de tener que elegir un nuevo maestro debido a que se puedan producir fallos en el tratamiento de los datos para llevar a a cabo la sincronización, buscando un maestro que cometa menor cantidad de fallos y el sistema se mantenga en correcto funcionamiento.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Protocolo de tiempo de red
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Para relojes físicos con sincronizacion externa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Network Time Protocol (NTP) es un protocolo de Internet para sincronizar los relojes de los sistemas informáticos a través del enrutamiento de paquetes en redes con latencia variable. NTP utiliza UDP como su capa de transporte, usando el puerto 123. Está diseñado para resistir los efectos de la latencia variable. Es principalmente utilizado sobre Internet a diferencia de Cristian y Berkeley que usan mas a menudo en intranets.&lt;/p&gt;

&lt;p&gt;Los objetivos y características de diseno de NTP son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proporcionar un servicio habilitando a los clientes a través de Internet ser sincronizados precisamente a UTC.&lt;/li&gt;
&lt;li&gt;Para proporcionar un servicio confiable que pueda sobrevivir a largas pérdidas de conectividad.&lt;/li&gt;
&lt;li&gt;Para permitir que los clientes se vuelvan a sincronizar con la frecuencia suficiente para compensar las tasas de deriva que se encuentran en la mayoría de las computadoras.&lt;/li&gt;
&lt;li&gt;Para proporcionar protección contra interferencias con el servicio horario, ya sea malicioso o accidental.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El servicio NTP es proporcionado por una &lt;strong&gt;red de servidores&lt;/strong&gt; ubicados en internet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los &lt;strong&gt;servidores primarios&lt;/strong&gt;: conectados directamente a la fuente de tiempo UTC.&lt;/li&gt;
&lt;li&gt;Los &lt;strong&gt;servidores secundarios&lt;/strong&gt;: son sincronizados, en ultima instancia, con los primarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos servidores son conectados es una jerarquía lógica llamada &lt;strong&gt;subred de sincronizacion&lt;/strong&gt;. Cuyos niveles se llaman &lt;strong&gt;estratos&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los relojes UTC están en el estrato 0.&lt;/li&gt;
&lt;li&gt;Los servidores primarios ocupan el estrato 1. Son la raíz.&lt;/li&gt;
&lt;li&gt;Los servidores secundarios ocupan el estrato 2. Y son sincronizados con los primarios.&lt;/li&gt;
&lt;li&gt;Los servidores que ocupan el estrato 3 se sincronizan con los del estrato 2.&lt;/li&gt;
&lt;li&gt;Y así hasta el estrato &lt;em&gt;n&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Los servidores de nivel más bajo (hoja) se ejecutan en las estaciones de trabajo de los usuarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dlys482D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ifpu2o1r92lstxri02hz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dlys482D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ifpu2o1r92lstxri02hz.png" alt="Estratos de la jerarquía"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lamport
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Para relojes lógicos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para sincronizar relojes lógicos, Lamport definió una relación llamada &lt;strong&gt;ocurrencia anterior&lt;/strong&gt;. La expresión &lt;em&gt;a -&amp;gt; b&lt;/em&gt; se lee como "a ocurre antes que b". Esta relación de ocurrencia puede verse en 2 situaciones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Si a y b son eventos del mismo proceso, y a ocurre antes que b, entonces a -&amp;gt; b es verdadera.&lt;/li&gt;
&lt;li&gt;Si a es el evento en el que un proceso envía un mensaje, y b es el evento de recepción del mensaje por otro proceso, entonces a-&amp;gt;b también es verdadero.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2 conceptos importantes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;La ocurrencia anterior es una relación &lt;strong&gt;transitiva&lt;/strong&gt;, por lo que si a-&amp;gt;b y b-&amp;gt;c, entonces a-&amp;gt;c.&lt;/li&gt;
&lt;li&gt;Si 2 eventos &lt;em&gt;x&lt;/em&gt; y &lt;em&gt;y&lt;/em&gt; ocurren en 2 procesos diferentes que no intercambian mensajes (ni siquiera indirectamente), entonces x-&amp;gt;y no es verdadera, ni tampoco y-&amp;gt;x, entonces se dice que estos eventos son &lt;strong&gt;concurrentes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Las reglas del algoritmo
&lt;/h3&gt;

&lt;p&gt;Lo que se necesita es una manera de medir la noción de tiempo del tal forma que a cada evento &lt;em&gt;a&lt;/em&gt; podemos asignarle un valor de tiempo C(a) en el que todos los procesos coincidan. Estos valores de tiempo deben tener la propiedad de que si &lt;em&gt;a-&amp;gt;b&lt;/em&gt;, entonces &lt;em&gt;C(a) &amp;lt; C(b)&lt;/em&gt;.&lt;br&gt;
Ademas, el tiempo de reloj &lt;em&gt;C&lt;/em&gt; solo incrementa, nunca disminuye. Solo es posible hacer correcciones agregando un valor positivo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Funcionamiento
&lt;/h3&gt;

&lt;p&gt;Consiste en dos momentos, cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;envía un evento&lt;/strong&gt;: el proceso debe incrementar su reloj y enviar su tiempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;recepción de evento&lt;/strong&gt;: el proceso debe comparar entre su tiempo actual y el que recibió, al máximo entre ellos incrementarlo y tomarlo como su nuevo tiempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MNGBogNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rnwxsfv2tm97x2oye0u8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MNGBogNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rnwxsfv2tm97x2oye0u8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Vectorial
&lt;/h2&gt;

&lt;p&gt;Lamport dio una buena solución, pero no es la bala de plata, la &lt;strong&gt;ocurrencia anterior&lt;/strong&gt; no asegura que siempre &lt;em&gt;a -&amp;gt; b&lt;/em&gt;, miremos el siguiente ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pt4B-Ave--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bhbj3fieotdqrwpb2rrz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pt4B-Ave--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bhbj3fieotdqrwpb2rrz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas allá del orden de las flechas y los numeros, &lt;em&gt;m1&lt;/em&gt; y &lt;em&gt;m2&lt;/em&gt;, con el algoritmo de Lamport usted que dice, &lt;em&gt;m1-&amp;gt;m2&lt;/em&gt; o &lt;em&gt;m2-&amp;gt;m1&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;El problema de los relojes de Lamport es que no capturan la &lt;strong&gt;causalidad&lt;/strong&gt;. Esta causalidad si puede ser capturada por los &lt;strong&gt;relojes vectoriales&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  En que consisten?
&lt;/h3&gt;

&lt;p&gt;Consiste en que cada proceso tiene un contador o reloj de tiempo vectorial de cada proceso en el sistema. Es decir si tenemos 3 procesos, cada proceso tendrá un reloj vectorial con 3 posiciones, así cada uno sabe del orden de eventos del otro.&lt;/p&gt;
&lt;h3&gt;
  
  
  Funcionamiento
&lt;/h3&gt;

&lt;p&gt;Consiste en dos momentos, cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;envía un evento&lt;/strong&gt;: el proceso debe incrementar su &lt;strong&gt;propio&lt;/strong&gt; reloj y enviar el reloj vectorial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;recepción de evento&lt;/strong&gt;: el proceso debe comparar entre los tiempo actuales con los tiempos que recibió (menos al suyo), al máximo entre ellos dejarlo en su reloj vectorial. Su tiempo solamente debe incrementarlo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IxV4bH1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pwhf9on6y6tvgt0b8imn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IxV4bH1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pwhf9on6y6tvgt0b8imn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora un buen tema y a relajar!&lt;br&gt;
&lt;iframe width="100%" height="80px" src="https://open.spotify.com/embed/track/7egTI2GzyznKpRVWbtvlEd%20"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>sistemasdistribuidos</category>
      <category>distributedsystems</category>
      <category>lamport</category>
      <category>sincronizaciondetiempo</category>
    </item>
  </channel>
</rss>
