<?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: Michel Novellino</title>
    <description>The latest articles on DEV Community by Michel Novellino (@michelnovellino).</description>
    <link>https://dev.to/michelnovellino</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%2F381691%2F503b560c-fc38-4056-91e3-2c17f856b25a.jpg</url>
      <title>DEV Community: Michel Novellino</title>
      <link>https://dev.to/michelnovellino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/michelnovellino"/>
    <language>en</language>
    <item>
      <title>El Examen Final de la Humanidad (HLE)</title>
      <dc:creator>Michel Novellino</dc:creator>
      <pubDate>Wed, 16 Jul 2025 18:59:30 +0000</pubDate>
      <link>https://dev.to/michelnovellino/el-examen-final-de-la-humanidad-hle-55ki</link>
      <guid>https://dev.to/michelnovellino/el-examen-final-de-la-humanidad-hle-55ki</guid>
      <description>&lt;p&gt;A medida que los modelos como GPT-4 comenzaron a mostrar capacidades que superaban con creces las pruebas existentes, la comunidad de IA se enfrentó a un problema: Los benchmarks tradicionales, que durante años habían servido para puntuar y comparar modelos, estaban siendo sistemáticamente demolidos.&lt;/p&gt;

&lt;p&gt;Los benchmarks de IA, como el popular &lt;a href="https://paperswithcode.com/dataset/mmlu" rel="noopener noreferrer"&gt;MMLU (Massive Multitask Language Understanding)&lt;/a&gt;, estaban alcanzando un punto de "saturación". Los modelos más avanzados, como las versiones preliminares del modelo "o1" de OpenAI, simplemente destruyeron los benchmarks de razonamiento más populares. Esto significaba que ya no podíamos diferenciar realmente entre un modelo muy bueno y uno verdaderamente excepcional, porque a decir verdad para el uso cotidiano convenciional funcionaban exactamente igual, se necesitaba urgentemente una prueba más difícil, una que pudiera medir las capacidades en la verdadera "frontera" del conocimiento humano.&lt;/p&gt;

&lt;p&gt;Entonces, Dan Hendrycks, director del &lt;a href="https://safe.ai/" rel="noopener noreferrer"&gt;Center for AI Safety (CAIS)&lt;/a&gt; que segun sus propias palabras buscan reducir los riesgos a escala social derivados de la inteligencia artificial., Y el polémico Elon Musk, padre de mechahitler (grok 4), Llegaron a la conclusión de que los test existentes incluido el MMLU que el propio Hendrycks había co-diseñado, eran demasiado fáciles para los modelos frontera modernos. Inspirado por este desafío, Hendrycks se asoció con la startup Scale AI para crear algo mucho: el &lt;a href="https://agi.safe.ai/" rel="noopener noreferrer"&gt;"Humanity's Last Exam"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;El HLE no es un examen cualquiera. es un benchmark multimodal compuesto por entre 2,500 y 3,000 preguntas que se sitúan en la frontera del conocimiento humano, diseñado explícitamente para ser el examen académico final de su tipo. Cuyo objetivo es evaluar si los sistemas de IA pueden alcanzar un razonamiento y manejar conocimiento a nivel de expertos de clase mundial, Por lo cual, Liderados por el CAIS y Scale AI, Se invito a la crema y nata de los expertos del mundo, Incluyendo investigadores de instituciones de élite como el MIT, UC Berkeley y Stanford para proponer las preguntas más difíciles de sus respectivos campos, Excluyendo preguntas relacionadas con el desarrollo de armamento (químico, biológico, nuclear, etc.).&lt;/p&gt;

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

&lt;p&gt;Para que te hagas una idea de la complejidad del HLE, aquí tienes algunos ejemplos de las preguntas que contiene. Es muy probable que, te sientas abrumado solo al leerlas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Biología (Ecología):&lt;/strong&gt; "Los colibríes, dentro de los Apodiformes, tienen de forma única un hueso ovalado pareado bilateralmente, un sesamoideo incrustado en la porción caudolateral de la aponeurosis cruciada expandida de inserción del m. depressor caudae. ¿Cuántos tendones pareados son soportados por este hueso sesamoideo? Responda con un número.".   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Química Orgánica:&lt;/strong&gt; "La reacción mostrada es una cascada pericíclica térmica que convierte el heptaeno de partida en el éster metílico del ácido endiándrico B. La cascada implica tres pasos: dos electrociclizaciones seguidas de una cicloadición. ¿Qué tipos de electrociclizaciones están involucradas en el paso 1 y 2, y qué tipo de cicloadición está involucrada en el paso 3?".   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7j1tf632qq7u7vvh3ms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7j1tf632qq7u7vvh3ms.png" alt="Reacción química" width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Humanidades (Estudios Bíblicos):&lt;/strong&gt; "Le proporciono el texto fuente estandarizado del hebreo bíblico... (Salmos 104:7). Su tarea es distinguir entre sílabas cerradas y abiertas. Por favor, identifique y enumere todas las sílabas cerradas (que terminan en un sonido de consonante) basándose en la investigación más reciente sobre la tradición de pronunciación tiberiana del hebreo bíblico por eruditos como Geoffrey Khan.".&lt;/p&gt;

&lt;p&gt;Pero, !sorpresa!, Grok 4 heavy ya es capaz de alcanzar el 44% de puntacion correcta en el examen, a solo un año de que el modelo de frontera mas grande del momento de openAI no fuera capaz de alcanzar el 3%&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo42ewntzxqof5f0n8ncx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo42ewntzxqof5f0n8ncx.png" alt="Grok 4 heavy alcanzando 50% en el HLE" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El nombre dramático del examen no es una exageración. Superar el HLE significaría que un sistema de IA ha alcanzado un nivel de razonamiento y conocimiento comparable al de los mayores expertos humanos en una vasta gama de disciplinas. Sería un hito monumental. Si una IA puede responder correctamente a estas preguntas, es muy probable que haya alcanzado o incluso superado las capacidades cognitivas e intelectuales generales de un ser humano. Este momento plantearía "profundas cuestiones éticas, sociales y prácticas" sobre nuestro papel en un mundo donde ya no somos la especie más inteligente.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
      <category>ai</category>
      <category>learning</category>
    </item>
    <item>
      <title>La inteligencia artificial general como problema: Anatomía de las "Primeras Chispas"</title>
      <dc:creator>Michel Novellino</dc:creator>
      <pubDate>Mon, 14 Jul 2025 16:59:32 +0000</pubDate>
      <link>https://dev.to/michelnovellino/la-inteligencia-artificial-general-como-problema-anatomia-de-las-primeras-chispas-4h4h</link>
      <guid>https://dev.to/michelnovellino/la-inteligencia-artificial-general-como-problema-anatomia-de-las-primeras-chispas-4h4h</guid>
      <description>&lt;p&gt;El vertiginoso avance de la inteligencia artificial ha generado tanto fascinación como una creciente sensación de inquietud. En 2023, cuando la comunidad de desarrolladores apenas comenzaba a asimilar el impacto de los Modelos de Lenguaje Grandes (LLMs), un lanzamiento de Microsoft redefinió el debate. No se trataba de un nuevo producto ni del windows 12 pro-max, sino de algo de parte de Microsoft research: un informe de investigación que planteaba que podríamos estar presenciando las primeras "chispas" de Inteligencia Artificial General (AGI).&lt;/p&gt;

&lt;p&gt;El documento, titulado "&lt;a href="https://www.microsoft.com/en-us/research/publication/sparks-of-artificial-general-intelligence-early-experiments-with-gpt-4/" rel="noopener noreferrer"&gt;Sparks of Artificial General Intelligence: Early experiments with GPT-4&lt;/a&gt;", funcionó como el catalizador de una discusión que aún resuena en la industria. La afirmación de los investigadores fue audaz: una versión temprana y no refinada de GPT-4 ya exhibía indicios de una inteligencia que trascendía la simple predicción de texto. &lt;a href="https://www.microsoft.com/en-us/research/publication/sparks-of-artificial-general-intelligence-early-experiments-with-gpt-4/" rel="noopener noreferrer"&gt;El paper&lt;/a&gt; analiza los hallazgos de esos investigadores y por qué sus conclusiones marcaron un punto de inflexión.&lt;/p&gt;

&lt;p&gt;Antes de continuar, si, se que no es reciente, pero la verdad si es interesante y antes de escribir mas cosas sobre inteligencia artificial me gustaria empezar con esto, tambien pienso escribir sobre el "&lt;a href="https://agi.safe.ai/" rel="noopener noreferrer"&gt;Humanity Last exam&lt;/a&gt;". Pero todo a su tiempo, (me disocio y se me olvida continuar).&lt;/p&gt;

&lt;p&gt;Cuando el paper "Sparks of AGI" se publicó en 2023, desencadenó un montón de discusiones. Su afirmación central era tan provocadora como fascinante: una versión temprana de GPT-4, sin acceso a imágenes y antes de su lanzamiento público, exhibía una inteligencia más general que cualquier modelo anterior. Los investigadores no hablaban de una simple mejora incremental, sino de un salto cualitativo, el nucleo de la afirmacion era sencillo: Es más que un Loro Sofisticado.&lt;/p&gt;

&lt;p&gt;Los investigadores de Microsoft describieron su asombro, señalando que "su rendimiento es sorprendentemente cercano al rendimiento a nivel humano" y que a menudo "supera ampliamente a modelos anteriores". Esto era significativo porque el modelo lograba estos resultados sin necesidad de instrucciones de ingeniería de prompts complejas, una técnica común para optimizar el rendimiento de los LLMs. Daba la impresión de que el modelo podía "razonar" de una manera más abstracta.&lt;/p&gt;

&lt;p&gt;El cambio de paradigma observado no fue solo cuantitativo. Los modelos anteriores eran impresionantes en tareas para las que habían sido específicamente entrenados. Sin embargo, GPT-4 demostró la capacidad de generalizar su conocimiento para resolver problemas novedosos, un pilar de lo que se considera inteligencia general. El título del paper fue una declaración de intenciones y una hipótesis sobre la naturaleza de la inteligencia que estaban presenciando.&lt;/p&gt;

&lt;p&gt;Segun los psicologos, La inteligencia se define como la capacidad mental muy general que, entre otras cosas, implica la capacidad de razonar, planificar, resolver problemas, pensar de forma abstracta, comprender ideas complejas, aprender rápidamente y aprender de la experiencia,los investigadores presentaron ejemplos que demostraban estas capacidades emergentes. No se trataba de simples preguntas, sino de tareas complejas que requerían razonamiento, creatividad y síntesis de conocimiento como:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codificación y Visión Sintética:&lt;/strong&gt; Uno de los ejemplos más citados fue la capacidad de GPT-4 para generar código complejo y funcional. Por ejemplo, al pedírsele que creara un juego 3D en HTML y JavaScript, lo hizo con éxito. En otra prueba, se le dio el prompt: "Produce código Javascript que cree una imagen gráfica aleatoria que parezca una pintura de Kandinsky". El modelo generó un código que evocaba el estilo del artista, demostrando una comprensión que conectaba conceptos de arte y programación.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Razonamiento Interdisciplinario:&lt;/strong&gt; El modelo demostró una asombrosa habilidad para conectar conceptos de campos dispares, resolviendo problemas que requerían conocimientos de matemáticas, codificación y medicina dentro de una misma tarea. Esta capacidad de síntesis es lo que lo diferenció radicalmente de modelos anteriores, que operaban en silos de información.&lt;/p&gt;

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



&lt;h2&gt;
  
  
  La Dualidad de la Capacidad: Brillantez y Fragilidad
&lt;/h2&gt;

&lt;p&gt;A pesar del entusiasmo, los propios investigadores de Microsoft fueron cautelosos al señalar las limitaciones del modelo. El paper destaca que GPT-4, a pesar de sus destellos de brillantez, mostraba una "tendencia persistente a alucinar o generar información incorrecta", lo cual persiste a nuestros días, por mas que trates de hacer un "ajuste fino" en ocasiones solo nos podemos limitar a bajar la tasa de errores. Además, presentaba dificultades notables con la planificación a largo plazo y la precisión en cálculos aritméticos.&lt;/p&gt;

&lt;p&gt;Estas debilidades quedaron patentes en pruebas que requerían planificación o un razonamiento de varios pasos. Por ejemplo, al preguntarle directamente cuántos números primos hay entre 150 y 250, el modelo daba una respuesta incorrecta (13). Sin embargo, si se le pedía que primero listara todos los números primos en ese rango y luego los contara, llegaba a la respuesta correcta (18).&lt;/p&gt;

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

&lt;p&gt;Este fallo demostró que el modelo poseía el conocimiento necesario, pero carecía de lo que los investigadores describieron como un "monólogo interno" o un "borrador mental" para realizar el proceso de conteo en un solo paso. Necesitaba ser guiado explícitamente para "pensar paso a paso".&lt;/p&gt;

&lt;p&gt;La fragilidad era aún más evidente en la aritmética básica. Al enfrentarse a operaciones simples como 7 * 4 + 8 * 8, el modelo a menudo fallaba, alcanzando apenas un 58% de precisión en pruebas con números de un solo dígito. Los investigadores atribuyeron esto a una "memoria de trabajo increíblemente corta" (lo que hoy conocemos como la ventana de contexto) para este tipo de problemas. Su capacidad para planificar y ejecutar cálculos secuenciales era sorprendentemente débil, demostrando que su razonamiento, aunque a veces brillante, no se basaba en un proceso lógico robusto, sino en la predicción secuencial de la arquitectura del modelo.&lt;/p&gt;

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

&lt;p&gt;Esta dualidad —la coexistencia de un razonamiento casi humano con fallos lógicos básicos— revela la tensión fundamental en el desarrollo de la IA. La capacidad de resolver problemas (inteligencia) y la capacidad de hacerlo de manera fiable y veraz (alineación) no escalan al mismo ritmo. El hecho de que OpenAI dedicara seis meses adicionales a mejorar la seguridad del modelo después de estas observaciones es una prueba de ello. La capacidad bruta emerge primero; la seguridad debe construirse meticulosamente después. Esta brecha es, en esencia, el núcleo del problema de la seguridad en la IA y la razón por la que se necesitan nuevas y más exigentes formas de evaluación y quizá la razon de ser del &lt;a href="https://agi.safe.ai/" rel="noopener noreferrer"&gt;Humanity Last Exam&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Del cual espero poder escribir en este año y no en 3 como parece ser el ritmo en el que hago las cosas. En fin, si llegaste hasta aqui agradezco tu tiempo y espero me leas nuevamente luego, hasta la proxima.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>microsoft</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Introducción a los patrones de diseño y arquitectura de software.</title>
      <dc:creator>Michel Novellino</dc:creator>
      <pubDate>Sun, 15 Oct 2023 17:42:28 +0000</pubDate>
      <link>https://dev.to/michelnovellino/introduccion-a-los-patrones-de-diseno-y-arquitectura-de-software-a6k</link>
      <guid>https://dev.to/michelnovellino/introduccion-a-los-patrones-de-diseno-y-arquitectura-de-software-a6k</guid>
      <description>&lt;p&gt;Después de algunos años de inactividad y resolver uno que otro problema con la plataforma, he decidido volver a escribir algunos artículos sobre lo que he aprendido en este tiempo como desarrollador fullstack. Quiero, por encima de todo, abordar algunos temas teóricos que creo son interesantes y que todo software engineer debería conocer.&lt;/p&gt;

&lt;p&gt;Así es, hoy inicia una serie de artículos sobre patrones de diseño y arquitectura del software, conocimientos curiosamente desconocidos a profundidad por muchos en la industria y sobre todo por los desarrolladores que vienen de bootcamps, que, debido a la premura con la que son introducidos al mundo del desarrollo, suelen perderse de mucha información realmente útil y necesaria en sus roles.&lt;/p&gt;

&lt;p&gt;Empecemos por esta simple pregunta: &lt;strong&gt;¿Qué son los patrones de diseño?&lt;/strong&gt; Para responder a esta interrogante, debemos entender que tanto los patrones de diseño como las arquitecturas de software son principalmente las ideas que han implementado, perfeccionado y estandarizado otros desarrolladores a lo largo de los años. Son ideas para solucionar problemas comunes, sencillos y también complejos. Esto significa que algunos patrones nacen y mueren.&lt;/p&gt;

&lt;p&gt;Si me preguntan a mí directamente, diría que, a pesar de que los patrones de diseño y arquitectura están estrechamente ligados, sus diferencias básicas son las siguientes: el primero trata sobre los métodos para controlar cómo fluye la información dentro de un sistema, mientras que el segundo trata sobre "The shape of things" o la forma de las cosas, proporcionando principalmente un marco de trabajo general para cubrir las necesidades del proyecto a largo plazo. Es importante destacar que, aunque no lo sepamos, si utilizamos algún framework como Express en Node.js, estamos utilizando una gran cantidad de patrones de diseño.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Quieres realizar validaciones secuencialmente en un endpoint?
&lt;/h4&gt;

&lt;p&gt;Patrón mediator/middleware.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Quieres distribuir alguna lógica de negocio en múltiples archivos y poder exportar e importar lo que necesites de ellos?
&lt;/h4&gt;

&lt;p&gt;Patrón module.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Estás trabajando en el frontend con React y quieres compartir la data a través de componentes hijos?
&lt;/h4&gt;

&lt;p&gt;Patrón Provider.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿ Se te está haciendo complicado controlar todo el flujo de datos a través de los componentes?
&lt;/h4&gt;

&lt;p&gt;Sencillo, utiliza algún manejador de estado como Redux para resolverlo. Adivina qué, estás utilizando el Patrón Flux.&lt;/p&gt;

&lt;p&gt;Podríamos seguir indagando un buen rato para darnos cuenta de que son parte de nuestro trabajo en cada momento, estemos conscientes de ello o no. Sin embargo, conocer estos temas es sin duda una excelente ayuda para afrontar los problemas cotidianos y facilitarnos el aprendizaje de nuevas tecnologías, pues estas cambian, pero las bases son las mismas para todas.&lt;/p&gt;

&lt;p&gt;Lo mismo ocurre con el tema de la arquitectura. ¿Te imaginas hoy en día encontrarte con una API de un CRM, por ejemplo, y que todos los archivos (digamos 50, por poner una cantidad) estén en un mismo nivel de carpeta? Bueno, lamentablemente, cosas parecidas suceden aún a día de hoy porque siempre hay algún degenerado. Pero, ¿qué tal si usáramos una &lt;strong&gt;arquitectura orientada a servicios&lt;/strong&gt;?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app
├── common
│   ├── config
│   │   └── app.config.ts
│   ├── dtos
│   │   ├── user.dto.ts
│   │   └── product.dto.ts
│   └── services
│     └── logger.service.ts
├── modules
│   ├── users
│   │   ├── controllers
│   │   │   └── user.controller.ts
│   │   ├── interfaces
│   │   │   └── user.interface.ts
│   │   └── services
│   │       └── user.service.ts
│   └── products
│     ├── controllers
│     │   └── product.controller.ts
│     ├── interfaces
│     │   └── product.interface.ts
│     └── services
│         └── product.service.ts
└── main.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como se ve a simple vista, está organizado y encontrar cualquier cosa, así como entender las responsabilidades de cada uno, es mucho más sencillo ahora. Claro, al principio definir una arquitectura o un patrón puede llegar a ser tedioso y puede parecer que estamos convirtiendo el código en algo aburrido, pero a mediano y largo plazo nos estaremos ahorrando muchos dolores de cabeza a la hora de agregar nuevos features a producción.&lt;/p&gt;

&lt;h4&gt;
  
  
  Orígenes
&lt;/h4&gt;

&lt;p&gt;Segun mis investigaciones, El origen no viene exactamente de un ingeniero de software, sino de un arquitecto de entornos urbanos (y profesor universitario) llamado &lt;a href="https://es.wikipedia.org/wiki/Christopher_Alexander"&gt;Christopher Alexander&lt;/a&gt;, el cual en su libro A Pattern Lenguage, en los años 1970, Utiliza un enfoque similar a la gramática generativa para describir una serie de reglas que se aplican a un conjunto de elementos básicos para generar un diseño urbano.&lt;/p&gt;

&lt;p&gt;Por ejemplo el &lt;strong&gt;Patrón Nº18&lt;/strong&gt;: &lt;strong&gt;Learning Network&lt;/strong&gt; o "&lt;strong&gt;Red de aprendizaje&lt;/strong&gt;" describe cómo crear un entorno que facilite el aprendizaje de las personas. Alexander sostiene que el aprendizaje es más efectivo cuando ocurre en un entorno social, donde las personas pueden interactuar entre sí y compartir sus conocimientos.&lt;/p&gt;

&lt;h5&gt;
  
  
  ¿Como lo hacemos?
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Creando espacios para que las personas se reúnan y compartan ideas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ofreciendo oportunidades para que las personas trabajen juntas en proyectos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fomentando el intercambio de conocimientos y experiencias.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proporcionando acceso a recursos de aprendizaje.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creando un ambiente de apoyo y colaboración.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ya en el campo de la ingeniería de software, años después en los 90's saldría lo que para algunos es la obra fundacional de los patrones de diseño de software &lt;strong&gt;Patrones de diseño: Elementos de software orientado a objetos reutilizables&lt;/strong&gt; de rich Gamma, Richard Helm, Ralph Johnson y John Vlissides Que a decir verdad todos tienen una notable trayectoria en la industria y en su libro exponen lo que hoy en dia son patrones bastante populares y comunes como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Singleton&lt;/strong&gt;: garantiza que solo exista una instancia de una clase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Factory&lt;/strong&gt;: crea objetos de una clase concreta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adapter&lt;/strong&gt;: permite que dos clases que no son compatibles interactúen entre sí.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy&lt;/strong&gt;: proporciona una representación de un objeto real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command&lt;/strong&gt;: encapsula una solicitud como un objeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observer&lt;/strong&gt;: permite que un objeto notifique a otros objetos de cambios en su estado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strategy&lt;/strong&gt;: permite que un objeto cambie su comportamiento en tiempo de ejecución.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ¿Y la arquitectura?
&lt;/h4&gt;

&lt;p&gt;La necesidad de una buena arquitectura viene desde que existen los primeros sistemas informaticos, Tengamos en cuenta que al inicio, el bajo poder de procesamiento del hardware de la epoca hacia que los programadores tuvieran que hacer verdaderas proesas para hacer que el codigo fuese lo mas eficiente posible y a medida que los sistemas fueron haciendose mas grandes y mas complejos tambien surgia la necesidad de organizar el codigo de forma mas estructurada.&lt;/p&gt;

&lt;p&gt;Así es como nace &lt;strong&gt;Structured Programming&lt;/strong&gt; de &lt;a href="https://es.wikipedia.org/wiki/Edsger_Dijkstra"&gt;Edsger Dijkstra&lt;/a&gt;, un libro fundamental en la evolución de la ingeniería de software y cuyo autor hizo muchos aportes a la profesión hasta el punto de que actualmente hay un &lt;a href="https://es.wikipedia.org/wiki/Premio_Dijkstra"&gt;premio con su nombre&lt;/a&gt; por sus aportes a la &lt;a href="https://es.wikipedia.org/wiki/Computaci%C3%B3n_distribuida"&gt;computación distribuida&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dijkstra promovia el uso de estructuras de control simples para hacer el codigo lo mas legible y descriptible posible, aunque no como algo nuevo, promovia la modularización, al crear programas que cumplieran funciones claras y especificas y no un solo programa con toda la logica en dentro, siendo base fundamental para la creacion de lenguajes mas estructurados como c, Y ya en una opinion personal, sentando las bases del clean code.&lt;/p&gt;

&lt;p&gt;Como podran darse cuenta, son temas comunes en el dia dia como desarrolladores pero al mismo tiempo pueden llegar a ser bastante complejos y extensos, Así que, animo a todos los desarrolladores, ya sean recién llegados o experimentados, a explorar y dominar estos temas. No solo mejorarán sus habilidades técnicas, sino que también les permitirán abordar los desafíos cotidianos con confianza, Gracias por acompañarme en este primer artículo de la serie. Espero que hayas encontrado esta introducción a los patrones de diseño y la arquitectura del software útil y motivadora, Nos vemos en el próximo artículo.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>learning</category>
      <category>computerscience</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Inicio de la educación a distancia en hispano América</title>
      <dc:creator>Michel Novellino</dc:creator>
      <pubDate>Fri, 14 Aug 2020 12:42:26 +0000</pubDate>
      <link>https://dev.to/michelnovellino/inicio-de-la-educacion-a-distancia-en-hispano-america-888</link>
      <guid>https://dev.to/michelnovellino/inicio-de-la-educacion-a-distancia-en-hispano-america-888</guid>
      <description>&lt;p&gt;En Colombia se hizo hace ya varias décadas lo que fue quizá el primer experimento moderno de educación a distancia en la América hispana, bajo el marco organizativo del sistema educativo de acción cultural popular el cual era una entidad asociada a la iglesia católica.&lt;/p&gt;

&lt;p&gt;ACPO es una Fundación de la Iglesia Católica, privada y autónoma, establecida deconformidad con las leyes civiles de la República de Colombia (Resolución No. 260 del Ministerio de Justicia del 18 de octubre de 1949) y con las normas del derecho canónico(Decreto Diocesano de Tunja de 29 de junio de 1951).&lt;/p&gt;

&lt;p&gt;ACPO tiene por fin la Educación Fundamental Integral cristiana del pueblo,especialmente de los campesinos adultos, mediante cualquier sistema decomunicación, con sus elementos de acción. Sus contenidos abarcan la capacitación básica y la preparación para la vida social y económica del pueblo, a la luz de los principios cristianos, de acuerdo con las diversas condiciones, para despertar en aquél el espíritu de reflexión e iniciativa que lo motive a seguir, contando con su propio esfuerzo, en el trabajo del desarrollo personal y comunitario.&lt;/p&gt;

&lt;p&gt;(Información sacada de sus estatutos)&lt;/p&gt;

&lt;p&gt;Está iniciativa dio pie a las escuelas radiofónicas (actualmente escuelas digitales campesinas) cuya finalidad era en un principio enseñar a los campesinos sobre agricultura para mejorar la calidad de vida y la producción en el campo, con el tiempo fueron diversificando sus enseñanzas y fueron modelos para otras iniciativas en diferentes países de la región. &lt;/p&gt;

&lt;p&gt;Radio sutatenza realizó más de un millón de horas de educación radial, edito 7 millones de cartillas, 5 millones de libros y 76 millones de ejemplares de su propio periódico "el campesino", un logro increíble si hablamos de épocas anteriores al internet.&lt;/p&gt;

&lt;p&gt;La América hispana enfrenta grandes dificultades en este aspecto todavía, la falta de presupuesto aunado a la corrupción y desinterés de los gobiernos son a simple vista algunos de los principales problemas que enfrentamos.&lt;/p&gt;

&lt;p&gt;Si bien hay una cantidad importante de personas que accede a cursos en plataformas como udemy, platzi o cualquiera de los existentes la realidad es que es un porcentaje mínimo comparado a la totalidad de la población, por ejemplo en mi país Venezuela la gran mayoría de la población no conoce o no le da importancia a este tipo de educación digital, en gran parte porque el estado no hay una política real para educar más allá de abultar el número de graduados a cualquier costo aún si después no ejercen su profesión.&lt;/p&gt;

&lt;p&gt;Otro problema es la falta de "respaldo institucional"  de la educación virtual, muchos se abstienen de invertir tiempo en estos cursos fuera de las ramas de la economía digital por la falta de una regulación que otorgue un rango legal a los certificados, es decir, ¿Para que gastar tiempo y dinero en una certificación que no me van a abalar en ningún trabajo?.&lt;/p&gt;

&lt;p&gt;Es hora de internalizar el hecho de que tenemos grandes problemas pero también grandes posibilidades de resolverlos, necesitamos mas educación técnica y especializada puesto que a mediano y largo plazo cada vez mas trabajos repetitivos serán ocupados por maquinarias automatizadas. Tener consciencia de esto es esencial para evitar el desempleo a futuro y mitigar la pobreza, al mismo tiempo que darle a nuestros pequeños países la posibilidad de competir en los mercados modernos enfocándonos en el desarrollo científico-tecnológico.&lt;/p&gt;

&lt;p&gt;En la foto El sacerdote José Joaquín Salcedo uno de los pilares fundamentales del proyecto.&lt;/p&gt;

</description>
      <category>educacion</category>
      <category>opinion</category>
      <category>home</category>
    </item>
    <item>
      <title>Integra materializeCss con vuejs en 3 sencillos pasos</title>
      <dc:creator>Michel Novellino</dc:creator>
      <pubDate>Mon, 18 May 2020 17:16:10 +0000</pubDate>
      <link>https://dev.to/michelnovellino/integra-materializecss-framework-con-vuejs-en-3-sencillos-pasos-2moc</link>
      <guid>https://dev.to/michelnovellino/integra-materializecss-framework-con-vuejs-en-3-sencillos-pasos-2moc</guid>
      <description>&lt;p&gt;Asumiré que si sentiste curiosidad por el enunciado, ya tienes cierto conocimiento sobre vuejs, particularmente el primer framework para el desarrollo de sitios SPA que utilice fue angularjs pero mi favorito y el que decidí ir día a día conociendo mejor es el creado por Evan You.&lt;/p&gt;

&lt;p&gt;si bien es cierto que dentro de la comunidad de vuejs existen alternativas excelentes como vuetify o vue-material, soy de los que prefiere utilizar directamente materializeCss y es algo que resulta util para aquellos que ya tenemos experiencia con el framework y no nos interesa demasiado utilizar o aprender a utilizar vuetify (a pesar de que este en realidad me guste ) o vue-material.&lt;/p&gt;

&lt;p&gt;Dicho esto, en 3 sencillos pasos podremos empezar a maquetar al estilo material design nuestras webs con vue.&lt;/p&gt;

&lt;dl&gt;&lt;br&gt;&lt;/dl&gt;




&lt;dl&gt;&lt;br&gt;&lt;/dl&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1) instalando materializeCss desde el repositorio de npm.&lt;/strong&gt;
&lt;/h4&gt;

&lt;dl&gt;&lt;br&gt;&lt;/dl&gt;

&lt;blockquote&gt;
&lt;p&gt;npm install materialize-css@next&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;o&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;yarn add materialize-css@next&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;esto nos traerá la ultima versión del framework de css.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A partir de la versión alpha 1.0.0 materializecss se desprende de jquery ya que pasaron sus funciones a vanilla javascript lo que significa también que no tendremos que preocuparnos por conflictos con jquery dentro de vue o otro framework javascript como angular. mas que en el caso de que por alguna razon tengas una configuracion manual de webpack y pasaras por alto configurar el css-loader en las reglas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;dl&gt;&lt;br&gt;&lt;/dl&gt;

&lt;h4&gt;
  
  
  2) importando a nuestro main.js los archivos de materializeCss.
&lt;/h4&gt;

&lt;dl&gt;&lt;br&gt;&lt;/dl&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Vue&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;VueRouter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vue-router&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&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;./App.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// materializeCss&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;materialize-css/dist/css/materialize.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;materialize-css/dist/js/materialize.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ya en este punto no necesitas hacer nada en particular, mas que empezar a maquetar utilizando clases y componentes que ofrece materializeCss framework dentro de tus componentes de vuejs.&lt;/p&gt;

&lt;dl&gt;&lt;br&gt;&lt;/dl&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nuZzhqRR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/4r0ttuf3ssux9tu7t4cr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nuZzhqRR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/4r0ttuf3ssux9tu7t4cr.png" alt="Example" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;pero como te habrás dado cuenta, al principio del articulo mencione tres sencillos pasos de los cuales ya he explicado 2, el paso 3 es algo muy simple pero importante, a pesar de que con los pasos anteriores perfectamente puedes hacer muchas cosas, ciertos componentes necesitan la propiedad autoinit (los select por ejemplo) de materialize para renderizarse/funcionar.&lt;/p&gt;

&lt;dl&gt;&lt;br&gt;&lt;/dl&gt;

&lt;h4&gt;
  
  
  3) autoinit en componentes de vue
&lt;/h4&gt;

&lt;p&gt;para este paso solamente necesitamos hacer uso de un método del ciclo de vida del componente llamado mounted()&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; mounted&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      M.AutoInit&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;AutoInit() le permite inicializar todos los componentes de Materialize con una sola llamada de función. Es importante tener en cuenta que no puede pasar opciones con este método. Si desea que M.AutoInit() ignore un determinado elemento para configurarlo a gusto, puedes agregar la clase .no-autoinit al elemento y no se inicializará con autoinit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y con esto tendríamos ejecutándose las funciones de javasScript que necesitan ciertos elementos afectados por materializeCss, quiero concluir diciendo que a pesar que este articulo trata especificamente sobre materializeCss este proceso en muchos casos puede hacerse con otros frameworks css como por ejemplo miligram, así que solo tienes que indagar un poco si quieres hacer una integración diferente.&lt;/p&gt;

&lt;p&gt;espero que sea de provecho, hasta una próxima ocasión.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>materializecss</category>
      <category>tutorial</category>
      <category>integration</category>
    </item>
    <item>
      <title>El mejor framework de go para desarrolladores nodejs-express</title>
      <dc:creator>Michel Novellino</dc:creator>
      <pubDate>Fri, 08 May 2020 12:35:29 +0000</pubDate>
      <link>https://dev.to/michelnovellino/el-mejor-framework-de-go-para-desarrolladores-nodejs-express-1pck</link>
      <guid>https://dev.to/michelnovellino/el-mejor-framework-de-go-para-desarrolladores-nodejs-express-1pck</guid>
      <description>&lt;h3&gt;
  
  
  Tabla de contenidos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;¿Por qué fiber?&lt;/li&gt;
&lt;li&gt;Requisitos&lt;/li&gt;
&lt;li&gt;Primer ejemplo&lt;/li&gt;
&lt;li&gt;Parámetros opcionales en las rutas&lt;/li&gt;
&lt;li&gt;Como utilizar prefijos en nuestras rutas&lt;/li&gt;
&lt;li&gt;Sirviendo archivos estáticos&lt;/li&gt;
&lt;li&gt;Ruta para 404&lt;/li&gt;
&lt;li&gt;Configuración para spa&lt;/li&gt;
&lt;li&gt;Utilizando multiples middlewares&lt;/li&gt;
&lt;li&gt;Performance y benchmark&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;br&gt;
 Actualmente no soy un experto ni mucho menos en este lenguaje pero he llegado a agarrarle cariño y quiero compartir con ustedes no un tutorial de go como muchos existentes, quiero compartir un framework que se ha convertido rápidamente en mi favorito (bueno digo esto pero realmente el otro con el que he trabajado es Beego así que no es que los conozca todos pero así funciona el amarillismo). Planeo hacer este articulo introductorio y próximamente un ejemplo funcional.&lt;br&gt;
 &lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Así que, ¿Por qué fiber y por qué es el mejor framework de go para desarrolladores familiarizados con el entorno nodejs-express?
&lt;/h4&gt;

&lt;p&gt;Muy sencillo joven padawan, en sus propias palabras:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fiber es un framework web inspirado en Express desarollado sobre Fasthttp, el motor HTTP más rápido para Go. Diseñado para facilitar las cosas logrando un desarrollo rápido con cero asignación de memoria y rendimiento en mente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como pueden apreciar el equipo creador de este framework esta dedicado a que la experiencia sea lo mas similar posible a la que tenemos quienes trabajamos con express.&lt;/p&gt;
&lt;h4&gt;
  
  
  Requisitos  &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Como se pueden imaginar el requisito primordial es tener instalado go&lt;br&gt;
Como este articulo es dedicado a fiber no explicare como instalar el lenguaje, es primordial tener conocimientos básicos de go.&lt;/p&gt;

&lt;p&gt;Creamos una carpeta para nuestro proyecto en el directorio de trabajo y accedemos a ella.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir example &amp;amp;&amp;amp; cd example&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Luego creamos el archivo main.go&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;touch main.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;En este punto necesitaremos obtener el paquete de fiber para poder seguir con el ejemplo así que lo instalaremos con:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;go get -u github.com/gofiber/fiber&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Abrimos el archivo con nuestro editor de texto.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano main.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;p&gt;Ahora colocamos este código de ejemplo que nos ofrece la &lt;a href="https://docs.gofiber.io/"&gt;Documentación oficial&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"github.com/gofiber/fiber"&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hola, Mundo!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3000&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;p&gt;Lo ejecutamos&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;go run main.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;p&gt;Wuolah! tenemos un servidor escuchando en el puerto 3000 y nuestra primera ruta.&lt;/p&gt;

&lt;p&gt;Como podrán imaginarse si colocamos este ejemplo funcionara sin problemas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/:valor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Pedido Get con el valor: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"valor"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c"&gt;// =&amp;gt; Pedido Get con el valor: hola mundo&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También soporta parámetros opcionales en las rutas colocando ? al final del parámetro como hacemos en express.  &lt;a&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ruta/:nombre?/:apellido?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Sin nombre"&lt;/span&gt;
&lt;span class="n"&gt;apellido&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Sin apellido"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nombre"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nombre"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// =&amp;gt; Hola: michel Sin apellido&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apellido"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;apellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apellido"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// =&amp;gt; Hola:  Sin nombre novellino&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nombre"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apellido"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"¿Por qué no envía el nombre y apellido?"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hola: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;apellido&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;p&gt;Podemos agrupar nuestras rutas con prefijos  &lt;a&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/users"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GetAllHandler&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/:id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GetHandler&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PostHandler&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/:id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PutHandler&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/:id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DeleteHandler&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Archivos estaticos? por supuesto, tan sencillo de declarar como esto.  &lt;a&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/static"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"./public"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Manejar 404 para rutas no existentes?  &lt;a&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// =&amp;gt; 404 "Not Found"&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Not Found"&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;p&gt;¿ Quieres servir una spa?  &lt;a&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/web/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dist/index.html"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c"&gt;// Start server on http://localhost:3000&lt;/span&gt;
&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3000&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;p&gt;¿Puedo manejar multiples middlewares? claro que si.  &lt;a&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;three&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ruta 1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ruta 2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;three&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ruta 3"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&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;p&gt;¿Fiber tiene buen performance?  &lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como ya se ha explicado fiber es un framework cuya intención principal es generar una curva de aprendizaje corta para desarolladores de express, esto no quiere decir que el tema del performance sea algo netamente secundario, todo lo contrario, el rendimiento frente a nodejs es abismal, como prueba les dejo el link directo al &lt;a href="https://docs.gofiber.io/benchmarks"&gt;benchmark&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;br&gt;
En &lt;strong&gt;conclusión&lt;/strong&gt; podemos decir que es quizá la mejor opción en el mercado para el guerrero experimentado del mundo javascript con express, para aquel que quiera trabajar con go y no sufrir la nostalgia de extrañar la forma de trabajar del framework de javascript, Como un comentario final para el lector Si recibo buen feedback de este articulo traeré una segunda parte con un ejemplo funcional de un crud con mysql utilizando gorm y las funcionalidades de Fiber, Déjenme saber que les parece el articulo y hasta la próxima.&lt;/p&gt;

</description>
      <category>go</category>
      <category>gofiber</category>
      <category>node</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Implementando social login con angular 9 utilizando firebase/angularfire 6.0</title>
      <dc:creator>Michel Novellino</dc:creator>
      <pubDate>Fri, 08 May 2020 00:19:04 +0000</pubDate>
      <link>https://dev.to/michelnovellino/implementando-social-login-con-angular-9-utilizando-firebase-angularfire-6-0-1fck</link>
      <guid>https://dev.to/michelnovellino/implementando-social-login-con-angular-9-utilizando-firebase-angularfire-6-0-1fck</guid>
      <description>&lt;p&gt;No puedo empezar el post sin presentarme primero, Es mi primer articulo en esta plataforma, tengo otros en medium sin embargo me recomendaron &lt;em&gt;dev.to&lt;/em&gt;  y he decidido probarlo. &lt;a href="https://medium.com/@michelnovellino.programador"&gt;Link salvaje para el curioso&lt;/a&gt; Me dedico a desarrollar aplicaciones móviles y web, realmente me gusta mucho javascript, manejo frameworks como angular y vue, sin embargo he estado coqueteando mucho con golang, pero esto no es realmente lo importante,Ya escribire articulos al respecto.&lt;/p&gt;

&lt;p&gt;lo que nos compete es el hecho de que hoy estaba iniciando un proyecto nuevo y decidí por la poca complejidad que probaría &lt;strong&gt;&lt;em&gt;angular 9&lt;/em&gt;&lt;/strong&gt; el cual estaría usando firebase únicamente para hacer autenticación social, para esta tarea inicie descargando firebase y angularfire&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install firebase @angular/fire --save&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;es menester comentar que para angular 9 el equipo de angularfire lanzo un nuevo release, el 6.0 el cual introduce Breaking changes.&lt;/p&gt;

&lt;p&gt;entre los cuales podemos encontrar que desechan algunas características &lt;a href="https://github.com/angular/angularfire/blob/master/docs/version-6-upgrade.md"&gt;Pagina oficial de cambios&lt;/a&gt; y entre ellas una que nos afecta directamente en esta ocasión como esta &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AngularFireAuth has dropped the auth property and instead Promise Proxies the underlying Firebase&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;lo cual significa basicamente que ya no necesitamos hacer 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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;auth&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;firebase/app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// Ya no tenemos que usar la propiedad auth luego de afAuth&lt;/span&gt;
&lt;span class="nx"&gt;login&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;afAuth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signInWithPopup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FacebookAuthProvider&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;h4&gt;
  
  
  Entonces ¿Cómo lo hacemos?
&lt;/h4&gt;

&lt;p&gt;La respuesta es muy sencilla&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;// importamos e inicializamos el modulo de angularfire en app.module&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;AngularFireModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initializeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firebaseConfig&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;// Siempre recuerda configurar primero el proveedor en el panel de firebase.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entonces creamos nuestro servicio.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ng generate service /services/auth&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;y Configuramos el servicio&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;// podemos importar todo de firebase&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;firebase&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;firebase&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="c1"&gt;// o usar solo lo que nos compete y evitar el peso innecesario.&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;auth&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;firebase&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Injectable&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;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AngularFireAuth&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;@angular/fire/auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// yo acostumbro a utilizar solo lo necesario&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;auth&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;firebase&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="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;AuthService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AngularFireAuth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signInWithPopup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FacebookAuthProvider&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;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  // creamos el boton en el html del componente
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"javascript:void(0)"&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"login()"&lt;/span&gt;  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-neutral btn-icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-inner--icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
             &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./assets/img/icons/common/facebook.svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-inner--text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hacemos click en el botón con esperanza de que funcione&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tyap7MXG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/88y4guc8c3xq8ql6o8nx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tyap7MXG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/88y4guc8c3xq8ql6o8nx.png" alt="Facebook login test" width="672" height="560"&gt;&lt;/a&gt;&lt;br&gt;
Y woalah! &lt;/p&gt;

&lt;p&gt;Las librerías que utilizamos en nuestras aplicaciones normalmente son de terceros y pueden perfectamente pertenecer a particulares que querían aportar algo en la comunidad, por lo cual no es demasiado raro que a pesar de los esfuerzos se generen incompatibilidades, Pero con un poco de entusiasmo siempre podemos resolver los problemas, Hasta un próxima ocasión&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>angular</category>
      <category>tutorial</category>
      <category>angularfire</category>
    </item>
  </channel>
</rss>
