<?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: Euda</title>
    <description>The latest articles on DEV Community by Euda (@euda_ar).</description>
    <link>https://dev.to/euda_ar</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%2F217330%2F202e4151-d39c-4480-9714-4f421eff9b95.png</url>
      <title>DEV Community: Euda</title>
      <link>https://dev.to/euda_ar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/euda_ar"/>
    <language>en</language>
    <item>
      <title>¡Ayuda! Necesito una APP</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Fri, 31 Mar 2023 00:50:18 +0000</pubDate>
      <link>https://dev.to/euda/ayuda-necesito-una-app-50aa</link>
      <guid>https://dev.to/euda/ayuda-necesito-una-app-50aa</guid>
      <description>&lt;p&gt;&lt;em&gt;Aplicaciones vs páginas web: por qué es importante customizar tu plataforma en base a las necesidades del negocio&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Comunicar en la virtualidad
&lt;/h2&gt;

&lt;p&gt;Las aplicaciones móviles, redes sociales y páginas web tienen un punto en común: son excelentes herramientas de comunicación. Sin embargo, hay algunas ventajas de las apps (aplicaciones móviles) que deberías tener en cuenta.&lt;/p&gt;

&lt;p&gt;Como empresa, negocio o emprendimiento tenemos múltiples tipos de contenidos para comunicar: videos, eventos, imágenes, textos, audios. Por eso, trasladarlo a una plataforma que combina todos estos elementos en un solo canal es un gran beneficio.&lt;/p&gt;

&lt;p&gt;Las aplicaciones pueden incluir archivos multimedia, textos, datos, realizar llamadas, brindar servicios de geolocalización y mucho más, sacándole provecho a las capacidades que ya vienen integradas en el teléfono. Hay quienes dicen que hoy en día el teléfono inteligente o smartphone es una extensión del propio cuerpo, por lo que, imaginemos toda tu información al alcance de todos, en la palma de la mano de a quien querés llegar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Sin apps, los teléfonos inteligentes y las tabletas serían como vehículos de sofisticados diseños, pero sin gasolina.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La particularidad de esta herramienta, no es solamente la capacidad de contener varios formatos y tipos de archivos, sino también su versatilidad para un fácil acceso. Muchas empresas han querido aprovechar esta tecnología, en algunos casos, con suficiente éxito, como son los bancos e incluso instituciones estatales y gubernamentales. La virtualidad puede ser compleja, pero hay herramientas que nos acercan cada vez más: asistentes virtuales, chatbots, entre otras.&lt;/p&gt;

&lt;h2&gt;
  
  
  Oportunidades de negocio
&lt;/h2&gt;

&lt;p&gt;Uber, Rappi, PedidosYa, Spotify, Brubank y más: todas aplicaciones que surgieron a partir de necesidades concretas. Los empresarios encontraron un nuevo nicho para explotar, y el acompañamiento de la tecnología fue clave para poder efectuarlo.&lt;/p&gt;

&lt;p&gt;El e-commerce se encuentra en alza al punto que las tiendas físicas o retail en todo el mundo están buscando nuevas soluciones para mantenerse en pie. O por el contrario, nuevos negocios como showrooms o pequeños emprendimientos aparecen y se promocionan en redes, pero subsisten únicamente en lo digital.&lt;/p&gt;

&lt;p&gt;Sin embargo, ya sea una plataforma para e-commerce, una plataforma para reservar turnos o gestionar paquetes y envíos, la mejor opción es una aplicación personalizada. Si bien las redes o páginas web -como TiendaNube, Wix, entre otras- son muy útiles para los negocios que están empezando, al momento de crecer &lt;strong&gt;es un beneficio tener el poder de customizar tu plataforma y no depender de las limitaciones de estos prestadores.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Al fin y al cabo, es el medio de contacto más importante con tus clientes. Si no tuviese una página web o aplicación propia, durante el apagón de Facebook, Instagram y Whatsapp muchas ventas cayeron y, más importante, se perdió la comunicación con el cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  PWA o Progressive Web Apps
&lt;/h2&gt;

&lt;p&gt;Actualmente, hay muchas opciones a considerar, como una &lt;a href="https://www.iebschool.com/blog/progressive-web-apps-analitica-usabilidad/"&gt;Progressive Web App o PWA&lt;/a&gt;, es decir, una aplicación web con características de aplicación. Es el híbrido perfecto entre una app y una página web: puede soportar las mismas funcionalidades que una aplicación -como, por ejemplo, realizar videollamadas, chats, geolocalización- desde una url para usar en cualquier navegador, tanto en el teléfono como en la computadora. Es fácilmente adaptable a todos los formatos y pantallas.&lt;/p&gt;

&lt;p&gt;Entre las ventajas de esta solución, podemos mencionar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No es necesario instalar una aplicación desde el Google Play o App Store, ya que funcionan en cualquier navegador como Chrome, Safari, Firefox, etc.&lt;/li&gt;
&lt;li&gt;Puede funcionar sin conexión a internet, en algunos casos. Dependiendo de la funcionalidad que se le da, como una app, no es necesario que tenga conexión a internet para mostrar su contenido.&lt;/li&gt;
&lt;li&gt;Permite enviar notificaciones push a los usuarios, sin que el usuario haya instalado una aplicación.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Asesorate SIN COSTO
&lt;/h2&gt;

&lt;p&gt;Con tantas variables a tener en cuenta, un asesoramiento personalizado será siempre lo más valioso para que tu negocio crezca. Si te interesa escalar tu negocio no dudes en contactar una entrevista SIN COSTO con nosotros.&lt;/p&gt;

&lt;p&gt;Y si todavía no me creés, mirá este &lt;a href="https://eudaimonia.com.ar/landing_DO.html"&gt;caso de éxito&lt;/a&gt; dónde uno de nuestros clientes cuenta cómo lo ayudamos a escalar su negocio.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>mobile</category>
      <category>spanish</category>
      <category>writing</category>
    </item>
    <item>
      <title>#EudaStyle, long-term quality</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Tue, 21 Mar 2023 13:22:11 +0000</pubDate>
      <link>https://dev.to/euda/eudastyle-long-term-quality-213c</link>
      <guid>https://dev.to/euda/eudastyle-long-term-quality-213c</guid>
      <description>&lt;h2&gt;
  
  
  We build software with processes that help your digital project take off
&lt;/h2&gt;

&lt;p&gt;Creating an app is a science that needs quality and precision. With more than 12 years of experience innovating, at Euda we use the same top-notch processes as other well-known tech giants. In this article, you’ll find what are the first-class technology and work processes that we use to develop our success stories’ apps.&lt;/p&gt;

&lt;p&gt;There are a lot of things that can go wrong working in IT. For instance, a junior developer accidentally erases a whole production database of an e-commerce app and it affects not only the work of hundreds of people but the final customers. Or, maybe there is a bug that can stop the production of a whole factory, generating huge financial losses. Security is key and this is why we work in a way to ensure all these examples mentioned above never happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-code control
&lt;/h3&gt;

&lt;p&gt;Code review between cross-hierarchy teammates is one of the many actions taken to prevent this. Developers proofread each other’s lines of code before updating it on the system, checking each other’s code for mistakes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quality Assurance
&lt;/h3&gt;

&lt;p&gt;Another important point is QA, with &lt;strong&gt;manual and automated testing&lt;/strong&gt;. Most IT companies provide this service for their products. However, there are some key points to make it even better. For instance, automated tests should be integrated in the pipeline so that they run automatically with every deployment.&lt;/p&gt;

&lt;p&gt;Regarding manual testing, although they may sound similar, there is a huge difference between a bug and a glitch. Bugs are usually coding errors, whereas glitches are errors that happen when the engine does not work as expected. Also, there are some metaapp features that may become bugs if the final users don’t like them. This is why our QA engineers always test with an open mind and anticipate both users’ moves and their expectations of the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agile Methodologies
&lt;/h3&gt;

&lt;p&gt;One may believe that organizing beforehand to achieve a perfectly calibrated work before starting any project allows us to accomplish better results. However, calibrating work such as an analogical clock may take too long. The formula used in our success stories involves bumpy starts and lots of refining later, and I believe that, in most cases, this is better than no starting at all. Refining tasks is the core of agile methodologies and combined with high quality processes is how we carry out extremely complicated projects at Euda.&lt;/p&gt;

&lt;p&gt;We believe that organising work by following the agile methodologies principles is the way to go. Through our work we have come to value:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Individuals and interactions, over processes and tools&lt;br&gt;
Working software, over comprehensive documentation&lt;br&gt;
Customer collaboration, over contract negotiation&lt;br&gt;
Responding to change, over following a plan&lt;br&gt;
Find out more information on the &lt;a href="https://agilemanifesto.org/"&gt;Agile manifesto&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Multiple development environments
&lt;/h3&gt;

&lt;p&gt;Moreover, &lt;strong&gt;safe and independent environments&lt;/strong&gt; for development, testing and production ensure safety and quality at every step. Junior developers must learn from others and test in their own local environment and, again, before having access to production their code is reviewed by others.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automation: continuous integration, delivery and deployment
&lt;/h3&gt;

&lt;p&gt;And last but not least, we use tools such as Jenkins and Bitbucket Pipelines to ensure that the state of development is always available and transparent, and that a compiled application can be accessed at any time. That's how we focus on CI/CDD or &lt;strong&gt;Continuous Integration, Delivery and Deployment&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Following these principles, we had achieved digital projects’ scalability and product quality. It does not rely only on essentially big and complex teams. We believe that small but organised teams, added to all the good practises highlighted above are the best foundations for great software development.&lt;/p&gt;

&lt;p&gt;Want to be our next success story? Visit &lt;a href="https://eudaimonia.com.ar/"&gt;our website&lt;/a&gt; to find out more and do not hesitate to contact us!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
      <category>showdev</category>
      <category>community</category>
    </item>
    <item>
      <title>Redirect 301 con CloudFront y Lambda@EDGE</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Tue, 21 Mar 2023 13:08:24 +0000</pubDate>
      <link>https://dev.to/euda_ar/redirect-301-con-cloudfront-y-lambdaedge-454l</link>
      <guid>https://dev.to/euda_ar/redirect-301-con-cloudfront-y-lambdaedge-454l</guid>
      <description>&lt;p&gt;Hace poco tuve un requerimiento que consistía en redirigir una URL registrada en Route53 hacia una Progressive Web Application (PWA) deployada en un Bucket de S3 y distribuida a través de Cloudfront con subdominio propio.&lt;/p&gt;

&lt;p&gt;Para mi sorpresa, AWS no puede realizar esa petición utilizando los servicios antes mencionados de una manera simple. En este artículo les voy a contar cómo hacerlo paso por paso.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es un Código de estado de respuesta HTTP 301?
&lt;/h2&gt;

&lt;p&gt;Existen diversos códigos de estado como respuesta a una petición HTTP, entre ellos el código 301, el cual indica un redireccionamiento permanente de una URL a otra, enviando a todos los usuarios a la nueva URL destino. Comúnmente se utiliza cuando cambiamos de URL una web ya existente.&lt;/p&gt;

&lt;p&gt;Para más información, leer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTTP/Status"&gt;Códigos de estado de respuesta HTTP&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Para realizar la redirección solicitada vamos a crear una función Lambda@EDGE que evalúe el host de un request y, si empata con la URL que queremos redirigir, realice un redirect 301 a la URL de nuestra PWA. Esa función vamos a asociarla a la distribución de CloudFront donde se encuentra la PWA.&lt;/p&gt;

&lt;p&gt;Resumiendo, lo que hay que hacer es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ir a &lt;a href="https://aws.amazon.com/es/cloudfront/"&gt;CloudFront&lt;/a&gt; y agregar nuestra URL, la que queremos redirigir, como un Alternative domain names. Para ello, nos dirigimos a nuestra distribución de CloudFront, en la pestaña general editamos los Settings y agregamos un &lt;strong&gt;Alternative domain name (CNAME)&lt;/strong&gt; colocando la URL a la que vamos a aplicarle el Redirect 301.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ahora tenemos que vincular nuestra URL a redirigir con la distribución de CloudFront. Para hacerlo, dirigirse a Route53, crear un record tipo A y colocar la misma URL que agregamos en el paso anterior. Vamos a filtrar la distribución de CloudFront buscándola por Alias y veremos que cuando seleccionemos CloudFront automáticamente nos va a aparecer la opción para elegir la distribución de nuestra PWA, gracias a que previamente agregamos ese dominio como Alternative domain name a nuestra distribución.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Por último, realizar un función lambda@EDGE y asociarla a nuestra distribución CloudFront para que cuando accedamos mediante la urlARedirigir realice una respuesta 301 y nos redirija a la URL original de la PWA. Para esto, vamos a ir a Lambda -&amp;gt; Create Function y elegimos Author from Scratch. Vamos a utilizar NodeJs y una arquitectura x86 para crear nuestra función.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Una vez creada la función nos va a salir un código de muestra, el cuál hay que editar y agregar el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
exports.handler = async (event) =&amp;gt; {
  const request = event.Records[0].cf.request;
  if (request.headers.host[0].value === 'urlARedirigir') {
    return {
      status: '301',
      statusDescription: `Redirecting to other domain`,
      headers: {
        location: [{
          key: 'Location',
          value: `https://urlPWA${request.uri}`
        }]
      }
    };
  }
  return request;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Un detalle importante respecto a la función es que urlARedirigir es solo el HOST de nuestra URL, por ende su valor NO debe contener el protocolo.&lt;br&gt;
Ejemplo:&lt;br&gt;
URL = &lt;a href="https://exampleUrl.com"&gt;https://exampleUrl.com&lt;/a&gt;&lt;br&gt;
Host = exampleUrl.com&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Luego de ingresar el código realizamos un deploy (presionando el botón ubicado arriba del cuadro de código) y debemos realizar una publicación de nuestra función Lambda desde el desplegable action -&amp;gt; publish new version.&lt;/p&gt;

&lt;p&gt;Antes de continuar triggereando nuestra función con nuestra distribución de CloudFront, hay que ir a la solapa de Configuration y seleccionar Permission en la columna de la izquierda. Allí veremos que existe un ROLE creado. Clickeamos sobre el nombre del rol y nos va a dirigir al servicio de IAM.&lt;/p&gt;

&lt;p&gt;Dentro del servicio de la configuración del ROL en el servicio de IAM nos dirigimos a la solapa de Permissions y editamos la Policy creada agregándole varios permisos, dejándola así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:us-east-1:&amp;lt;accountID&amp;gt;:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "lambda:GetFunction",
                "lambda:EnableReplication*",
                "iam:CreateServiceLinkedRole",
                "cloudfront:UpdateDistribution",
                "cloudfront:CreateDistribution"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:&amp;lt;accountID&amp;gt;:log-group:/aws/lambda/redirect301:*",
                "arn:aws:cloudfront::&amp;lt;accountID&amp;gt;:distribution/*",
                "arn:aws:lambda:*:&amp;lt;accountID&amp;gt;:function:*",
                "arn:aws:iam::*:role/*"
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, nos dirigimos a la solapa de Trust relationships, clickeamos el botón Edit trust relationship y editamos la policy para que quede de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "edgelambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez realizado este cambio volvemos al servicio de Lambda y vamos a nuestra función. Tocamos el botón Add trigger y seleccionamos el servicio de CloudFront. A continuación, tocamos el botón de Deploy to &lt;a href="mailto:Lambda@Edge"&gt;Lambda@Edge&lt;/a&gt;. Esto nos va a levantar un popup donde seleccionaremos la distribución de CloudFront donde se encuentra nuestra PWA, seleccionaremos Viewer request como evento de nuestra distribución y, por último, damos el check confirmando el deploy y presionamos “Deploy”.&lt;/p&gt;

&lt;p&gt;Una vez deployado el trigger podemos observar que en nuestra pantalla de la función aparece el servicio de CLoudFront. Por último, si vamos a la sección de Behavior de nuestra distribución de CloudFront veremos que en la parte de Functions Associations se encuentra en el Viewer Request nuestro Lambda@Edge recién creado.&lt;/p&gt;

&lt;p&gt;¡Y eso es todo!&lt;/p&gt;

&lt;p&gt;Gracias por haber leído, espero que les sea útil. Pueden dejar sus dudas o comentarios abajo.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>404 error: QA Analyst not found</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Mon, 20 Mar 2023 21:38:08 +0000</pubDate>
      <link>https://dev.to/euda_ar/404-error-qa-analyst-not-found-3od7</link>
      <guid>https://dev.to/euda_ar/404-error-qa-analyst-not-found-3od7</guid>
      <description>&lt;p&gt;Considering that most professions do not offer the opportunity to keep working remotely, people are starting to look for new career paths. What seems to be the easiest choice for those in need of a new beginning is becoming a QA Engineer, QA Analyst or software tester. How hard can it be for someone who uses technology on a daily basis to test apps?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The demand for IT specialists&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As reported by the &lt;a href="https://www.bls.gov/ooh/computer-and-information-technology/home.htm"&gt;Bureau of Labor Statistics&lt;/a&gt;, the employment of IT professionals is expected to grow 13% between 2020 and 2030, surpassing the average growth for occupations. Such an accelerated pace is reasonable considering that computer and information technology jobs benefited from the pandemic due to the new norm of working remotely. In just a few weeks the great majority of employees were forced to adapt to this trend which now seems to keep growing even after offices start to reopen. Reaching higher levels of productivity, and saying goodbye to the dreaded commute are just a few of the advantages. To put it simply, these changes benefited those working in IT since companies adapted easily to a digital workplace by taking advantage of the already used technology -such as Slack, Drive and Google Meet- to communicate remotely. There are no obstacles for companies to follow through with the transition and to even stay remote indefinitely.&lt;/p&gt;

&lt;p&gt;During the current pandemic, employees are rethinking their careers, a common pattern after life-changing events, and as already mentioned above, job opportunities for IT professionals are increasing. The information technology world seems to be the best possible solution with well-paid positions, significant growth opportunities and the chance to work remotely. Such abrupt change is not easy to accomplish but many have found the way to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Quality Assurance&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One way of getting into the tech industry is by becoming a software tester, a QA analyst or a QA engineer. Some may think it is the quickest and easiest way since testing comes hand in hand with career growth. The experience and apprehension provided by this opportunity to explore different angles of the software development process can be later applied to different positions, such as test automation engineer, product manager and even software developer.&lt;/p&gt;

&lt;p&gt;Nowadays, with the countless online courses anyone can become a software tester -at least an average one- and with this solid foundation, companies may hire you in view of the increasing worldwide demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The complexity of testing&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Quality Assurance testers are responsible for testing websites or apps in order to find malfunctions or defects, a simple look at the app is not enough. The job consists of comprehensive and thorough tests, which are crucial. After all, it eliminates risks from the release process so companies can focus on their growth.&lt;/p&gt;

&lt;p&gt;Knowing the responsibilities of a QA tester, it is important to understand the skills needed which most online courses tend to omit. First of all, good communication skills are essential, both written and verbal. Testers find themselves documenting use cases and bug reports that must be detailed and easy for the whole team to understand. For instance, developers should not have to ask for more detailed information once they read a bug report, and new employees should be able to become acquainted with a project by reading the use cases. To ensure well-detailed documentation, a tester needs to have a clear idea of UI/UX terminology and behavior driven development (or &lt;a href="https://dannorth.net/introducing-bdd/"&gt;BDD&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Furthermore, as some may believe, using a phone or computer on a daily basis should be enough expertise for the job. However, this could not be further from the truth. A tester must have a broad range of knowledge in software applications, hardware, cloud computing and networks. This includes, for example, understanding the difference between desktop and mobile operating systems, such as Windows, MacOS, Linux, IOS and Android. With the increasing competition in the browser market, new features are added or refined with the intention to differentiate themselves. Consequently, the outcome of a project may vary depending on which browser is used. Therefore, testers need to assure the quality and accessibility of a software in every OS since no one can predict how an user chooses to interact with it.&lt;/p&gt;

&lt;p&gt;Finally, a software tester must familiarize with all the tools used in IT jobs. Starting with a solid understanding of agile methodologies for team collaboration and knowledge of the most popular kanban boards to report bugs and organize work, such as Trello, Jira or Asana, frequently asked in IT hiring processes. Followed by database management systems, for instance, MongoDB Compass, MySQL and phpMyAdmin. In addition, the proficiency in automation tools is valuable: Cucumber with Appium or Selenium for those more advanced or TestProject for beginners. For writing test cases, TestRail is one that might come in handy, and Postman for API testing.&lt;/p&gt;

&lt;p&gt;Even though learning manual QA can be fast, easy and affordable for those seeking a change in their profession, only those eager to learn, ready to persistently build on their skill set, and those who have the aspiration to become an expert at the job will make it. The demand for QA testers is growing but there are not enough qualified people to fill these positions since it takes time and resources to build on the skill.&lt;/p&gt;

&lt;p&gt;If you think you got what it takes to become part of the Euda QA team, do not hesitate to contact us! Good luck!&lt;/p&gt;

&lt;p&gt;Please comment below on some related topics that you would like to read more about.&lt;/p&gt;

</description>
      <category>qa</category>
      <category>beginners</category>
      <category>career</category>
      <category>testing</category>
    </item>
    <item>
      <title>#EudaStyle, long-term quality</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Wed, 11 May 2022 20:27:07 +0000</pubDate>
      <link>https://dev.to/euda_ar/eudastyle-long-term-quality-35d3</link>
      <guid>https://dev.to/euda_ar/eudastyle-long-term-quality-35d3</guid>
      <description>&lt;h2&gt;
  
  
  We build software with processes that help your digital project take off
&lt;/h2&gt;

&lt;p&gt;For us, creating an app is a science that needs quality and precision. With more than 12 years of experience innovating, at Euda we use the same top-notch processes as other well-known tech giants. In this article, you’ll find what are the work processes that we use to develop our success stories’ apps. Our goal is that, maybe, you can get some inspiration for your own! &lt;/p&gt;

&lt;p&gt;There are a lot of &lt;em&gt;things that can go wrong working in IT&lt;/em&gt;. For instance, a junior developer accidentally erases a whole production database of an e-commerce app and it affects not only the work of hundreds of people but the final customers. Or, maybe there is a bug that can stop the production of a whole factory, generating huge financial losses. Security is key and this is why we work in a way to ensure all these examples mentioned above never happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code review&lt;/strong&gt; between cross-hierarchy teammates is one of the many actions taken to prevent this. Developers proofread each other’s lines of code before updating it on the system, checking each other’s code for mistakes.&lt;/p&gt;

&lt;p&gt;Another important point is &lt;strong&gt;QA, with manual and automated testing&lt;/strong&gt;. Most IT companies provide this service for their products. However, there are some key points to make it even better. For instance, automated tests should be integrated in the pipeline so that they run automatically with every deployment.&lt;/p&gt;

&lt;p&gt;Regarding manual testing, although they may sound similar, there is a huge difference between a bug and a glitch. Bugs are usually coding errors, whereas glitches are errors that happen when the engine does not work as expected. Also, there are some metaapp features that may become bugs if the final users don’t like them. This is why our QA engineers always test with an open mind and anticipate both users’ moves and their expectations of the product.&lt;/p&gt;

&lt;p&gt;One may believe that organizing beforehand to achieve a perfectly calibrated work before starting any project allows us to accomplish better results. However, calibrating work such as an analogical clock may take too long. The formula used in our success stories involves bumpy starts and lots of refining later, and we believe that, in most cases, this is better than no starting at all. Refining tasks is the core of agile methodologies and combined with high quality processes is how we carry out extremely complicated projects at Euda.&lt;/p&gt;

&lt;p&gt;We believe that organising work by following the &lt;strong&gt;agile methodologies principles&lt;/strong&gt; is the way to go. Through our work we have come to value:&lt;/p&gt;

&lt;p&gt;Individuals and interactions, over processes and tools&lt;br&gt;
Working software, over comprehensive documentation&lt;br&gt;
Customer collaboration, over contract negotiation&lt;br&gt;
Responding to change, over following a plan&lt;br&gt;
Find out more information on the Agile manifesto: &lt;a href="https://agilemanifesto.org/"&gt;https://agilemanifesto.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, safe and &lt;strong&gt;independent environments for development&lt;/strong&gt;, testing and production ensure safety and quality at every step. Junior developers must learn from others and test in their own local environment and, again, before having access to production their code is reviewed by others.&lt;/p&gt;

&lt;p&gt;Following these principles, we had achieved digital projects’ scalability and product quality. It does not rely only on essentially big and complex teams. we believe that small but organised teams, added to all the good practises highlighted above are the best foundations for great software development. That's why we encourage you to follow this principles. Good luck!&lt;/p&gt;

&lt;p&gt;Want to be our next success story? Visit &lt;a href="https://www.eudaimonia.com.ar/"&gt;our website&lt;/a&gt; to find out more and do not hesitate to contact us!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>#EudaStyle, calidad a largo plazo</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Tue, 25 Jan 2022 18:55:02 +0000</pubDate>
      <link>https://dev.to/euda_ar/eudastyle-calidad-a-largo-plazo-1i74</link>
      <guid>https://dev.to/euda_ar/eudastyle-calidad-a-largo-plazo-1i74</guid>
      <description>&lt;p&gt;Hay muchas cosas que pueden salir mal trabajando en sistemas. Por ejemplo, un desarrollador junior borra accidentalmente la base de datos de producción completa de una aplicación de e-commerce y afecta no solo el trabajo de cientos de personas sino también a los clientes finales. O tal vez haya un error que pueda detener la producción de toda una fábrica generando enormes pérdidas financieras. La seguridad es clave y es por eso que en Euda trabajamos para garantizar que estos ejemplos mencionados anteriormente nunca sucedan.&lt;/p&gt;

&lt;p&gt;La &lt;strong&gt;revisión de código&lt;/strong&gt; entre compañeros de equipo de jerarquía cruzada es una de las muchas acciones que se toman para evitar esto. Otros analistas desarrolladores o incluso líderes de proyecto revisan las líneas de código de los demás antes de actualizarlo en el sistema, verificando el código de los demás en busca de errores.&lt;/p&gt;

&lt;p&gt;Otro punto importante es el &lt;strong&gt;control de calidad&lt;/strong&gt; con pruebas manuales y automatizadas. La mayoría de las empresas de IT brindan este servicio para sus productos. Sin embargo, hay algunos puntos clave para mejorarlo aún más. Por ejemplo, las pruebas automatizadas deben integrarse en el pipeline de buildeo para que se ejecuten automáticamente con cada implementación.&lt;/p&gt;

&lt;p&gt;Con respecto a las pruebas manuales, los errores o bugs más comunes que aparecen pueden ser tanto errores de codificación, como fallos que se dan cuando el sistema no funciona como se esperaba. Además, hay algunas características de la aplicación que pueden convertirse en errores si a los usuarios finales no les gustan. Nuestros ingenieros de control de calidad (equipo de QA) siempre prueban con una mente abierta y anticipan tanto los movimientos de los usuarios como sus expectativas del producto.&lt;/p&gt;

&lt;p&gt;Organizarnos de antemano para lograr un trabajo perfectamente calibrado antes de iniciar cualquier proyecto nos permite lograr mejores resultados. Sin embargo, el trabajo de calibración para que todo funcione como un reloj analógico, puede llevar demasiado tiempo. La fórmula utilizada en nuestras historias de éxito implica comienzos con baches y mucho refinamiento más adelante, y creo que, en la mayoría de los casos, esto es mejor que no comenzar en absoluto. El refinamiento de tareas es el núcleo de las &lt;strong&gt;metodologías ágiles&lt;/strong&gt; y combinado con procesos de alta calidad es como llevamos a cabo proyectos extremadamente complicados en Euda.&lt;/p&gt;

&lt;p&gt;Creemos que organizar el trabajo siguiendo los principios de las metodologías ágiles es el camino a seguir. A través de nuestro trabajo hemos llegado a valorar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Individuos e interacciones, sobre procesos y herramientas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Software funcionando, sobre documentación exhaustiva.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Colaboración con el cliente, sobre negociación contractual.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Respuesta ante el cambio, sobre seguir un plan.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para más información sobre el manifiesto Agile &lt;a href="https://agilemanifesto.org/"&gt;consulte aquí.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por último, los &lt;strong&gt;entornos seguros e independientes&lt;/strong&gt; son clave para asegurar un software de calidad. Trabajamos en un entorno de desarrollo (“dev”), que es un entorno inestable donde los analistas programadores trabajan directamente, un entorno de prueba (“test”), donde se corren todas las pruebas de calidad, y finalmente el entorno de producción (“prod”), que es el entorno estable al que los usuarios finales tienen acceso.&lt;/p&gt;

&lt;p&gt;Los desarrolladores junior deben aprender de otros y probar en su propio entorno local y, como mencionamos más arriba, otros colaboradores revisan su código antes de volcar su desarrollo en el entorno de producción.&lt;/p&gt;

&lt;p&gt;Siguiendo estos principios, logramos la &lt;strong&gt;escalabilidad&lt;/strong&gt; de los proyectos digitales y la calidad del producto. No depende solo esencialmente de equipos grandes y complejos. Creemos que los equipos más chicos, pero organizados sumados a todas las buenas prácticas destacadas anteriormente, son la mejor base para un gran desarrollo de software.&lt;/p&gt;

&lt;p&gt;¿Quieres ser nuestro próximo caso de éxito? Visitá &lt;a href="https://www.eudaimonia.com.ar/"&gt;nuestro sitio web&lt;/a&gt; para obtener más información y no dudes en ponerte en contacto con nosotros.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>spanish</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Sails development with Docker and Docker Compose</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Wed, 14 Apr 2021 14:18:32 +0000</pubDate>
      <link>https://dev.to/euda/sails-development-with-docker-and-docker-compose-36l7</link>
      <guid>https://dev.to/euda/sails-development-with-docker-and-docker-compose-36l7</guid>
      <description>&lt;p&gt;Docker makes it easy to set up and run a development environment and also simplifies the deployment of your applications. In this article we will see how to setup a Sails development workflow with Docker and Docker Compose.&lt;/p&gt;

&lt;h1&gt;
  
  
  Whats and whys: Docker &amp;amp; Docker Compose
&lt;/h1&gt;

&lt;p&gt;The goal of this article is to make setting up a Docker workflow for Sails as simple as possible. Docker makes it easier to set up and run a development environment and also simplifies the deployment. &lt;/p&gt;

&lt;p&gt;First, we’ll get into how Docker and Docker Compose work and its benefits. Then a step by step guide to make our beloved Sails run inside a Docker container. Let's get started!&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Containerization
&lt;/h3&gt;

&lt;p&gt;Before talking about Docker and Sails we need to understand what is containerization and why we want it.&lt;br&gt;
Containerization is a form of virtualization, through which applications are run in isolated user spaces called containers. We can think of a container as a lightweight virtual machine (but to be clear, it is not).&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16o7ijl9n57b2p35f349.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16o7ijl9n57b2p35f349.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;em&gt;Comparing Containers and Virtual Machines&lt;/em&gt; [1]&lt;/p&gt;

&lt;p&gt;But, why do we want it?&lt;/p&gt;

&lt;p&gt;With containerization, everything an application needs to run, let's say, its binaries, libraries, configuration files and dependencies, are encapsulated and isolated in its container. This makes it easier to set up and run a development environment, and also simplifies the deployment by reducing the chances of missing or different versions of libraries, files or dependencies errors.&lt;/p&gt;

&lt;p&gt;The container itself is abstracted away from the host OS, with only limited access to underlying resources. Isolation has its advantages, for example portability, stability and security.&lt;/p&gt;

&lt;p&gt;So, standard, lightweight, secure… &lt;strong&gt;yes as developers we want containerization!&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Docker and Docker Compose
&lt;/h3&gt;

&lt;p&gt;The word "Docker" refers to several things including an open source project, tools and a company (Docker Inc., the company that primarily supports the project and tools).&lt;/p&gt;

&lt;p&gt;Talking about the tools, Docker is a tool designed to make it easier to create, deploy, and run applications by using containers.&lt;/p&gt;

&lt;p&gt;Container orchestration automates the deployment, management, scaling, and networking of containers. It can help you deploy the same application across different environments without needing to redesign it. As an example, microservices in containers make it easy to orchestrate services, including storage, networking, and security. &lt;strong&gt;Docker Compose is an orchestration tool for Docker containers.&lt;/strong&gt; [2]&lt;/p&gt;
&lt;h3&gt;
  
  
  Installing Docker
&lt;/h3&gt;

&lt;p&gt;Mac: &lt;a href="https://docs.docker.com/docker-for-mac/install/" rel="noopener noreferrer"&gt;https://docs.docker.com/docker-for-mac/install/&lt;/a&gt;&lt;br&gt;
Windows: &lt;a href="https://docs.docker.com/docker-for-windows/install/" rel="noopener noreferrer"&gt;https://docs.docker.com/docker-for-windows/install/&lt;/a&gt;&lt;br&gt;
Ubuntu: &lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;https://docs.docker.com/engine/install/ubuntu/&lt;/a&gt;&lt;br&gt;
Others: &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;https://docs.docker.com/engine/install/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Sails containerization
&lt;/h1&gt;

&lt;p&gt;Now, how do we make Sails, our beloved Node framework, run inside a container? &lt;/p&gt;
&lt;h3&gt;
  
  
  Sails CLI image
&lt;/h3&gt;

&lt;p&gt;Our container needs an image to run. Let's create one.&lt;br&gt;
To do so, create docker-sails-cli directory and a file named Dockerfile inside it with this content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:lts&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; sails@1.4.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The FROM statement declares we are using node latest lts version as base image for ours. The syntax used is &lt;code&gt;imageName:tag&lt;/code&gt;, if no tag is specified, the default is used. [3]&lt;/p&gt;

&lt;p&gt;At the same time Node lts image is based on Debian Streatch. So this is our project environment, Sails 1.4.2, node 14.15.4 (at the time of writing this) running on a Debian Streatch.&lt;/p&gt;

&lt;p&gt;Now we need to build our image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; sails-cli:1.4.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, right?&lt;/p&gt;

&lt;p&gt;Let’s see what we did.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build [context] -t [tag]&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;context&lt;/strong&gt;: The context where we are building. As we are in the same directory as the Dockerfile we use &lt;code&gt;.&lt;/code&gt;.  And also, there’s no need to specify the file name as Dockerfile is the default one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tag&lt;/strong&gt;: It is optional, but we want to tag the image we just built as we are probably going to have many different images with different versions for different projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a new Sails project
&lt;/h3&gt;

&lt;p&gt;Once we have our Sails CLI image built we are going to use it to create a new Sails project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app sails-cli:1.4.0 sails new sails-docker-example &lt;span class="nt"&gt;--no-frontend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker run&lt;/strong&gt;: Create and run a new container&lt;br&gt;
&lt;strong&gt;--rm&lt;/strong&gt;: Remove container after process finishes as we don’t need the container after that&lt;br&gt;
&lt;strong&gt;-v&lt;/strong&gt;: Mount current working directory (in our host computer) in /app path inside container. As a result we are sharing current directory with the container&lt;br&gt;
&lt;strong&gt;-w&lt;/strong&gt;: Set container current working directory to /app&lt;br&gt;
&lt;strong&gt;sails-cli:1.4.0&lt;/strong&gt;: Our previously built Sails image&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;sails new sails-docker-example --no-frontend&lt;/strong&gt;: Sails CLI command we want to run in the container.&lt;/p&gt;

&lt;p&gt;As a result, after running &lt;code&gt;sails new&lt;/code&gt; in the container, we are going to find a new directory created with our new Sails project. &lt;/p&gt;

&lt;p&gt;Now, let’s run our project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;sails-docker-example
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app &lt;span class="nt"&gt;-p&lt;/span&gt; 1337:1337 sails-cli:1.4.0 sails lift
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;-i&lt;/strong&gt;: Keep STDIN open even if not attached&lt;br&gt;
&lt;strong&gt;-t&lt;/strong&gt;: Allocate a pseudo-TTY&lt;br&gt;
&lt;strong&gt;-p&lt;/strong&gt;: Maps container 1337 to host computer so we can reach our app through localhost:1337&lt;/p&gt;

&lt;p&gt;It's alive!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3chsoinwvj4pmagcqpxp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3chsoinwvj4pmagcqpxp.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Running and debugging
&lt;/h3&gt;

&lt;p&gt;As you may notice, although our project is running, if you modify a file you will need to stop the container and launch it again to get the changes applied.&lt;/p&gt;

&lt;p&gt;Nodemon to the rescue!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app sails-cli:1.4.0 npm &lt;span class="nb"&gt;install &lt;/span&gt;nodemon &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, open &lt;strong&gt;package.json&lt;/strong&gt; and in the &lt;strong&gt;scripts&lt;/strong&gt; section add a new one, &lt;strong&gt;debug&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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="nl"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nodemon --inspect=0.0.0.0 app.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NODE_ENV=production node app.js"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And run again, but this time instead of sails lift we are going to run with npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app &lt;span class="nt"&gt;-p&lt;/span&gt; 1337:1337 &lt;span class="nt"&gt;-p&lt;/span&gt; 9229:9229 sails-cli:1.4.0 npm run debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, modify a file, save it and verify that the project is restarted automatically.&lt;/p&gt;

&lt;p&gt;Finally, as we are running inside a container we need a way to get the debugger connected to the process, so we are mapping the 9559 port.&lt;/p&gt;

&lt;p&gt;If you use VS Code you can use the following configuration in the &lt;br&gt;
launch.json file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&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;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&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="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"localRoot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Attach to Remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9229&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"remoteRoot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"attach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"skipFiles"&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;"&amp;lt;node_internals&amp;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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"restart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;/div&gt;



&lt;h1&gt;
  
  
  Docker compose
&lt;/h1&gt;

&lt;p&gt;As we mentioned before Docker Compose is an orchestration tool. Compose allows us to define our infrastructure, let’s say, services, networks, volumes in an YAML file.&lt;/p&gt;

&lt;p&gt;As a first step we will create a very simple file defining our Sails service on it. For this service we will set image, command, ports mapping, volume mounts, working directory, etc, as we did with Docker command line tool.&lt;/p&gt;

&lt;p&gt;Our docker-compose.yml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sails-cli:1.4.0&lt;/span&gt; &lt;span class="c1"&gt;# same as with docker cli&lt;/span&gt;
        &lt;span class="c1"&gt;# Run npm install before starting sails to keep our dependencies installed and updated&lt;/span&gt;
        &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sh -c "npm install &amp;amp;&amp;amp; npm run debug"&lt;/span&gt;
        &lt;span class="na"&gt;working_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app&lt;/span&gt; &lt;span class="c1"&gt;# same as -w with docker cli&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# same as -p with docker cli&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1337:1337'&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;9229:9229'&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# same as -v with docker cli&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we will use docker-compose command to lift our service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is the same as running with Docker CLI.&lt;/p&gt;

&lt;p&gt;In case we want to remove the created infrastructure, once stopped, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will remove all the containers, networks, volumes created with &lt;code&gt;docker-compose up&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Database containerization
&lt;/h1&gt;

&lt;p&gt;In most cases we will require a database for our project. In this example we will be using MongoDB but it’s possible to do the same with other db engine supported by Sails. [4]&lt;/p&gt;

&lt;p&gt;For those who don’t know, MongoDB is a free and open-source cross-platform document-oriented database program. [5]&lt;/p&gt;

&lt;p&gt;Fortunately MongoDB has an official image that we will be using to add a database service to our project.&lt;/p&gt;

&lt;p&gt;First, we need to add Sails MongoDB adapter to our project. As we did before, we can add and install a dependency to our project with Docker like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app sails-cli:1.4.0 npm &lt;span class="nb"&gt;install &lt;/span&gt;sails-mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, modify our project config and set mongo as our default adapter.&lt;/p&gt;

&lt;p&gt;In the config/datastore.js file:&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="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sails-mongo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DB_URL&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Next we need to add MongoDB service to our docker-compose.yml and provision Sails service with needed config.&lt;/p&gt;

&lt;p&gt;docker-compose.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sails-cli:1.4.0&lt;/span&gt;
        &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sh -c "npm install &amp;amp;&amp;amp; npm run debug"&lt;/span&gt;
        &lt;span class="na"&gt;working_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1337:1337'&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;9229:9229'&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;
        &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./sails.env&lt;/span&gt; &lt;span class="c1"&gt;# set env vars using a file&lt;/span&gt;

    &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongodb&lt;/span&gt; &lt;span class="c1"&gt;# set name to the container&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo:4.4&lt;/span&gt; &lt;span class="c1"&gt;# as of this writing, the latest version is 4.4.3&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./mongo:/data/db&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We added a db service to our compose file, and also set an env file to Sails service. We will use that file to config our database connection.&lt;/p&gt;

&lt;p&gt;sails.env&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_URL=mongodb://root:@mongodb:27017/sails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compose allows us to connect to db using the container name as network address, that is why we can use &lt;strong&gt;mongodb&lt;/strong&gt; as the address in our connection url.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important note&lt;/strong&gt;: we are not enabling MongoDB authentication for this example but it is a good idea to do so for production environments. [6]&lt;/p&gt;

&lt;p&gt;Finally, use &lt;code&gt;docker-compose up&lt;/code&gt; to run, you will see MongoDB output along with Sails.&lt;/p&gt;

&lt;p&gt;And we are done, a fully Sails development environment running on Docker!&lt;/p&gt;

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

&lt;p&gt;Thank you so much for reading my post, comments are welcome! &lt;/p&gt;

&lt;p&gt;Here is the link to the writter's twitter &lt;a class="mentioned-user" href="https://dev.to/vidueirof"&gt;@vidueirof&lt;/a&gt; for any questions you may have. &lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://www.docker.com/resources/what-container" rel="noopener noreferrer"&gt;https://www.docker.com/resources/what-container&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://www.docker.com/why-docker" rel="noopener noreferrer"&gt;https://www.docker.com/why-docker&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://hub.docker.com/_/node" rel="noopener noreferrer"&gt;https://hub.docker.com/_/node&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://sailsjs.com/documentation/concepts/extending-sails/adapters/available-adapters" rel="noopener noreferrer"&gt;https://sailsjs.com/documentation/concepts/extending-sails/adapters/available-adapters&lt;/a&gt;&lt;br&gt;
[5] &lt;a href="https://www.mongodb.com" rel="noopener noreferrer"&gt;https://www.mongodb.com&lt;/a&gt;&lt;br&gt;
[6] &lt;a href="https://hub.docker.com/_/mongo" rel="noopener noreferrer"&gt;https://hub.docker.com/_/mongo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>api</category>
      <category>tutorial</category>
      <category>containers</category>
    </item>
    <item>
      <title>Certificación de dominio con Let’s Encrypt, NGINX y Docker Compose</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Thu, 03 Sep 2020 20:24:23 +0000</pubDate>
      <link>https://dev.to/euda_ar/certificacion-de-dominio-con-let-s-encrypt-nginx-y-docker-compose-16p4</link>
      <guid>https://dev.to/euda_ar/certificacion-de-dominio-con-let-s-encrypt-nginx-y-docker-compose-16p4</guid>
      <description>&lt;h1&gt;
  
  
  Algunas definiciones
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ¿Qué es un Certificado SSL?
&lt;/h3&gt;

&lt;p&gt;Un certificado SSL es un tipo de certificado digital que proporciona autenticación para un sitio web y habilita una conexión encriptada. Estos certificados comunican al cliente que el host del servicio web demostró la propiedad del dominio a la autoridad de certificación en el momento de la emisión del certificado.&lt;/p&gt;

&lt;p&gt;SSL (Secure Socket Layer) es un protocolo de seguridad que encripta el envío y recepción de información entre el servidor y el cliente. Este crea una capa de conexión segura entre el navegador y el servidor del sitio web al que el usuario se conecta. Cualquier información que pase a través de esta capa está encriptada y es descifrada cuando llega a su destino.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Let’s Encrypt
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://letsencrypt.org/es/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt; es una autoridad de certificación (también conocidas como AC o CA por sus siglas en inglés) gratuita, automatizada, y abierta, que existe para el beneficio del público. Es un servicio provisto por el &lt;a href="https://www.abetterinternet.org/" rel="noopener noreferrer"&gt;Internet Security Research Group o ISRG&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Certbot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://certbot.eff.org/" rel="noopener noreferrer"&gt;Cerbot&lt;/a&gt; es un cliente extensible con todas las funciones para Let’s Encrypt CA, o cualquier otra autoridad de certificación que se comunique a través del protocolo &lt;a href="https://github.com/ietf-wg-acme/acme/blob/master/draft-ietf-acme-acme.md" rel="noopener noreferrer"&gt;ACME&lt;/a&gt;, capaz de automatizar las tareas de obtener certificados y configurar servidores web para usarlos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nginx
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nginx.com/" rel="noopener noreferrer"&gt;NGINX&lt;/a&gt; es un servidor web/proxy inverso ligero de alto rendimiento y un proxy para protocolos de correo electrónico.​​&lt;/p&gt;

&lt;h1&gt;
  
  
  Cómo certificar
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Pre-Requisitos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dominio registrado&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/compose/install/" rel="noopener noreferrer"&gt;Docker Compose instalado&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compose es una herramienta para definir y ejecutar aplicaciones Docker de varios contenedores. Se usa un archivo YAML para configurar los servicios de tu aplicación y luego, con un solo comando, crea e inicia todos los servicios desde tu configuración. &lt;/p&gt;

&lt;h3&gt;
  
  
  Pasos
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Lo primero que haremos es &lt;strong&gt;crear los directorios&lt;/strong&gt; donde Certbot alojará la configuración de los certificados y donde pondremos la configuración de nuestro servidor Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data/certbot/www/.well-known
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Es muy importante que esté creado el directorio .well-known ya que en el mismo se guardará el challenge que Let’s encrypt utiliza para corroborar que tenemos control sobre el dominio. Es útil conocer los diferentes tipos de &lt;em&gt;challenges&lt;/em&gt; que existen para elegir el más adecuado según el caso, es decir, el tipo de validación que Let’s Encrypt utiliza para verificar el control sobre el dominio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Luego, &lt;strong&gt;crearemos el archivo de configuración&lt;/strong&gt; de Nginx dentro del directorio recién creado, con el siguiente contenido:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
  listen 80;
  server_name NOMBRE_DEL_HOST;
  location / {
    return 301 https:// NOMBRE_DEL_HOST;
  }
  location /.well-known/acme-challenge/ {
    root /var/www/certbot;
  }
}
server {
  listen 443 ssl;
  server_name NOMBRE_DEL_HOST;
  location / {
    proxy_pass http://NOMBRE_DEL_HOST;
  }
  ssl_certificate /etc/letsencrypt/live/NOMBRE_DEL_HOST/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/NOMBRE_DEL_HOST/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;El archivo de configuración deberá estar en dicho directorio: &lt;br&gt;
 &lt;code&gt;data/nginx/web.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Una vez listo, pasaremos a &lt;strong&gt;crear el Compose&lt;/strong&gt; que vamos a utilizar:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: "3"
services:
  nginx:
     image: nginx:1.15-alpine
     ports:
       - "80:80"
       - "443:443"
     volumes:
       - ./data/nginx:/etc/nginx/conf.d
       - ./data/certbot/conf:/etc/letsencrypt
       - ./data/certbot/www:/var/www/certbot
     command: "/bin/sh -c 'while :; do sleep 6h &amp;amp; wait $${!}; nginx -s reload; done &amp;amp; nginx -g \"daemon off;\"'"

  certbot:
     image: certbot/certbot
     volumes:
       - ./data/certbot/conf:/etc/letsencrypt
       - ./data/certbot/www:/var/www/certbot
     entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h &amp;amp; wait $${!}; done;'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Creado el Compose, no lo ejecutaremos, porque fallará la creación del Nginx debido a que no se encuentra creado el certificado que declaramos anteriormente en el archivo de configuración de Nginx.&lt;/p&gt;



&lt;p&gt;Vamos a explicar un poco lo que hicimos en ese Compose: cruzamos datos entre Certbot y Nginx mediante los directorios creados anteriormente. Esto se debe a que necesitamos que el contenedor Nginx pueda acceder a los certificados y el &lt;em&gt;challenge&lt;/em&gt; creados por el contenedor de Certbot.&lt;/p&gt;

&lt;p&gt;En el contenedor de Certbot agregamos un &lt;em&gt;entrypoint&lt;/em&gt; el cual verifica cada 12 horas si se puede renovar el certificado.&lt;/p&gt;

&lt;p&gt;Por su parte, en el contenedor de Nginx agregamos un command el cual permite iniciar Nginx en primer plano y recarga su configuración y certificados cada 6 horas en segundo plano, asegurando que siempre tenga los nuevos certificados que se generen.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Finalmente, debemos &lt;strong&gt;crear el siguiente script&lt;/strong&gt; cambiando los valores de &lt;em&gt;domains&lt;/em&gt; y &lt;em&gt;email&lt;/em&gt;:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;El script debe estar en el mismo directorio donde se encuentra el docker-compose y el directorio data que creamos anteriormente. Vamos a darle permiso de ejecución al script y luego ejecutarlo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod +x init-letsencrypt.sh 
sudo ./init-letsencrypt.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Como dijimos anteriormente, si queremos utilizar el comando &lt;code&gt;docker-compose up&lt;/code&gt;no funcionará porque no se encuentran creados los certificados que seteamos en la configuración de Nginx. Ahí es donde entra en juego el script. Este script lo que hace es crear certificados &lt;em&gt;dummies&lt;/em&gt; utilizando el contenedor de Certbot, para poder inicializar el contenedor de Nginx sin errores. Luego de que el contenedor esté inicializado, elimina los certificados &lt;em&gt;dummies&lt;/em&gt;, le pide a Let’sEncrypt certificados para nuestro dominio y reinicia la configuración del contenedor de Nginx para recargar los certificados válidos. De este modo, no va a ser necesario utilizar dicho comando.&lt;/p&gt;

&lt;p&gt;Si al ejecutar el script falla la creación de los certificados, es &lt;strong&gt;muy importante&lt;/strong&gt; que lean y resuelvan el inconveniente antes de volver a ejecutarlo, ya que Let’sEncrypt bloqueará el dominio si hacen más de 5 intentos fallidos.&lt;/p&gt;



&lt;p&gt;Por último, cabe aclarar que en este artículo tomamos información de varias fuentes, recopilando aquellas más completas para que este paso a paso resulte más fácil y práctico. Espero que les sea útil y cualquier consulta no duden en dejarla en los comentarios. &lt;/p&gt;

&lt;p&gt;Para más info sobre este tema recomendamos nuestra nota en Medium:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/eudaimonia-ar/certificar-dominios-con-letsencrypt-y-nginx-con-docker-compose-a6a948f47f2f" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fda%3Atrue%2Fresize%3Afill%3A88%3A88%2F0%2AUeHcy5z_c99rU7e1" alt="Matias Quintana"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/eudaimonia-ar/certificar-dominios-con-letsencrypt-y-nginx-con-docker-compose-a6a948f47f2f" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Certificación de dominio con Let’s Encrypt, NGINX y Docker Compose | by Matias Quintana | Euda | Medium&lt;/h2&gt;
      &lt;h3&gt;Matias Quintana ・ &lt;time&gt;Sep 3, 2020&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;¡Muchos éxitos!&lt;/p&gt;

</description>
      <category>espanol</category>
      <category>docker</category>
      <category>certificacion</category>
      <category>devops</category>
    </item>
    <item>
      <title>Development &amp; Operations</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Mon, 29 Jun 2020 17:56:52 +0000</pubDate>
      <link>https://dev.to/euda_ar/development-operations-48m2</link>
      <guid>https://dev.to/euda_ar/development-operations-48m2</guid>
      <description>&lt;p&gt;&lt;em&gt;A short and quick guide to dive into the DevOps world.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this post I'll tell you what does it mean to be a DevOps engineer in a software factory, how to build the structure to support any app development and, finally, some recommendations and good practices to become a pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  My work as DevOps
&lt;/h2&gt;

&lt;p&gt;The DevOps engineer is in charge of implementing best practices to integrate development (Dev) and operations (Ops) by accelerating deliveries through automation, collaboration and iterative improvement and achieving a more efficient way of working throughout the development life cycle.&lt;/p&gt;

&lt;p&gt;My work as DevOps engineer in the company involves infrastructure configuration and maintenance tasks, as well as automation of different projects' workflows and the construction of software life cycles, based on CI / CD with AWS, Digital Ocean, Bitbucket Pipelines and Jenkins. In addition to automating and streamlining the procedures and processes of software development, I am also responsible for maintaining implementation and monitoring tools.&lt;/p&gt;

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

&lt;p&gt;Specializing in DevOps can help you target a growing working market with great opportunities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;Continuous integration servers, containers and tools. These are the three legs needed to structure any development. AWS, Digital Ocean, Docker and Jenkins are the ones we choose. For starters, I recommend using Docker, Jenkins, and any server you have access to, like AWS or Digital Ocean.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;What is Docker?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;It's a container management service that allows developers to create applications, ship them to containers, and run them anywhere. Thus, it allows you to create your own custom environments that can include a variety of operating systems and development frameworks.&lt;/p&gt;

&lt;p&gt;Docker containers are quite light and can be deployed on any physical and virtual machine, even in the cloud. To deepen about this tool, I recommend you read another of our articles with everything you need to know about Docker:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/eudaimonia-ar/everything-you-need-to-know-about-docker-dedf273cd6d0" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A88%3A88%2F1%2ADRcWPlwEgm_jXrYLaWdDBA.png" alt="Euda"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/eudaimonia-ar/everything-you-need-to-know-about-docker-dedf273cd6d0" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Everything you need to know about Docker | by Euda | Euda | Medium&lt;/h2&gt;
      &lt;h3&gt;Euda ・ &lt;time&gt;Oct 16, 2019&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  &lt;em&gt;What is Jenkins?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Jenkins is an open source, java-based tool that enables CI / CD streams. It is one of the most used at present since, through plugins, it has a wide integrity with different tools (GIT - Nexus - Database - AWS - Azure - etc.). For large developments that require complex architecture, Jenkins has the ability to connect to different environments and orchestrate the development life cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good practices and recommendations
&lt;/h2&gt;

&lt;p&gt;As in all tasks, there are good practices to follow. In my opinion, all DevOps engineers should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Work together with the different areas / teams to find out their needs. These are the foundation of every DevOps task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Know different tools, their strengths and weaknesses, and keep updated on them. Here you can see a &lt;a&gt;periodic table with all the available DevOps' tools&lt;/a&gt;, each one has some info so that you can choose the most convenient for your project.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do not always apply the same formula to all projects. In any development company there usually are several projects and teams working simultaneously. Not all projects are the same, so it's important to be in contact with all of them to carry out an analysis of each particular project, taking into account its scalability to use the appropriate tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate everything you can reducing times and errors that can be made in manual implementations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do not uphold the implementation done. Constant monitoring, analyzing logs, metrics or developers feedback are always necessary to make improvements to the flow.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What differentiates a Junior DevOps from a Senior?
&lt;/h2&gt;

&lt;p&gt;In essence, a senior DevOps engineer analyzes any given problem holistically and trying to understand how changes can be made at an enterprise level, and not simply trying to solve the given problem one time. Frankly, this skill is less technical and more about evaluating and solving problems.&lt;/p&gt;

&lt;p&gt;To have a deeper understanding of everything that needs to be learned to become a complete DevOps, you can &lt;a href="https://roadmap.sh/devops" rel="noopener noreferrer"&gt;see here a roadmap&lt;/a&gt; with the languages ​​and programs that are recommended take into account. Nothing is accomplished overnight. There is a lot of information available so it's useful to get organized and learn little by little.&lt;/p&gt;

&lt;p&gt;On the other hand, the article below is very complete and interesting to delve into the subject. It's based on the same roadmap shared above but with extra suggestions and courses' links:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/hackernoon/the-2018-devops-roadmap-31588d8670cb" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fda%3Atrue%2Fresize%3Afill%3A88%3A88%2F0%2Au9Ha3uTCjEmW_3gn.gif" alt="javinpaul"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/hackernoon/the-2018-devops-roadmap-31588d8670cb" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The 2023 DevOps RoadMap | Javarevisited&lt;/h2&gt;
      &lt;h3&gt;javinpaul ・ &lt;time&gt;Apr 30, 2024&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;To finish, if your are ready, here are &lt;a href="https://javarevisited.blogspot.com/2018/09/10-devops-courses-for-experienced-java-developers.html" rel="noopener noreferrer"&gt;10 online courses&lt;/a&gt; to start or keep learning. Thanks for reading till the end! I hope you found this useful and any questions you may have do not hesitate to comment. &lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Working from home during lockdown</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Wed, 10 Jun 2020 15:19:30 +0000</pubDate>
      <link>https://dev.to/euda_ar/woking-from-home-during-lockdown-28da</link>
      <guid>https://dev.to/euda_ar/woking-from-home-during-lockdown-28da</guid>
      <description>&lt;p&gt;Several months have passed and for those of us who work on IT, we will surely have to work from home for a while longer. It is likely that you have already adapted to remote work, however, it never hurts to review some tips for working remotely, being more productive and feeling better both at work and on a daily basis. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Manage times and spaces&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The first #Eudatip to work from home in quarantine is to plan a routine that includes breaks at limited hours. This can be based on meals, for example, it's important to plan breakfast, lunch and snacks so that they are always at the same time, and avoid eating in front of the computer! Try to make the work and rest spaces different so that the rest becomes more effective.&lt;/p&gt;

&lt;p&gt;Sometimes the comfort of the home can backfire. If you don't have colleagues or partners around you, it's easy to get distracted. There are always other things to do, like doing laundry, dishes, etc. Therefore, you have to do your best to put them on pause until finish or do them during breaks. Setting an alarm on your phone or computer can help you organize better.&lt;/p&gt;

&lt;p&gt;Another tip is to get up and put on an outfit different from the one you wear to sleep. It can be other pajamas, more comfortable pants, whatever you want! The goal is to start the day with renewed energies.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;strong&gt;Do not lose communication&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keeping fluid contact with your team is vital. Here are some tools and tips that we apply as a company and may help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Slack or any messaging tool of your choice. Communication is very important when you work remotely, especially because if you are not there, your team may forget about you. It is important that they know that you are available so that they can contact you. At Eudaimonia every day we greet each other with a “Good day” in the main channel and we say goodbye when our schedule ends.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google Hangouts / Meet, if you have a business Gsuite, Zoom or other video conferencing apps. In this context, meetings are more important than ever. I'm not saying that several calls are necessary per day or per topic, especially when some issues can usually be solved with just an email. But the meetings that have already been set, daily if possible, must be an opportunity to take advantage of. It works to write down everything you did the day before so that you can share it at the meeting and that everyone is aware of the progress each one made.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Kanban, to sort the tasks and priorities of each project. If you do not have a defined work plan from the beginning, it is best that as you begin to have requirements to write them in a Kanban. Trello is a very helpful tool, because it allows you to have visibility of what everyone is doing and measure the progress of each project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Online news portals to keep you informed. Reading the news every day before starting helps us not to lose communication with the outside world and can be used to share interesting articles with your colleagues and generate conversation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  &lt;strong&gt;Knowing when and how to stop&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is one of the most difficult things since sometimes we just get carried away and work more than our stipulated time. Chances are that whatever you're doing after 12–13 hours of continuous work won't be the best quality, plus you'll be overloading yourself for the next day. Working remotely could make some people assume that you are available at any time of the day, but you are not.&lt;/p&gt;

&lt;p&gt;On the other hand, a good tip is to end the day with a little exercise. If we jump directly from screen to screen, our eyes get tired and can cause headaches. If you do not like to exercise, with some spinal stretching that you can easily find on youtube is more than enough. There are no excuses! You can find short routines of up to 7 minutes. You'll feel less contracted and in a better mood.&lt;/p&gt;

&lt;p&gt;To sum up, we know that working from home has its pros and cons, but the key is to keep trying until you find out what works best. Once you do, you're probably going to be able to work wherever you want. After a while you will realize that you can be much more productive than you thought.&lt;/p&gt;

&lt;p&gt;Have you already put into practice any of these tips? Do you have any to add? Tell us in the comments below.&lt;/p&gt;

</description>
      <category>tools</category>
      <category>workfromhome</category>
      <category>startup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>📌📌ATENCIÓN: OFERTA LABORAL📌📌</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Fri, 13 Mar 2020 14:48:49 +0000</pubDate>
      <link>https://dev.to/euda_ar/atencion-oferta-laboral-247a</link>
      <guid>https://dev.to/euda_ar/atencion-oferta-laboral-247a</guid>
      <description>&lt;p&gt;En &lt;a href="https://www.eudaimonia.com.ar/"&gt;Eudaimonia&lt;/a&gt; nos encontramos en la búsqueda de los siguientes perfiles:&lt;/p&gt;

&lt;p&gt;-iOS Dev &lt;br&gt;
-Android Dev &lt;br&gt;
-Fullstack Dev &lt;/p&gt;

&lt;p&gt;📌¿Qué ofrecemos?&lt;/p&gt;

&lt;p&gt;✅Flex Time ⏱&lt;br&gt;
✅Home Office🏡&lt;br&gt;
✅Almuerzo los Viernes 🍝&lt;br&gt;
✅Capacitaciones&lt;/p&gt;

&lt;p&gt;¿Remuneración? La que nos digas en base a tu experiencia y conocimiento.&lt;/p&gt;

&lt;p&gt;📍Palermo, Capital Federal, Buenos Aires, Argentina. &lt;/p&gt;

&lt;p&gt;Si estas interesado/a y cumplís con los requisitos, enviá tu CV indicando puesto, remuneración pretendida y seniority a &lt;a href="mailto:micaelaj@eudaimonia.com.ar"&gt;micaelaj@eudaimonia.com.ar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Más información en &lt;a href="https://www.eudaimonia.com.ar/"&gt;https://www.eudaimonia.com.ar&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>argentina</category>
      <category>trabajo</category>
      <category>womenintech</category>
    </item>
    <item>
      <title>Improve your performance with Scrum Methodology</title>
      <dc:creator>Euda</dc:creator>
      <pubDate>Fri, 24 Jan 2020 17:00:54 +0000</pubDate>
      <link>https://dev.to/euda/improve-your-performance-with-scrum-methodology-idg</link>
      <guid>https://dev.to/euda/improve-your-performance-with-scrum-methodology-idg</guid>
      <description>&lt;p&gt;&lt;em&gt;Learn how to incorporate this agile methodology to enhance your work performance. Here are some popular tools and recommendations for integrating agile philosophies' elements into your work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Scrum methodology can help either large or small teams to achieve their work goals, satisfy their clients and develop a better team relationship. But, how?&lt;/p&gt;

&lt;p&gt;First of all, let's review what Scrum is.&lt;/p&gt;

&lt;p&gt;Born for software development, Scrum is a framework within which people can address complex adaptive problems, while productively and creatively delivering products of the highest possible value. This means, usable and worthy products, in which progress is acknowledgeable. Scrum employs an iterative, incremental approach to optimize predictability and control risk. Three pillars uphold every implementation of empirical process control: transparency, inspection, and adaptation.&lt;/p&gt;

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

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

&lt;p&gt;How does it work? Easy. You probably already apply scrum philosophy on your work with small differences or by calling it with different names. It's all about organizing work based in the previously specified objectives or goals. Two Scrum elements you can easily incorporate into your work management are: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defining a Product Backlog:&lt;/strong&gt; these are the objectives and scope of the product or service to be developed. What you want to achieve, based on the budget and customer needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organizing work into Sprints:&lt;/strong&gt; each of the phases of the project where the advances are presented to the client. This proves it as it is and suggests changes. These receive a priority according to their importance, and become urgent or are assigned to a second backlog. Dividing the product into sprints will help you reach the desired product through recurring iterations.&lt;/p&gt;

&lt;p&gt;Another important part of the Scrum Methodology are &lt;em&gt;team members and their roles&lt;/em&gt;. The Scrum Team is divided into three parts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product Owner:&lt;/strong&gt; is the person who knows the business best and decides what improvement or task has to be done in each sprint. It is the channel between managers, investors, clients and development team. Being the person who knows the market and the product best, he/she is the one who makes the final decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development Team:&lt;/strong&gt; it is recommended to be integrated between 3 and 9 members. It has to be a multifunctional team with defined internal roles required to get the job done (Frontend developers, Backend developers, QA). The interesting thing about this team is its self-management. They themselves decide the work done in each sprint (based on the priorities defined by the Product Owner), and they themselves decide how to perform each of the tasks. It is a team work, without hierarchies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scrum Master:&lt;/strong&gt; being a process that comes out of the ordinary, it is normal that there is resistance from the company or from the Scrum Team members themselves. This is where the Scrum Master comes in, to ensure that everyone follows the process correctly, gives continuous coaching when there is a blockage and eliminate any impediments that arise throughout the sprint.&lt;/p&gt;

&lt;p&gt;Depending on the size of your company and team members you can easily adapt each role and its functions. For instance, maybe in small teams Scrum Master and Product Owner tasks can be handled by a Project Manager.&lt;/p&gt;

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

&lt;p&gt;It's essential that all employees are aware of the adopted methodology and its advantages. Giving a workshop explaining how it works and how your company will put it into practice is a great starting point. This may be a very important first task for the designated Scrum Master.&lt;/p&gt;

&lt;p&gt;Also, &lt;em&gt;meetings are crucial&lt;/em&gt;. Depending on the team size, meetings can be daily, weekly, or one per sprint. It's a matter of trying what's best for each team. However, it is highly recommended to share individual progress within the team on a daily basis. These are two of the Scrum meetings to get inspired by or try implementing: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint Review:&lt;/strong&gt; is held at the end of the Sprint to inspect the Increment and adapt the Product Backlog if needed. During the Sprint Review, the Scrum Team and stakeholders collaborate about what was done in the Sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint Retrospective:&lt;/strong&gt; is an opportunity for the Scrum Team to inspect itself and create a plan for improvements to be enacted during the next Sprint. Often occurs after the Sprint Review and prior to the next Sprint Planning.&lt;/p&gt;

&lt;p&gt;Moreover, to start improving your performance, any agile methodology requires of some &lt;em&gt;basic tools&lt;/em&gt; in order to get an effective comunication between team members and get the work done. Here are some of the most popular ones: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K-xTpwyE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6mxu839d7xrhk5uu6k2u.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K-xTpwyE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6mxu839d7xrhk5uu6k2u.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trello, Jira:&lt;/strong&gt; get a better project control with a Trello or Jira board, organizing board columns based in the Kanban Methodology: organize work into Backlog, Doing and Done. This way, each card is a task to do, running or finished, helping the team know at a glance the project status and pending tasks. Kanban is widely used within the Scrum methodology, although it also works outside it independently. You may also add more columns, for other stages such as QA, In review and even one for each sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jenkins:&lt;/strong&gt; a type of open source software, Continuous Integration oriented. This allows to approach different goals such as early feedback, avoiding merge hell, enabling &lt;em&gt;merciless refactoring&lt;/em&gt; among a team and ensuring working software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git:&lt;/strong&gt; another very standardized software to use agile methodology in programming. Besides the benefits of flexibility and distribution, there are key functions of Git that support and enhance agile development. Changes can get pushed down the deployment pipeline faster than working with monolithic releases and centralized version control systems.&lt;/p&gt;

&lt;p&gt;Hope you found this useful! Do not wait and start getting great results by incorporating some elements of this agile methodology in your projects. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.scrumguides.org/scrum-guide.html%C2%A0"&gt;https://www.scrumguides.org/scrum-guide.html &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hablemosdeempresas.com/empresa/conceptos-basicos-agile/%C2%A0"&gt;https://hablemosdeempresas.com/empresa/conceptos-basicos-agile/ &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.muktek.com/scrum-para-principiantes-qu%C3%A9-es-y-c%C3%B3mo-funciona-ec1eb8a70702%C2%A0"&gt;https://blog.muktek.com/scrum-para-principiantes-qu%C3%A9-es-y-c%C3%B3mo-funciona-ec1eb8a70702 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/agile/software-development/git%C2%A0"&gt;https://www.atlassian.com/agile/software-development/git &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.agilealliance.org/jenkins-you-can-take-the-evening-off/"&gt;https://www.agilealliance.org/jenkins-you-can-take-the-evening-off/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;More about Eudaimonia: &lt;a href="https://www.eudaimonia.com.ar"&gt;https://www.eudaimonia.com.ar&lt;/a&gt;&lt;/p&gt;

</description>
      <category>scrum</category>
      <category>agile</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
