<?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: .·. Felipe Paz .·.</title>
    <description>The latest articles on DEV Community by .·. Felipe Paz .·. (@felipepaz).</description>
    <link>https://dev.to/felipepaz</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%2F342892%2F4634f745-ab33-4b74-9cdb-294cc1af0c44.jpeg</url>
      <title>DEV Community: .·. Felipe Paz .·.</title>
      <link>https://dev.to/felipepaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipepaz"/>
    <language>en</language>
    <item>
      <title>Clonando repositório do Github sem senha</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Mon, 03 Mar 2025 13:54:14 +0000</pubDate>
      <link>https://dev.to/felipepaz/clonando-repositorio-do-github-sem-senha-gp4</link>
      <guid>https://dev.to/felipepaz/clonando-repositorio-do-github-sem-senha-gp4</guid>
      <description>&lt;h2&gt;
  
  
  Como Configurar uma Chave SSH para o GitHub
&lt;/h2&gt;

&lt;p&gt;Se você quer evitar digitar sua senha toda vez que interage com um repositório privado no GitHub ou precisa configurar uma deploy key para automação, esse guia vai te ajudar a fazer isso do jeito certo.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Criando a Chave SSH
&lt;/h2&gt;

&lt;p&gt;Abra o terminal e rode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"seu-email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vai aparecer algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/seu-usuario/.ssh/id_ed25519):
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pressione &lt;strong&gt;Enter&lt;/strong&gt; para salvar no local padrão ou defina outro caminho se quiser. Depois, pode ser que ele peça uma senha para a chave – é opcional.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Adicionando a Chave ao SSH-Agent
&lt;/h2&gt;

&lt;p&gt;Agora, precisamos garantir que o SSH-Agent está rodando e adicionar a chave:&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;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a chave estiver salva em outro local, ajuste o caminho.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Adicionando a Chave ao GitHub
&lt;/h2&gt;

&lt;p&gt;Copie sua chave pública para adicionar no GitHub:&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;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vá para o &lt;strong&gt;GitHub → Settings → SSH and GPG keys → New SSH Key&lt;/strong&gt;, cole a chave e salve.&lt;/p&gt;

&lt;p&gt;Se for uma &lt;strong&gt;Deploy Key&lt;/strong&gt; (para um único repositório), vá até o repositório no GitHub, depois em &lt;strong&gt;Settings → Deploy Keys → Add Deploy Key&lt;/strong&gt;, cole a chave e, se precisar de escrita, marque a opção &lt;strong&gt;Allow write access&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ Testando a Conexão
&lt;/h2&gt;

&lt;p&gt;Para garantir que tudo está configurado corretamente, rode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se deu certo, você verá algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi &amp;lt;seu-usuario&amp;gt;! You've successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5️⃣ Alterando o &lt;code&gt;git remote&lt;/code&gt; para SSH
&lt;/h2&gt;

&lt;p&gt;Se você já clonou o repositório via HTTPS e quer mudar para SSH, rode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin git@github.com:SEU-USUARIO/SEU-REPOSITORIO.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para conferir se foi atualizado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora teste se funciona:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Se não deu erro, pronto! Agora suas interações com o GitHub serão feitas via SSH. 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  6️⃣ Configurando Múltiplos Usuários no GitHub
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com mais de uma conta do GitHub (exemplo: pessoal e trabalho), pode configurar múltiplas chaves SSH e usá-las de acordo com o repositório. Para isso, siga os passos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Criar outra chave SSH
&lt;/h3&gt;

&lt;p&gt;Gere uma nova chave para a segunda conta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"email-da-outra-conta@example.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/id_ed25519_outro_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione a nova chave ao SSH-Agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-add ~/.ssh/id_ed25519_outro_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora copie a chave pública e adicione na outra conta do GitHub:&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;cat&lt;/span&gt; ~/.ssh/id_ed25519_outro_usuario.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Configurar o arquivo &lt;code&gt;~/.ssh/config&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Crie (ou edite) o arquivo &lt;code&gt;~/.ssh/config&lt;/code&gt; para diferenciar os usuários:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;Host&lt;/span&gt; &lt;span class="err"&gt;github-pessoal&lt;/span&gt;
    &lt;span class="err"&gt;HostName&lt;/span&gt; &lt;span class="err"&gt;github.com&lt;/span&gt;
    &lt;span class="err"&gt;User&lt;/span&gt; &lt;span class="err"&gt;git&lt;/span&gt;
    &lt;span class="err"&gt;IdentityFile&lt;/span&gt; &lt;span class="err"&gt;~/.ssh/id_ed25519&lt;/span&gt;

&lt;span class="err"&gt;Host&lt;/span&gt; &lt;span class="err"&gt;github-trabalho&lt;/span&gt;
    &lt;span class="err"&gt;HostName&lt;/span&gt; &lt;span class="err"&gt;github.com&lt;/span&gt;
    &lt;span class="err"&gt;User&lt;/span&gt; &lt;span class="err"&gt;git&lt;/span&gt;
    &lt;span class="err"&gt;IdentityFile&lt;/span&gt; &lt;span class="err"&gt;~/.ssh/id_ed25519_outro_usuario&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Alterar a URL do &lt;code&gt;git remote&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Para um repositório da conta pessoal, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin git@github-pessoal:SEU-USUARIO/SEU-REPOSITORIO.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para um repositório da conta do trabalho, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin git@github-trabalho:EMPRESA/REPOSITORIO.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, toda vez que interagir com um repositório, o Git saberá qual chave usar! 🎯&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
    </item>
    <item>
      <title>Implemeting GitOps with Argocd</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Thu, 25 Jul 2024 20:23:40 +0000</pubDate>
      <link>https://dev.to/felipepaz/implemeting-gitops-with-argocd-gj9</link>
      <guid>https://dev.to/felipepaz/implemeting-gitops-with-argocd-gj9</guid>
      <description>&lt;p&gt;This project aims to demonstrate how to integrate GitOps concepts using GitHub Actions, ArgoCD, and Kubernetes.&lt;/p&gt;

&lt;p&gt;Through this guide, you’ll be able to trigger changes automatically via GitHub Actions and ArgoCD. In this example, we will run Kubernetes and ArgoCD through Minikube.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Fx86-64%2Fstable%2Fbinary+download" rel="noopener noreferrer"&gt;Minikube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/tools/" rel="noopener noreferrer"&gt;Kubectl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com" rel="noopener noreferrer"&gt;Github account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com" rel="noopener noreferrer"&gt;Dockerhub account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  External setup
&lt;/h2&gt;

&lt;p&gt;Navigate to your Dockerhub panel and create a &lt;a href="https://app.docker.com/settings/personal-access-tokens" rel="noopener noreferrer"&gt;personal token&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%2Feasu98ezmxi2muzpii2e.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%2Feasu98ezmxi2muzpii2e.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a fork of this project and navigate to the project's settings page.&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%2Fhltdxjugg58ehsycg0nt.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%2Fhltdxjugg58ehsycg0nt.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;Secrets and variables&lt;/code&gt; &amp;gt; &lt;code&gt;Actions&lt;/code&gt; and create 3 variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DOCKER_USERNAME&lt;/code&gt; - Your Dockerhub username&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DOCKER_REGISTRY&lt;/code&gt; - docker.io&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DOCKER_PASSWORD&lt;/code&gt; - Personal token created in the previous step&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%2Fuploads%2Farticles%2Fisw786wl2w2qghc8gqy4.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%2Fisw786wl2w2qghc8gqy4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Local setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Initalize docker&lt;/li&gt;
&lt;li&gt;Initialize minikube&lt;/li&gt;
&lt;/ul&gt;

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

minikube start


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

&lt;/div&gt;

&lt;p&gt;Once minikube is ready and running, install two project's dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Argocd&lt;/li&gt;
&lt;li&gt;Skater Reloader&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installing Argocd
&lt;/h3&gt;

&lt;p&gt;Navigate to the folder &lt;code&gt;infra/k8s&lt;/code&gt; and run the follwing:&lt;/p&gt;

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

kubectl apply &lt;span class="nt"&gt;-k&lt;/span&gt; kustomization.yaml


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Installing Skater Reloader
&lt;/h3&gt;

&lt;p&gt;Stakater Reloader can be applied using its remote configuration. To do that, run the following command:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Configuring Argocd
&lt;/h2&gt;

&lt;p&gt;First of all, you need to access the Argocd console. To do that, run the command:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

minikube service argocd-server &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;--url&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;The output will be something like this:&lt;/p&gt;

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

http://127.0.0.1:55643


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

&lt;/div&gt;

&lt;p&gt;Now, you can access the Argocd console using the link above.&lt;/p&gt;

&lt;p&gt;By default, Argocd has the admin user enabled and a default password. To visualize this password you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify the pod responsible for argocd-server&lt;/li&gt;
&lt;/ul&gt;

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

kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; argocd


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

&lt;/div&gt;

&lt;p&gt;The output will be something like this&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;NAME&lt;/th&gt;
&lt;th&gt;READY&lt;/th&gt;
&lt;th&gt;STATUS&lt;/th&gt;
&lt;th&gt;RESTARTS&lt;/th&gt;
&lt;th&gt;AGE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;argocd-application-controller-0&lt;/td&gt;
&lt;td&gt;1/1&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;125m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argocd-applicationset-controller-86fc5c85-bgt82&lt;/td&gt;
&lt;td&gt;1/1&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;125m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argocd-dex-server-7f4689df5-p8fwx&lt;/td&gt;
&lt;td&gt;1/1&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;125m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argocd-notifications-controller-59f78959c8-m2fsh&lt;/td&gt;
&lt;td&gt;1/1&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;125m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argocd-redis-74cb89f466-t549k&lt;/td&gt;
&lt;td&gt;1/1&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;125m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argocd-repo-server-6578ccfc67-txds5&lt;/td&gt;
&lt;td&gt;1/1&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;125m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argocd-server-854c79df45-ff5zs&lt;/td&gt;
&lt;td&gt;1/1&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;125m&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pod we need is the pod &lt;code&gt;argocd-server-854c79df45-ff5zs&lt;/code&gt;. Once you have identified the pod, run the following command to get the default password:&lt;/p&gt;

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

kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; argocd-server-854c79df45-ff5zs &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;--&lt;/span&gt; argocd admin initial-password


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

&lt;/div&gt;

&lt;p&gt;The output will be something like:&lt;/p&gt;

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

Sqfjox8ceceIosuW


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

&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;

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

kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; argocd get secret argocd-initial-admin-secret &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.data.password}"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;The output will be something like:&lt;/p&gt;

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

Sqfjox8ceceIosuW%


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

&lt;/div&gt;

&lt;p&gt;Ignore the final &lt;code&gt;%&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Given that, now you need to access the Argocd console. Go to the url created by minikube and enter &lt;code&gt;admin&lt;/code&gt; as username and the password displayed by the command above.&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%2Fmevefajlgs200jtnicji.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%2Fmevefajlgs200jtnicji.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As soon as you signin you will see a page like this&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%2Fpb3k9b1qp0lpio8v7mww.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%2Fpb3k9b1qp0lpio8v7mww.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your project, it will be blank as you are creating this project from scratch. In my screenshot, I have already created the application and because of that you can see it listed in the image.&lt;/p&gt;

&lt;p&gt;Navigate to the &lt;code&gt;Settings &amp;gt; Repositories&lt;/code&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%2F77yui121nn4iq14uxcoo.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%2F77yui121nn4iq14uxcoo.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;Connect Repo&lt;/code&gt;. In this step, you will need to create a ssh key and connect Argocd to your Github repository via ssh.&lt;/p&gt;

&lt;p&gt;Run the following command:&lt;/p&gt;

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

ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;your_email_here&amp;gt;"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; gitops-argocd &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;The output will be something like:&lt;/p&gt;

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

Generating public/private ed25519 key pair.
Your identification has been saved &lt;span class="k"&gt;in &lt;/span&gt;gitops-argocd
Your public key has been saved &lt;span class="k"&gt;in &lt;/span&gt;gitops-argocd.pub
The key fingerprint is:
SHA256:7FXbnyKfvckbD1eMhXvTDfyPqaS23sVCa0WGlBsK7UY &amp;lt;your_email_here&amp;gt;
The key&lt;span class="s1"&gt;'s randomart image is:
+--[ED25519 256]--+
|         .  ..   |
|        . E.oo . |
|         + .oo* .|
|       .  +..= Bo|
|        S.. o =.B|
|       . . . + ==|
|        .  .=.*o+|
|          .=o+=o+|
|         o+.oo *+|
+----[SHA256]-----+


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

&lt;/div&gt;

&lt;p&gt;Copy the key with .pub extension&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;cat &lt;/span&gt;gitops-argocd.pub


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

&lt;/div&gt;

&lt;p&gt;Navigate to your Github repository and click on &lt;code&gt;Settings&lt;/code&gt; &amp;gt; &lt;code&gt;Deploy keys&lt;/code&gt; &amp;gt; &lt;code&gt;Add deploy key&lt;/code&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%2F5ze4h6e7y1c6tb8ld0rq.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%2F5ze4h6e7y1c6tb8ld0rq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name it and paste the copied key.&lt;/p&gt;

&lt;p&gt;Now, go back to the Argocd console and click on &lt;code&gt;Connect Repo&lt;/code&gt;. Paste the key you generated and click on &lt;code&gt;Connect&lt;/code&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%2Fo8if81kx4r91ce55mb2z.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%2Fo8if81kx4r91ce55mb2z.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see the repository listed. Ensure you can see the status &lt;code&gt;Successful&lt;/code&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%2Fb50z3nabut5qgz7o2r6r.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%2Fb50z3nabut5qgz7o2r6r.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the 3 dots to open the menu and then Create Application&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%2Fy4n64ayikiafg0jl26o2.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%2Fy4n64ayikiafg0jl26o2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll be redirected to the dashboard page where you'll be able to create the application.&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%2F9b5tgvoh6koitdr7uhzx.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%2F9b5tgvoh6koitdr7uhzx.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Project field you need to select default.&lt;/p&gt;

&lt;p&gt;Scroll down until Source section&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%2Fiq2mav536nxy0b87gnvm.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%2Fiq2mav536nxy0b87gnvm.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill the fields as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revision: the branch you wanna sync, in this example we are syncing main&lt;/li&gt;
&lt;li&gt;Path: the folder location where Argocd can find the kubernetes manifests. In this project, we are pointing to &lt;code&gt;infra/k8s&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Destination section, fill out the fields with the follwing values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository URL: select in the combo box&lt;/li&gt;
&lt;li&gt;Namespace: defautl&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%2Fuploads%2Farticles%2Fpjjjazly4kkogs90x8ch.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%2Fpjjjazly4kkogs90x8ch.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scroll to the last section and make sure you have Directory selected.&lt;/p&gt;

&lt;p&gt;In the exclude field, add &lt;code&gt;kustomization.yaml&lt;/code&gt;. This is to avoid Argocd to recreate itself again.&lt;/p&gt;

&lt;p&gt;Once it's done, click on Create at the top of the modal and voilà, your application is almost done.&lt;/p&gt;

&lt;p&gt;Click on App Details, scroll until "SYNC POLICY" and in AUTOMATED click on SYNC. This will be enough to keep Argocd monitoring the repository / branch / path.&lt;/p&gt;

&lt;p&gt;Finally, your application will look like this:&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%2Ff2ogde892v9glj04lyp2.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%2Ff2ogde892v9glj04lyp2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you can't see this, just click on the SYNC button at the top of the page and Argocd will sync with your repository.&lt;/p&gt;

&lt;p&gt;As you have enabled the auto sync in the previous step, Argocd will watch the repository every 3 minutes. You can disable this just hitting the button App Details and disabling it in the POLICY SYNC section.&lt;/p&gt;

&lt;p&gt;Every time you want to sync your application, just click on SYNC and Argocd will update your manifests inside the kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to test it?
&lt;/h2&gt;

&lt;p&gt;There are three ways to run this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making any change in the src folder&lt;/li&gt;
&lt;li&gt;Creating a new tag&lt;/li&gt;
&lt;li&gt;Change kubernetes manifests in the infra/k8s&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Making any change in the src folder
&lt;/h3&gt;

&lt;p&gt;This is the easiest way to test it. Just make any change in the src folder and commit it. Open a PR and merge the changes into the main branch. This will trigger the pipeline and create the new docker image. It will push the image to the container registry, in this example we are using docker.io.&lt;/p&gt;

&lt;p&gt;THe pipeline will push the image to the docker registry and update the file infra/k8s/deployment.yaml and the main branch with the new image name.&lt;/p&gt;

&lt;p&gt;Argocd will detect the change and update the kubernetes deployment with the new image. The image tag name will be always &lt;code&gt;latest&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a new tag
&lt;/h3&gt;

&lt;p&gt;This is the second way to test it. Just create a new tag and push it. The process will follow the same previous flow, however, the image will take the tag as its tag's name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Change kubernetes manifests in the infra/k8s
&lt;/h3&gt;

&lt;p&gt;This is the third way to test it. Just make any change in the infra/k8s folder and push it to the repository. In this case, the Github Actions won't be triggered and Argocd will update whatever you changed.&lt;/p&gt;

&lt;p&gt;For example, let's assume you've changed a value in the configmap. Argocd will identify this and update only the configmap, as this is the only manifest updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to visualize the application?
&lt;/h2&gt;

&lt;p&gt;This project has a NodeJs appliaction showing a simples index.html page. In the configmap, there's a variable COLOR. This variable reflects to the index.html&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%2Flgffz1g1c1cgemrrevxf.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%2Flgffz1g1c1cgemrrevxf.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;COLOR will afect the title "GitOps - ArgoCD" and the "Check my Github".&lt;/p&gt;

&lt;p&gt;Minikube needs to provide a port and url to access the service from your local machine. To do that, run the command:&lt;/p&gt;

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

minikube service argocd-server &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;--url&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;The output will be something like this:&lt;/p&gt;

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

http://127.0.0.1:55643


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

&lt;/div&gt;

&lt;p&gt;Open this URL in your browser and check the application. To see all the flow working, try to change the color in the configmap and push the changes to the main branch. Wait for a moment until Argocd regocnizes the changes and start making the changes. You can follow this operation by accessing the Argocd console.&lt;/p&gt;

&lt;p&gt;Once the update is done, just refresh the express application's page and that's it. If you entered a valid color and followed this guide correctly, you will see the changes.&lt;/p&gt;

&lt;p&gt;You can see the full project &lt;a href="https://github.com/pazfelipe/gitops-argocd" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>argocd</category>
      <category>gitops</category>
      <category>githubactions</category>
      <category>express</category>
    </item>
    <item>
      <title>Circuit Breaker - Um apagador de fogo?</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Thu, 27 Jun 2024 21:58:05 +0000</pubDate>
      <link>https://dev.to/felipepaz/circuit-breaker-um-apagador-de-fogo-4m74</link>
      <guid>https://dev.to/felipepaz/circuit-breaker-um-apagador-de-fogo-4m74</guid>
      <description>&lt;h2&gt;
  
  
  Um Apagador de Fogo?
&lt;/h2&gt;

&lt;p&gt;E aí, pessoal! Já ouviram falar de Circuit Breakers no desenvolvimento de software? É um conceito super útil usado em microserviços para manter as coisas funcionando direitinho. Imagine que você está fazendo várias requisições para outro serviço, mas de repente esse serviço começa a falhar. Em vez de deixar todo o seu sistema desandar, um Circuit Breaker entra em ação e para de fazer requisições para o serviço com problema por um tempo. Isso ajuda o seu sistema a ficar estável e dá um tempinho para o serviço problemático se recuperar. Bem legal, né?&lt;/p&gt;

&lt;h2&gt;
  
  
  Por Que Usar um Circuit Breaker?
&lt;/h2&gt;

&lt;p&gt;Então, por que vale a pena usar um Circuit Breaker? Aqui estão alguns benefícios &lt;em&gt;top&lt;/em&gt; na hora de escolher por implementar ou não:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mais Estabilidade:&lt;/strong&gt; Parando as requisições para um serviço que está falhando, você evita que todo o sistema fique bagunçado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recuperação Mais Rápida:&lt;/strong&gt; Dá um tempo para o serviço com problema se recuperar, o que significa que ele pode voltar a funcionar mais rápido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gestão de Recursos:&lt;/strong&gt; Você economiza recursos do sistema ao não tentar infinitamente alcançar um serviço indisponível.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Melhor Experiência do Usuário:&lt;/strong&gt; Em vez do seu app travar, os usuários recebem uma resposta rápida ou uma mensagem alternativa, mantendo todos felizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Maneiras Mais Comuns de Usar Circuit Breaker
&lt;/h2&gt;

&lt;p&gt;Beleza, agora vamos falar sobre como você pode usar Circuit Breakers. Aqui estão alguns dos cenários mais comuns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chamadas de API:&lt;/strong&gt; Quando seu app depende de APIs externas, um Circuit Breaker pode parar de acessar uma API com problemas até que ela se recupere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conexões de Banco de Dados:&lt;/strong&gt; Se o seu banco de dados começar a dar problema, um Circuit Breaker pode interromper as operações até que a conexão estabilize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunicação entre Microserviços:&lt;/strong&gt; Em uma arquitetura de microserviços, os Circuit Breakers podem ajudar a gerenciar a comunicação entre os serviços e evitar falhas em cascata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serviços de Terceiros:&lt;/strong&gt; Se você está integrando serviços de terceiros, um Circuit Breaker pode te salvar dos problemas de tempo de inatividade deles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses são apenas alguns exemplos, mas, na real, qualquer lugar onde você faz chamadas de rede, um Circuit Breaker pode ser um salvador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde Não Usar Circuit Breaker
&lt;/h2&gt;

&lt;p&gt;Embora os Circuit Breakers sejam incríveis, eles nem sempre são a ferramenta certa para o trabalho. Aqui estão alguns cenários onde você pode querer evitá-los:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Operações Locais:&lt;/strong&gt; Para operações que não envolvem chamadas de rede ou serviços externos, um Circuit Breaker não é necessário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requisitos em Tempo Real:&lt;/strong&gt; Se você precisa de desempenho em tempo real sem atrasos, introduzir um Circuit Breaker pode adicionar uma latência indesejada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sistemas Simples:&lt;/strong&gt; Em uma aplicação simples e monolítica sem dependências complexas, os Circuit Breakers podem adicionar complexidade desnecessária.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lembre-se, os Circuit Breakers são melhores para gerenciar chamadas remotas e dependências externas. Se você não tem essas necessidades, provavelmente não precisa de um.&lt;/p&gt;

&lt;p&gt;E é isso sobre Circuit Breakers! Eles são como apagadores de fogo para o seu código, entrando em ação para evitar que pequenos problemas se transformem em grandes desastres. Usando-os de forma inteligente, você pode tornar suas aplicações mais resilientes e confiáveis.&lt;/p&gt;

&lt;p&gt;Se você ficou interessado em ver uma implementação prática, confira o projeto completo no GitHub: &lt;a href="https://github.com/pazfelipe/circuit-breaker.git"&gt;Circuit Breaker Example&lt;/a&gt;. O repositório inclui um guia passo a passo para configurar dois microserviços com Circuit Breakers usando Python (Flask) e Node.js (TypeScript e Express), todos gerenciados com Docker Compose.&lt;/p&gt;

&lt;p&gt;E se você preferir ler em inglês, dá uma olhada na versão em inglês deste post: &lt;a href="https://dev.to/felipepaz/circuit-breaker-a-fire-extinguisher-for-your-code-fna"&gt;Circuit Breaker - A Fire Extinguisher for Your Code?&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Que a força com você esteja!&lt;/p&gt;

</description>
      <category>circuitbreake</category>
      <category>python</category>
      <category>node</category>
      <category>designsystem</category>
    </item>
    <item>
      <title>Circuit Breaker - A Fire Extinguisher for Your Code?</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Thu, 27 Jun 2024 21:53:02 +0000</pubDate>
      <link>https://dev.to/felipepaz/circuit-breaker-a-fire-extinguisher-for-your-code-fna</link>
      <guid>https://dev.to/felipepaz/circuit-breaker-a-fire-extinguisher-for-your-code-fna</guid>
      <description>&lt;h2&gt;
  
  
  A Fire Extinguisher?
&lt;/h2&gt;

&lt;p&gt;Hey there! Ever heard about Circuit Breakers in software development? It's a super handy concept used in microservices to keep things running smoothly. Imagine you're making tons of requests to another service, but suddenly that service starts failing. Instead of letting your entire system go down the drain, a Circuit Breaker steps in and stops making requests to the failing service for a bit. This helps your system stay stable and gives the troubled service some time to recover. Pretty cool, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use a Circuit Breaker?
&lt;/h2&gt;

&lt;p&gt;So, why should you bother using a Circuit Breaker? Well, there are some great benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved Stability:&lt;/strong&gt; By stopping requests to a failing service, you prevent your whole system from going haywire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster Recovery:&lt;/strong&gt; It gives the failing service a break to recover, which means it can get back on track quicker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Management:&lt;/strong&gt; You save system resources by not endlessly trying to reach an unavailable service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better User Experience:&lt;/strong&gt; Instead of your app crashing, users get a quick response or a fallback message, keeping them happy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Ways to Use Circuit Breaker
&lt;/h2&gt;

&lt;p&gt;Alright, now let's talk about how you can use Circuit Breakers. Here are some of the most common scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Calls:&lt;/strong&gt; When your app depends on external APIs, a Circuit Breaker can stop hitting a failing API until it's back up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Connections:&lt;/strong&gt; If your database starts acting up, a Circuit Breaker can halt operations until the connection stabilizes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices Communication:&lt;/strong&gt; In a microservices architecture, Circuit Breakers can help manage the communication between services and prevent cascading failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party Services:&lt;/strong&gt; If you're integrating with third-party services, a Circuit Breaker can save you from their downtime issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are just a few examples, but really, anywhere you're making network calls, a Circuit Breaker can be a lifesaver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Not to Use a Circuit Breaker
&lt;/h2&gt;

&lt;p&gt;While Circuit Breakers are awesome, they’re not always the right tool for the job. Here are some scenarios where you might want to avoid using them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Operations:&lt;/strong&gt; For operations that don’t involve network calls or external services, a Circuit Breaker isn’t needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Requirements:&lt;/strong&gt; If you need real-time performance without any delays, introducing a Circuit Breaker might add unwanted latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple Systems:&lt;/strong&gt; In a simple, monolithic application without complex dependencies, Circuit Breakers can add unnecessary complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember, Circuit Breakers are best for managing remote calls and external dependencies. If you don't have these, you probably don't need one.&lt;/p&gt;

&lt;p&gt;And that's the lowdown on Circuit Breakers! They're like fire extinguishers for your code, stepping in to prevent small issues from turning into big disasters. By using them wisely, you can make your applications more resilient and reliable.&lt;/p&gt;

&lt;p&gt;If you're interested in seeing a practical implementation, check out the complete project on GitHub: &lt;a href="https://github.com/pazfelipe/circuit-breaker.git"&gt;Circuit Breaker Example&lt;/a&gt;. The repository includes a step-by-step guide on setting up two microservices with Circuit Breakers using Python (Flask) and Node.js (TypeScript and Express), all managed with Docker Compose.&lt;/p&gt;

&lt;p&gt;Also, check out the version of this post in Portuguese: &lt;a href="https://dev.to/felipepaz/circuit-breaker-um-apagador-de-fogo-4m74"&gt;Circuit Breaker - Um Apagador de Fogo?&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>circuitbreaker</category>
      <category>python</category>
      <category>node</category>
      <category>designsystem</category>
    </item>
    <item>
      <title>Getting Started with RabbitMQ and Python: A Practical Guide</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Fri, 21 Jun 2024 16:34:41 +0000</pubDate>
      <link>https://dev.to/felipepaz/getting-started-with-rabbitmq-and-python-a-practical-guide-57fi</link>
      <guid>https://dev.to/felipepaz/getting-started-with-rabbitmq-and-python-a-practical-guide-57fi</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this article, we will guide you through setting up and using RabbitMQ with Python. RabbitMQ is a powerful message broker that allows applications to communicate with each other via messages. This practical guide will show you how to connect to RabbitMQ, publish messages to a queue, and consume messages from a queue using Python. Additionally, we will use Docker to manage RabbitMQ in a containerized environment, ensuring a smooth and isolated setup. Whether you are new to message brokers or looking to integrate RabbitMQ into your Python projects, this guide will provide you with a solid foundation to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this article, we will cover the essentials of setting up and using RabbitMQ with Python. You will learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up your development environment.&lt;/li&gt;
&lt;li&gt;Use Docker to run RabbitMQ in a container.&lt;/li&gt;
&lt;li&gt;Connect to RabbitMQ from a Python application.&lt;/li&gt;
&lt;li&gt;Publish messages to a queue.&lt;/li&gt;
&lt;li&gt;Consume messages from a queue.&lt;/li&gt;
&lt;li&gt;Access the RabbitMQ management console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end of this guide, you will have a working example of a RabbitMQ setup with Python and Docker, and you will be ready to integrate these tools into your own projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, make sure you have the following tools and technologies installed on your system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.8+: Ensure you have Python installed. You can download it from the official Python website.&lt;/li&gt;
&lt;li&gt;Docker: Docker is required to run RabbitMQ in a containerized environment. You can download and install Docker from the official Docker website.&lt;/li&gt;
&lt;li&gt;Docker Compose: Docker Compose is used to manage multi-container Docker applications. It is included with Docker Desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having these prerequisites installed will ensure a smooth setup and execution of the examples provided in this guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment Setup
&lt;/h2&gt;

&lt;p&gt;To get started, follow these steps to set up your development environment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create and activate the virtual environment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Creating a virtual environment helps to isolate your project’s dependencies. Here’s how you can create and activate a virtual environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create the virtual environment:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activate the virtual environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On Windows:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;.venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;On macOS/Linux:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;




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

&lt;ol&gt;
&lt;li&gt;Install the dependencies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next, install the required Python packages. For this project, we will use the pika library to interact with RabbitMQ.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install the required packages:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;pika
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save the installed packages to requirements.txt:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;With the environment set up and dependencies installed, you’re ready to move on to the next steps in configuring RabbitMQ with Docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker Setup
&lt;/h2&gt;

&lt;p&gt;In this section, we will configure and start RabbitMQ using Docker. This allows us to easily manage and isolate RabbitMQ in a containerized environment.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a file named &lt;code&gt;docker-compose.yaml&lt;/code&gt; in the root of your project directory. Add the following content to the file:&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.8'&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;rabbitmq&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;rabbitmq:3-management&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;rabbitmq&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;5672:5672'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;15672:15672'&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;RABBITMQ_DEFAULT_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guest&lt;/span&gt;
      &lt;span class="na"&gt;RABBITMQ_DEFAULT_PASS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration sets up RabbitMQ with the management plugin enabled, allowing you to access the RabbitMQ management console on port 15672.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start the RabbitMQ container&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run the following command to build and start the RabbitMQ container:&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;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will download the RabbitMQ Docker image (if not already available locally), start the container, and run it in the background. The RabbitMQ server will be accessible at &lt;code&gt;localhost:5672&lt;/code&gt;, and the management console will be available at &lt;code&gt;http://localhost:15672&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With RabbitMQ running in a Docker container, you are ready to move on to the next steps of developing the application and integrating RabbitMQ with your Python code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Application Development
&lt;/h2&gt;

&lt;p&gt;In this section, we will develop the application that connects to RabbitMQ, publishes messages to a queue, and consumes messages from a queue. We’ll start by implementing a class to manage the connection and interactions with RabbitMQ.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implement the RabbitMQ class&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a file named &lt;code&gt;rabbitmq.py&lt;/code&gt; in the root of your project directory. Add the following content to the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RabbitMQ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RABBITMQ_USER&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RABBITMQ_PASSWORD&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RABBITMQ_HOST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RABBITMQ_PORT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5672&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PlainCredentials&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ConnectionParameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BlockingConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_closed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;consume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connection is not established.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_consume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_message_callback&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auto_ack&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_consuming&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connection is not established.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;durable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;routing_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BasicProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                                       &lt;span class="n"&gt;delivery_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# make message persistent
&lt;/span&gt;                                   &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sent message to queue &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This class handles connecting to RabbitMQ, publishing messages to a queue, and consuming messages from a queue. The connection parameters are read from environment variables.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create the main.py script&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a file named &lt;code&gt;main.py&lt;/code&gt; in the root of your project directory. Add the following content to the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rabbitmq&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RabbitMQ&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Received message: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;rabbitmq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RabbitMQ&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connection to RabbitMQ established successfully.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rabbitmq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;consume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test_queue&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to establish connection to RabbitMQ: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rabbitmq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script connects to RabbitMQ and starts consuming messages from a queue named &lt;em&gt;test_queue&lt;/em&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create the publisher.py script&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a file named &lt;code&gt;publisher.py&lt;/code&gt; in the root of your project directory. Add the following content to the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rabbitmq&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RabbitMQ&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;publish_test_message&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;rabbitmq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RabbitMQ&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rabbitmq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test_queue&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Test message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Test message published successfully.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to publish test message: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rabbitmq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;publish_test_message&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script publishes a test message to the &lt;em&gt;test_queue&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;With these scripts in place, you are ready to run and test your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the Application
&lt;/h2&gt;

&lt;p&gt;In this section, we will run the application to ensure everything is set up correctly and that we can successfully publish and consume messages using RabbitMQ.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start the RabbitMQ server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run the &lt;code&gt;main.py&lt;/code&gt; script to start the &lt;strong&gt;RabbitMQ&lt;/strong&gt; server and begin consuming messages from the &lt;em&gt;test_queue&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a message indicating that the connection to RabbitMQ was established successfully. The script will continue running and wait for messages to consume from the test_queue.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Publish a test message&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open a new terminal window or tab, and run the &lt;em&gt;publisher.py&lt;/em&gt; script to publish a test message to the &lt;em&gt;test_queue&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a message indicating that the test message was published successfully. The main.py script should also display the received message, indicating that the message was successfully consumed from the test_queue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Output
&lt;/h3&gt;

&lt;p&gt;When you run &lt;em&gt;main.py&lt;/em&gt;, you should see something 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;Connection to RabbitMQ established successfully.
Received message: b&lt;span class="s1"&gt;'Test message'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run &lt;em&gt;publisher.py&lt;/em&gt;, you should see something 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;Sent message to queue test_queue: Test message
Test message published successfully.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this guide, we covered the steps to set up and use RabbitMQ with Python. We demonstrated how to configure the development environment, run RabbitMQ in a Docker container, and create a simple application to publish and consume messages. This should give you a solid foundation to start integrating RabbitMQ into your own projects.&lt;/p&gt;

&lt;p&gt;For more information and advanced usage of RabbitMQ, please refer to the official &lt;a href="https://www.rabbitmq.com/docs"&gt;RabbitMQ documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Repository
&lt;/h2&gt;

&lt;p&gt;You can find the complete code for this project in the following GitHub repository: &lt;a href="https://github.com/pazfelipe/python-rabbitmq"&gt;python-rabbitmq&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This repository contains all the scripts and configurations discussed in this article, including the docker-compose.yaml, rabbitmq.py, main.py, publisher.py, and the README.md with detailed setup instructions. Feel free to clone the repository and experiment with the code to further your understanding of RabbitMQ and Python integration.&lt;/p&gt;

</description>
      <category>rabbitmq</category>
      <category>python</category>
    </item>
    <item>
      <title>Clustering Redis with Kubernetes</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Wed, 18 Jan 2023 13:55:50 +0000</pubDate>
      <link>https://dev.to/felipepaz/clustering-redis-with-kubernetes-3ihk</link>
      <guid>https://dev.to/felipepaz/clustering-redis-with-kubernetes-3ihk</guid>
      <description></description>
      <category>gratitude</category>
    </item>
    <item>
      <title>NodeJs and setTimeout</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Fri, 01 Apr 2022 12:57:20 +0000</pubDate>
      <link>https://dev.to/felipepaz/nodejs-and-settimeout-g16</link>
      <guid>https://dev.to/felipepaz/nodejs-and-settimeout-g16</guid>
      <description>&lt;p&gt;Everybody hello, me again here!!! =D =D =D&lt;/p&gt;

&lt;p&gt;First of all, I actually realized that sometimes I look like Master Yoda speaking English. That's weird =( =D =( =D ...&lt;/p&gt;

&lt;p&gt;Well, let's talk about what's really important.&lt;/p&gt;

&lt;p&gt;Everybody knows that even if &lt;code&gt;NodeJs&lt;/code&gt; interprets &lt;code&gt;javascript&lt;/code&gt;, a lot of &lt;code&gt;js&lt;/code&gt; functionalities don't work on the &lt;code&gt;Node&lt;/code&gt; platform once they are compiled by browser engines;&lt;/p&gt;

&lt;p&gt;Ok, ok... there's no news here!!!&lt;/p&gt;

&lt;p&gt;But last night I was playing with &lt;code&gt;Node&lt;/code&gt; and reading its documentation until I saw a package called &lt;code&gt;timers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hummmmm, interesting. What does it do?&lt;/p&gt;

&lt;p&gt;I kept my reading and noticed a function &lt;code&gt;setTimeout&lt;/code&gt;. How so? Could be the same function that runs on wer browsers?&lt;/p&gt;

&lt;p&gt;Let's check it out!!!&lt;/p&gt;

&lt;p&gt;With this info, I created a simple express server with one single &lt;em&gt;POST&lt;/em&gt; method and the body with json containing a timer key.&lt;/p&gt;

&lt;p&gt;Annnnnnd yeeeeeees, &lt;code&gt;Nodejs&lt;/code&gt; has a native &lt;code&gt;setTimeout&lt;/code&gt; and it works like it runs on web browsers.&lt;/p&gt;

&lt;p&gt;So, my example was like that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Access-Control-Allow-Origin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Access-Control-Allow-Headers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;weeeeeeeeeeeee&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my bad ...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;running&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And, our request should be like that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST localhost:3000 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"timer": 1000}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's a pretty simple example but as we can see, in the body of request we have an object with the key timer and this is the time that &lt;code&gt;express&lt;/code&gt; will take to respond the request.&lt;/p&gt;

&lt;p&gt;So, yes... we have a way to use &lt;code&gt;setTimeout&lt;/code&gt; on the &lt;code&gt;Node&lt;/code&gt; engine.&lt;/p&gt;

&lt;p&gt;Why should I use it? I don't know and it doesn't matter, I just know that it exists!!!!!!&lt;/p&gt;

&lt;p&gt;See you next chapter when I'll use this same example to work with &lt;code&gt;AbortController&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Trabalhando com Json e Go</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Fri, 25 Mar 2022 14:33:03 +0000</pubDate>
      <link>https://dev.to/felipepaz/trabalhando-com-json-e-go-2onb</link>
      <guid>https://dev.to/felipepaz/trabalhando-com-json-e-go-2onb</guid>
      <description>&lt;p&gt;Pra mim que vim do &lt;code&gt;javascript&lt;/code&gt; onde o json é algo tão "banal", entender o funcionamento com Go foi um tanto quanto diferente.&lt;/p&gt;

&lt;p&gt;O Go tem uma pegada muito grande com ponteiros e bytes, então, de primeiro momento, é meio cabuloso saber que uma variável que foi passada como parâmetro vai ter o retorno da função diretamente no local da memória em que ela foi alocada e por aí vai.&lt;/p&gt;

&lt;p&gt;Em &lt;code&gt;javascript&lt;/code&gt;, uma estrutura do tipo:&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;"campo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qualquer coisa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&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;p&gt;é entendível na hora, contudo, em Go, a coisa não é bem assim.&lt;/p&gt;

&lt;p&gt;Bora ver um exemplo prático e eu vou detalhar coisa por coisa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"encoding/json"&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"color"`&lt;/span&gt;
    &lt;span class="n"&gt;Model&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"model"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;car&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Black"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Lancer"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Marshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Explicando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;estou definindo que o conteúdo dese arquivo pertence ao pacote &lt;code&gt;main&lt;/code&gt;. Por exemplo, se eu tivesse uma estrutura&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;app
   services
       main.go
   controllers
       main.go
       users.go
   main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eu poderia dizer que &lt;code&gt;services/main.go&lt;/code&gt; pertence ao pacote &lt;code&gt;services&lt;/code&gt;, portanto, &lt;code&gt;package services&lt;/code&gt;, &lt;code&gt;controllers/main.go&lt;/code&gt; e &lt;code&gt;controllers/users.go&lt;/code&gt; ao pacote &lt;code&gt;controllers&lt;/code&gt; e por aí vai. Mas enfim, a ideia aqui é explicar json com go, outros detalhes eu vou abordar em outro capítulo. Prossigamos ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"color"`&lt;/span&gt;
    &lt;span class="n"&gt;Model&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"model"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui eu estou "definindo o meu objeto". Não sei se seria a melhor comparação, mas sabe o &lt;code&gt;Type&lt;/code&gt; do &lt;code&gt;typescript&lt;/code&gt;? Quase isso! Diferença que aqui eu consigo passar esse cara como ponteiro e trabalhar diretamente nele.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;car&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Black"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Lancer"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;//  car := Car{&lt;/span&gt;
&lt;span class="c"&gt;//    Color: "Black",&lt;/span&gt;
&lt;span class="c"&gt;//    Model: "Lancer",&lt;/span&gt;
&lt;span class="c"&gt;//  }&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui eu to dizendo: &lt;em&gt;cria a varíavel car e atribui à ela o tipo Car com os seguintes valores ...&lt;/em&gt;.&lt;br&gt;
Note que existem duas maneiras de atribuir uma struct à uma variável. Pode ser parecido como é em &lt;code&gt;javascript&lt;/code&gt;, ou passar os valores diretamente na &lt;code&gt;struct&lt;/code&gt; sem precisar inserir as chaves. Em &lt;code&gt;structs&lt;/code&gt; mais simples é até viável, mas pensa num negócio gigante passar os valores sem saber o que é o que. &lt;/p&gt;

&lt;p&gt;Ah, só uma observação: isso &lt;code&gt;:=&lt;/code&gt; é diferente de &lt;code&gt;=&lt;/code&gt;.&lt;br&gt;
No primeiro, eu estou criando a variável e reservando ela em memória, ou seja, dando vida à ela e lhe atribuindo um valor,&lt;br&gt;
enquanto que no segundo, a variável já existe em memória e eu estou reatribuindo um valor à ela. 0.o&lt;/p&gt;

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

&lt;p&gt;Aqui o bicho pega&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Marshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O go pode trazer mais de um retorno numa função. Uma espécie de tupla, por assim dizer. &lt;/p&gt;

&lt;p&gt;E também em Go, as chamadas de funções geralmente são o nome do pacote e a função. No nosso exemplo, estamos chamando do pacote &lt;code&gt;json&lt;/code&gt; a função &lt;code&gt;Marshal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;Marshal&lt;/code&gt; retorna dois resultados: um &lt;code&gt;slice&lt;/code&gt; de bytes (é praticamente um array mas sem limite como um array) e um erro. Como parâmetro, essa função espera uma variável do tipo &lt;code&gt;struct&lt;/code&gt; que no nosso caso é &lt;code&gt;car&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Logo após é feita a checagem pra garantir que não houve algum erro (lembrando que o foco aqui é json e não tratativas de erros, uso correto da linguagem nem nada).&lt;/p&gt;

&lt;p&gt;E depois, por último, convertemos aqueles bytes em uma string para ser mostrado pelo &lt;code&gt;Println&lt;/code&gt;, nosso &lt;code&gt;console.log&lt;/code&gt; do &lt;code&gt;Go&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E pah, a saída que teremos vai ser&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="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"color"&lt;/span&gt;:&lt;span class="s2"&gt;"Black"&lt;/span&gt;,&lt;span class="s2"&gt;"model"&lt;/span&gt;:&lt;span class="s2"&gt;"Lancer"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outras observações cabulosas do Go:&lt;/p&gt;

&lt;p&gt;Quando se define uma struct, as "chaves" dela, para serem lidas por qualquer função ou algo do tipo, precisam ser em letras maiúsculas. Portanto, se eu tivesse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"color"`&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"model"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a saída seria simplesmente&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="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;uma vez que os atributos dessa &lt;code&gt;struct&lt;/code&gt; não foram exportados (implicitamente escrever iniciando em letra minúscula fala pro Go que o atributo daquela struct não é para ser exportado).&lt;/p&gt;

&lt;p&gt;Mas fica estranho né, imagina uma api que esteja esperando esse objeto:&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;"color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"black"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lancer"&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;p&gt;mas estamos enviando "Color" e "Model" no body da request.&lt;/p&gt;

&lt;p&gt;Para resolver isso, colocamos aquele &lt;code&gt;json:"color"&lt;/code&gt; na frente do atributo da &lt;code&gt;struct&lt;/code&gt;. Com isso estamos dizendo para o Go: Cara, a &lt;code&gt;struct Car&lt;/code&gt; tem o atributo &lt;code&gt;Color&lt;/code&gt;, então, internamente, a gente referencia &lt;code&gt;Color&lt;/code&gt; mas externamente, ou seja, se formos enviar esse json pra fora do programa ou vamos receber esse json de algum outro lugar, ele vai ter o campo "color" e não "Color".&lt;/p&gt;

&lt;p&gt;É, isso é Go ...&lt;/p&gt;

&lt;p&gt;Essa é a primeira parte, transformando uma struct em um json. Vamos ter a segunda parte onde vamos transformar um json em uma struct.&lt;/p&gt;

&lt;p&gt;Te espero lá!!!&lt;/p&gt;

</description>
      <category>json</category>
      <category>go</category>
    </item>
    <item>
      <title>Tags HTML pouco usadas</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Wed, 01 Dec 2021 05:50:32 +0000</pubDate>
      <link>https://dev.to/felipepaz/tags-html-pouco-usadas-18ki</link>
      <guid>https://dev.to/felipepaz/tags-html-pouco-usadas-18ki</guid>
      <description>&lt;p&gt;Precisa de um autocomplete? O HTML tem!&lt;/p&gt;

&lt;p&gt;Precisa de um gauge para mostrar algum valor? O HTML tem!&lt;/p&gt;

&lt;p&gt;Precisa de um collapse sem ser bootstrap? O HTML também tem!&lt;/p&gt;

&lt;p&gt;Nesse breve resumo vou listar algumas tags que são raramente usadas ou até mesmo desconhecidas e que, na hora da construção de um blog, site ou até mesmo landing page pode ser de grande valia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Datalist
&lt;/h3&gt;

&lt;p&gt;A nossa primeira tag é  &lt;strong&gt;datalist&lt;/strong&gt;. Nada mais é do que um lista de opções que são atreladas a um input, e ao digitar, as opções são sugeridas numa espécie de autocomplete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;list=&lt;/span&gt;&lt;span class="s"&gt;"browsers"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"browser"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Browsers"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;datalist&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"browsers"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Internet Explorer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Firefox"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Chrome"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Safari"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/datalist&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Progress
&lt;/h3&gt;

&lt;p&gt;A nossa próxima tag é a &lt;strong&gt;progress&lt;/strong&gt;. Sem tempo ou habilidade para fazer uma barra de progresso estilosa? Usa a do HTML mesmo!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;progress&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/progress&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;progress&amp;gt;&amp;lt;/progress&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Meter
&lt;/h3&gt;

&lt;p&gt;Quero mostrar uma lista de habilidades e ter um &lt;strong&gt;gauge&lt;/strong&gt; bonitinho.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"meter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;HTML&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meter&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;min=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"meter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;10 de 10&lt;span class="nt"&gt;&amp;lt;/meter&amp;gt;&lt;/span&gt;


&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"meter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Javascript&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meter&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt; &lt;span class="na"&gt;min=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"meter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;8 de 10&lt;span class="nt"&gt;&amp;lt;/meter&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Details
&lt;/h3&gt;

&lt;p&gt;Preciso de um &lt;strong&gt;collapse&lt;/strong&gt; mas não quero usar Boostrap. O que eu faço? O HTML já tem isso!!! =D&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt; &lt;span class="nt"&gt;&amp;lt;details&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;Lista de linguagens&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;dt&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;dd&amp;gt;&lt;/span&gt;Javascript&lt;span class="nt"&gt;&amp;lt;/dd&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;dd&amp;gt;&lt;/span&gt;Python&lt;span class="nt"&gt;&amp;lt;/dd&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;dd&amp;gt;&lt;/span&gt;Reust&lt;span class="nt"&gt;&amp;lt;/dd&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/dt&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma coisa do details é que a tag &lt;strong&gt;summary&lt;/strong&gt; vai ser o nosso cabeçalho e todo o restante vai ser o body do &lt;strong&gt;collapse&lt;/strong&gt;. Sabe as tags &lt;strong&gt;fieldset&lt;/strong&gt; e &lt;strong&gt;legend&lt;/strong&gt;? Pois vai funcionar exatamente assim.&lt;/p&gt;

&lt;p&gt;Tem umas outras bem bacaninhas como o &lt;a href="https://www.w3schools.com/tags/tag_map.asp"&gt;map&lt;/a&gt; por exemplo.&lt;/p&gt;

&lt;p&gt;Dá uma olhada lá no &lt;a href="https://github.com/pazfelipe/htmls-pouco-usadas"&gt;repo&lt;/a&gt; que eu disponibilizei. Vai ter essas e outras bem legais também! =D&lt;/p&gt;

</description>
      <category>html</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Python e Redis: Utilizando Pub/Sub</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Tue, 19 Oct 2021 05:48:09 +0000</pubDate>
      <link>https://dev.to/felipepaz/python-e-redis-utilizando-pubsub-51fo</link>
      <guid>https://dev.to/felipepaz/python-e-redis-utilizando-pubsub-51fo</guid>
      <description>&lt;p&gt;Acredito que você já tenha ouvido falar sobre o conceito de &lt;code&gt;publisher/subscriber&lt;/code&gt;, certo? E você sabia que o Redis possui essa comunicação nativamente?&lt;/p&gt;

&lt;p&gt;De maneira muito sucinta, vou mostar um exemplo prático e simples utilizando Redis e Python usando a comunicação &lt;code&gt;publish/subscriber&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que preciso?
&lt;/h2&gt;

&lt;p&gt;Para esse exemplo são necessárias três ferramentas instaladas na sua máquina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.8 ou superior&lt;/li&gt;
&lt;li&gt;pip&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os detalhes de instalação vou pular porque esse exemplo pode ser feito em qualquer SO. Basta seguir a documentação de instalação de cada item.&lt;/p&gt;

&lt;p&gt;Por fim, uma vez instalado o pip, vamos instalar o redis (ah, para quem não sabe, o &lt;code&gt;pip&lt;/code&gt; seria o &lt;code&gt;npm&lt;/code&gt; do python) com o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O Script
&lt;/h2&gt;

&lt;p&gt;Crie um arquivo chamado &lt;code&gt;app.py&lt;/code&gt; e cole esse script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StrictRedis&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StrictRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;subscriber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;psubscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;channel_test&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_message&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%d/%m/%Y:%H:%M:%S&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - Nothing here!!!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explicando cada linha
&lt;/h2&gt;

&lt;p&gt;Importação do redis para o projeto (obviously) , importação de formatação de data da classe time e também o sleep, que vai fazer com que nosso while sofra uma pausa de 1 segundo em cada iteração.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StrictRedis&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conexão com o redis&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StrictRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Especificando que vamos nos subscrever num canal chamado &lt;code&gt;channel_test&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;subscriber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;psubscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;channel_test&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bloco while que vai ficar rodano sem parar o processo de &lt;code&gt;subscribe&lt;/code&gt;. Uma vez que seja publicada alguma mensagem no canal &lt;code&gt;channel_test&lt;/code&gt;, vai ser printado no console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_message&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%d/%m/%Y:%H:%M:%S&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - Nothing here!!!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Publicando no canal
&lt;/h2&gt;

&lt;p&gt;Redis instalado? Tá na hora de usar esse carinha.&lt;br&gt;
No terminal/prompt, rode o comando:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Se tudo tiver ocorrido bem na instalação e o redis estiver rodando, você deve estar com o shell do redis habilitado.&lt;/p&gt;

&lt;p&gt;Para publicar, basta digitar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;publish channel_test &lt;span class="s2"&gt;"um conteúdo qualquer aqui"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ah, a gente ainda não executou nosso script python. Pelo terminal, acesse o diretório de onde está nosso &lt;strong&gt;app.py&lt;/strong&gt; e execute com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resultado
&lt;/h2&gt;

&lt;p&gt;Script rodando? Redis rodando? Publish realizado? &lt;br&gt;
Pah, a mágica acontece ...&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%2Ftn0oeua25mv2cyh6mkuu.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%2Ftn0oeua25mv2cyh6mkuu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora exercite sua criatividade e implemente outras coisas bacanas usando &lt;code&gt;redis&lt;/code&gt; como &lt;code&gt;publisher/subscriber&lt;/code&gt; e seja feliz =D =D =D&lt;/p&gt;

</description>
      <category>redis</category>
      <category>python</category>
      <category>pubsub</category>
    </item>
    <item>
      <title>Dockerizando uma aplicação Node e Mongodb</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Wed, 30 Jun 2021 19:56:58 +0000</pubDate>
      <link>https://dev.to/felipepaz/dockerizando-uma-aplicacao-node-e-mongodb-1e02</link>
      <guid>https://dev.to/felipepaz/dockerizando-uma-aplicacao-node-e-mongodb-1e02</guid>
      <description>&lt;p&gt;E aí gurizada, tudo tranquilo? Muito se fala em &lt;em&gt;container&lt;/em&gt;, &lt;em&gt;docker&lt;/em&gt;, aplicação escalável e é por esses e outros motivos que eu resolvi demonstrar como poderíamos criar uma aplicação simples usando um ambiente em container com node e mongodb.&lt;/p&gt;

&lt;p&gt;A ideia aqui é mostrar os &lt;strong&gt;princípios do docker&lt;/strong&gt; de forma muito breve trazendo um pouquinho de clareza na hora de construir uma aplicação seja ela na linguagem que for.&lt;/p&gt;

&lt;p&gt;Ao final desse tutorial, vamos conseguir fazer um CRUD sem ter "nada instalado na nossa máquina", único requisito que precisamos é ter o docker instalado no computador. &lt;/p&gt;

&lt;p&gt;Instruções de instalação podem ser encontradas &lt;a href="https://docs.docker.com/engine/install/"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É preciso instalar também o &lt;em&gt;docker-compose&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Alguns pontos extremamente importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não vamos falar sobre arquitetura de projetos. "Ah, mas tua aplicação tem um index e rotas e tudo nele". O objetivo é apenas mostrar o &lt;strong&gt;DOCKER&lt;/strong&gt; em ação.&lt;/li&gt;
&lt;li&gt;Não vamos abordar como o Node funciona.&lt;/li&gt;
&lt;li&gt;Não vamos falar sobre segurança e boas práticas.&lt;/li&gt;
&lt;li&gt;Não vamos falar sobre Docker detalhadamente, como funciona, ou detalhes mais aprofundados do docker-compose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O projeto pode ser encontrado na minha página do &lt;a href="https://github.com/pazfelipe/docker-node-mongo"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dito isso, bora pra prática!!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;p&gt;O Docker é um cara que geralmente roda um Linux minimalista apenas para criar a imagem do que você precisa, ou seja, se você quiser rodar um banco MySQL, a imagem do MySQL vai conter o mínimo, do mínimo, do mínimo ... para poder rodar o banco. Diferente de uma VM onde vai precisar instalar um sistema operacional inteiro para poder rodar o banco. Mas como dito alhures, nosso intento aqui não é esplanar o Docker, deixamos para outra hora isso.&lt;/p&gt;

&lt;p&gt;Para que essa mágica aconteça, temos alguns comandos do Docker que vão brilhar no nosso terminal. &lt;/p&gt;

&lt;p&gt;No nosso exemplo, vamos baixar uma imagem do mysql e executar ela:&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mysql_container &lt;span class="nt"&gt;-p&lt;/span&gt; 3306:3306 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ALLOW_EMPTY_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;True mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e voilà, temos um banco mysql novinho em folha rodando na nossa máquina. Basicamente estamos falando o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -d&lt;/code&gt; docker, rode em background&lt;br&gt;
&lt;code&gt;--name mysql_container&lt;/code&gt; alguma coisa com o nome de mysql_container&lt;br&gt;
&lt;code&gt;-p 3306:3306&lt;/code&gt; onde que a minha porta 3306 vai ser pareada com a porta 3306 desse alguma coisa que  você vai rodar em background&lt;br&gt;
&lt;code&gt;-e MYSQL_ALLOW_EMPTY_PASSWORD=True&lt;/code&gt; e você também precisa criar essa variável de ambiente pro alguma coisa&lt;br&gt;
&lt;code&gt;mysql&lt;/code&gt; e esse alguma coisa é a imagem que vai ser baixada e executada, no caso, o mysql.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MYSQL_ALLOW_EMPTY_PASSWORD - variável de ambiente do mysql. Outra variáveis do MySQL que podem ser usadas também para docker podem ser encontradas &lt;a href="https://hub.docker.com/_/mysql"&gt;aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você usar um &lt;em&gt;mysql workbench&lt;/em&gt;, &lt;em&gt;dbeaver&lt;/em&gt; ou outro client, vai ser possível conectar no mysql rodando na porta 3306, já que a máquina host está pareando a porta 3306 da imagem que está sendo mantida pelo docker.&lt;/p&gt;

&lt;p&gt;Mas esse foi um exemplo super básico, de apenas um serviço. Aplicações profissionais podem ter vários containers se interligando e imagina rodar comandos para cada um desses containers. Diante disso, surgiu o docker-compose, que nada mais é um cara que vai "ler" um arquivo yaml e rodar os comandos que estiverem nele.&lt;/p&gt;

&lt;p&gt;Então, se fôssemos converter os comandos do terminal para um arquivo chamado &lt;em&gt;docker-compose.yaml&lt;/em&gt;, ficaria assim:&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="m"&gt;3.8&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;mysql_service&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;mysql&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;mysql_container&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306:3306"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MYSQL_ALLOW_EMPTY_PASSWORD=True"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e depois, basta rodar&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;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;se tivéssemos mais de um arquivo &lt;code&gt;yml&lt;/code&gt;, teríamos de informar para o docker-compose qual arquivo queremos executar. Por exemplo, dentro do diretório &lt;em&gt;exemplo&lt;/em&gt; temos dois arquivos:&lt;br&gt;
&lt;em&gt;docker-compose-um.yml&lt;/em&gt; e &lt;em&gt;outro_arquivo.yml&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Queremos executar o &lt;em&gt;outro_arquivo.yml&lt;/em&gt; em background, ou seja, não vamos ver os logs que vão aparecer no terminal enquanto a imagem estiver sendo constrúida.&lt;/p&gt;

&lt;p&gt;Para isso, digitamos:&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 &lt;span class="nt"&gt;-f&lt;/span&gt; outro_arquivo.yml &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E pronto, os comandos que estiverem dentro desse arquivo aí vão ser executados pelo docker-compose.&lt;/p&gt;

&lt;p&gt;Mas agora sim, sem mais delongas, bora fazer nosso mongo e node se acharem nesse mundo de containers.&lt;/p&gt;

&lt;p&gt;Nosso arquivo &lt;em&gt;docker-compose.yaml&lt;/em&gt; vai ser o seguinte:&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.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;mongo_container&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;mongo&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&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;dbdata:/data/db&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;27017:27017"&lt;/span&gt;

  &lt;span class="na"&gt;node_container&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&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_container&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&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;api_node&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./.env&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;yarn dev&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$PORT:$PORT"&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.:/source"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node_modules:/source/node_modules&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dbdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;node_modules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rodou esse maluco aí? Então já pode testar usando &lt;em&gt;curl&lt;/em&gt;, &lt;em&gt;postman&lt;/em&gt;, &lt;em&gt;insomnia&lt;/em&gt; ou qualquer outro aplicativo em &lt;code&gt;http://localhost:porta_escolhida_via_env&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E era isso. Legal né?&lt;/p&gt;

&lt;p&gt;Uma aplicação node com mongo via docker.&lt;/p&gt;

&lt;p&gt;A explicação detalhada desse arquivo aí de cima vou deixar para outro post.&lt;/p&gt;

&lt;p&gt;uhul!!!!&lt;/p&gt;

</description>
      <category>node</category>
      <category>mongodb</category>
      <category>docker</category>
    </item>
    <item>
      <title>Creating a custom Array.prototype.filter in javascript</title>
      <dc:creator>.·. Felipe Paz .·.</dc:creator>
      <pubDate>Fri, 11 Jun 2021 17:09:59 +0000</pubDate>
      <link>https://dev.to/felipepaz/creating-a-custom-array-prototype-filter-in-javascript-2nkc</link>
      <guid>https://dev.to/felipepaz/creating-a-custom-array-prototype-filter-in-javascript-2nkc</guid>
      <description>&lt;p&gt;Javascript is a prototype-based language. It means that every &lt;em&gt;native function&lt;/em&gt; can receive custom functions or having its original functions modified.&lt;/p&gt;

&lt;p&gt;In this article, we will create a custom filter function. For who doesn't know, the &lt;em&gt;filter&lt;/em&gt; function is an array prototype function that returns all elements that match against the callback passed as argument. For more information about filter you can check the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter"&gt;MDN Doc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, without further ado, let's code!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;myCustomFilter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filtered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt; &lt;span class="c1"&gt;// it will receive all values that match to condition passed in fn callback.&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;myCustomFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// using arrow function&lt;/span&gt;
&lt;span class="c1"&gt;// const filteredData = data.myCustomFilter(el =&amp;gt; el &amp;gt; 2);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filteredData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// output [3,4,5]&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Easy, no? But, what really happened here? &lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the function
&lt;/h2&gt;

&lt;p&gt;The filter function receives a callback as a parameter. You can find more info about &lt;em&gt;callback&lt;/em&gt; &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Callback_function"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here, we're saying to Array: "Hey dude, you're gonna get a new function called &lt;em&gt;myCustomFilter&lt;/em&gt; and it takes a &lt;em&gt;callback function&lt;/em&gt; as parameter".&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="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;myCustomFilter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The method filter will return all values that match to condition passed in the callback function.&lt;/p&gt;

&lt;p&gt;And here is where the magic happens:&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="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once loop has finished, a new array as result is returned containing all values matched to the condition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;myCustomFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally our output will be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filteredData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// output [3,4,5]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the original filter method, our function would become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;originalFilteredData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;originalFilteredData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// output [3,4,5]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We cannot forget to mention it that we have some concepts not covered here as the &lt;code&gt;context of this&lt;/code&gt; and &lt;code&gt;arrow functions&lt;/code&gt;. These guys will be discussed in the future.&lt;/p&gt;

&lt;p&gt;I hope you enjoy this article!!&lt;/p&gt;

&lt;p&gt;That's all, folks!!!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;trying to improve english skills too =D&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>node</category>
    </item>
  </channel>
</rss>
